Mollensoft Labs         
Specializing In Educational & Scientific Freeware as well as Intra-net Specific Servers/Clients, Custom Sensors and processing tools for Scientists (or Anyone's)  Use in the Lab.Programming Languages: Perl & Visual Basic & C#

Main 

Magnetic Field Sensor

LogZplotter

Fluxgate Mag Compass 

SqlFar Archive Tool

Reachbility King

 Intra-Net Email Server

 Anti-Spam Protocol
 
 Hall Effect Mag Sensor 

Contact 



SqlFar - The Sql-File-Archive (The Smarter Zipper Upper!) [Download Movie Here]

Download Current Version [Ver 1.0B1]



SqlFar Archive User Interface Help  

What is it? SqlFar is a new type of archiving tool allowing users to add/remove files to and from a portable SQLite database; while heavily encoding data access and other payload parameters, We call it "The Smarter Zipper Upper

Why use it? Well, its not necessarily the archive tool for everyone... SqlFar archives are encoded with self-describing access and historical data (metadata) concerning the archive's contents, history accesses and contributes to archive integrity when passed from person to person. The metadata encoding of Archive files facilitates the discovery of pertinent information from the user perspective while ensuring that the Archive contents will survive and continue to be accessible, unless otherwise specified, into the future. It's compression is not as fast and won't compress files as small as other utilities but if you need the metadata encoding features then it may be useful for you.

How do you pronounce it? It's pronounced "CeeQualFaar"

How is the information stored? each file added is a separate row in the database while access activity is logged in a separate table

What size files can be stored?  We have successfully stored a 558 MB ISO (along with a few other files) in an SqlFar... ftp'd it to another location, then extracted and installed the ISO into a virtual machine with no errors but we don't typically use it for very large files... mostly many small ones. We have encountered problems storing single files above 600 MB and we consider this our current limit, but hope to expand it significantly in the future.

Why again?  Its a really long story, bottom line is we needed a way to maintain semi-controlled access to several  (magnetic) sensor log files so Solar researcher's could review them (various versions of them of course) so the only way to ensure data integrity of many (sometimes very similar if not duplicate files) was to transfer around many MySql Database files... which is a bit awkward and required a lot of user know-how.  We also needed a better way of logging sensor data directly to portable files that are self describing, yet offer the immediate, easy to use, power of SQL queries... So we developed a tool using Perl which has served us well for a while but now a few of our younger solar researchers are not comfortable with the command line and thought we should make things easier for them.  This resulted in our first .Net application to pass around the magnetic sensor (and any other) files.  It' has actually become very handy for many tasks and hopefully will benefit the public as well despite the fact we have removed some of the security/authentication mechanisms from this version.

Why did you remove some of the Security Stuff?  Well, the implementation works well for us, but the current version's security could be subverted by an appropriately motivated cracker and we want to re-vamp the security to ensure it's less prone to subversion or unauthorized access for version 1.1 using 2 or 3 key authentication and extraction authority.

What's the Future?  We have a lot of plans for it's internal use but would like to gauge the interest from others to determine if what level of priority to levy against its development potential... I see some possibilities in SOHO organizations where (compliance) may be difficult to achieve for small-to-zero person IT shops to keep data organized and archived smartly on a shoestring budget.

Anything Else?  Yes, please check out the Movie of the SqlFar in action... it might help you decide if SqlFar is right for you.

SqlFar User Interface Help:

Below is the primary SqlFar user interface for win32 platforms, it is very intuitive and includes a minimum of functions all of which are available by using your mouse to create, open, extract files, add files, remove files from the SqlFar Archive



Below is an overview of the primary toolbar buttons and their associated functions



Adding Files

You can add files three different ways, by clicking the + button on the user interface then specify which files you wish to add. Secondly, you can drag and drop files on to the main User Interface Tab called "SqlFar Contents" Finally you can use the menu to select files you wish to add into the archive "SqlFar -> Add Files To This SqlFar".  When the add files dialog appears, you can select if the files should be compressed by Checking the "Compress Files" Checkbox.




Creating New SqlFar Archives

To create a new SqlFar Archive, you can click "Start  -> Programs -> SqlFar" to launch a new instance of the SqlFar user interface. Once the interface is loaded you can create a new Archive two different ways:
1. Click the "Sqlfar -> New SqlFar" Dialog from the menu bar, specify a destination directory and proceed to add files.
2. Click the Icon from the tool bar... Specify a destination directory and proceed to add files.

Deleting Files
Deleting Files is very intuitive, you can right-mouse click and select the "Delete Selected File(s)" menu to delete selected files from the SqlFar. Alternatively you can also delete files using the X button on the toolbar. Finally, you can query for specific files using the "Find Files" query tab and then delete the specified files using the right-mouse click context menu.




SqlFar Description Tab
The "Sqlfar Details" Tab [Below] displays important details (in a quick summary format) concerning the archive's contents and payload. This information is straight forward and easy to understand and highlights specific file variables pertinent to the currently loaded archive such as the archive's total size, numbers and types of files contained etc.



Extracting Files
It is very easy to extract Files from the SqlFar Archive, you can click the "extract" icon or right-mouse click and select "Extract Selected File(s)"... a destination directory dialog form will appear. You select the directory where you wish the files to be extracted to, then click "Ok" and the files will be extracted to that location. Note you can extract files from the "SqlFar Contents" Tab or the "Find Files" Tab of the SqlFar User Interface. This is very powerful in that you can search for specific files within an Archive to extract using standard SQL queries. (Note: your user account must have write permissions for the destination directory in order to extract the files to that location)


History Queries

Sqlfar Archives are metadata encoded to reveal and define the details of it's existence from beginning to present. This provides users with a significant amount of knowledge and power regarding the archiving of various files and information. Some users have commented that it enables their organization to maintain compliance of various, sensitive datasources while maintaining a reasonable facsimile of security and organization.
Users can query the history of Sqlfar Archives to determine what the details of use, access associated with the Archive.  At present, most of the security features have been disabled on the publicly available version until certain security measures can be implemented (sorry).  Rest assured, the future of this archive security will be restored and available for public use soon.

To query the history of a specific Sqlfar Archive, open the archive and then click the "View Archive History" tab and you can perform various history queries. Using this tab, you can quickly and efficiently review the metadata describing this archive's activity, it’s accesses and it’s history.

The Archive History is detailed and enables you to review the Archive’s metadata by querying the following fields using standard sql Syntax:

Available history fields to query:

dtg = Date Time of the local system when the action took place
action = This is the field containing the actual activity which occurred (best to query this field for specific actions)
os = This field describes the Operating System of the user when the specified action took place
platform = This field describes the platform of the user when the specified action took place
operatingsys = This field describes the operating system version number of the user when the specified action took place
pmem = This field describes the total Physical Memory on the system using the SqlFar
computername = This field describes the hostname of the computer system currently manipulating the SqlFar
screenxy = This field describes the computer’s screen dimensions (in pixels) of the computer system currently manipulating the SqlFar
username = This field describes the username of the individual currently manipulating the SqlFar

You can query these fields using standard SQL (Search Query Language) database syntax with one exception. You do not need to specify the initial portion of the SQL query as it is provided for you.
For Example, if you wanted to show all of the instances where any user has Added a File you could use the Following Query:

action like ‘Adding%’

The query above searches the currently loaded SqlFar for any "action" entry that contains the term "Adding" with any other text following.

The Following Examples Are Provided to help you perform simple Queries:

Find All instances of the SqlFar Being Loaded, Perhaps to see all of the Usernames:

action like ‘Loaded%’

Find All instances of Files Being Deleted, Perhaps to see all of the Usernames performing the deletion:

action like ‘Loaded%’

Find All instances of Files Being Added, perhaps to see all of the Usernames performing the additions:

Action like ‘Adding%’

You can Also perform date-time based queries, for example you are trying to determine all the files added on 5 May 2007:

dtg like '5/5/2007%'

You can also perform username based queries, for example you are trying to determine which files where added by the user "Administrator" on the Computer System named "DRAGON-MOBILE"

computername like 'DRAGON-MOBILE' and username like 'Administrator'

you can combine these queries to find very detailed information regarding the activity associated with a particular SqlFar using these powerful queries!
You can Also Re-Use, Insert, Delete and Save Your Queries, Reload them as you desire by using the "History" Dialog (Below)



These Historical Query items are automatically saved to file, in your username's "My Documents" Directory called "history.xml" and you can optionally load or save to another location as many users have found it useful to have various history files available for use when querying differing types of SqlFar Archives.


Known Issues/Challenges:

This page describes the primary, known errors and limitations with Publicly available, .Net version of the SqlFar Archiving user interface using the current version (in order by version). These errors do NOT pertain to the original Perl, Command Line version which can be operated on more than one platform.

Challenges:
.Net Default Compression (Gzip) does not reliably compress very small files, so if the crc fails during compression of these files, it will be annotated in the history table and add the file in it's original form.

.Net Default Compression (Gzip) does not create highly-compressed files when compared to other compression types (this is not a big factor for us but may become an issue in the future).

Major BugFixes:

SqlFar UI 1.0.0B - fixed drag drop target on main form listview - Fixed 7 April 2007
SqlFar UI 0.7.4 - excessive memory use when adding files to large SqlFar - Fixed 11 March 2007
SqlFar UI 0.6.3 - user request to save query history as xml file to user specified directory - Added feature 1 March 2007
SqlFar UI 0.6.1 - previously zipped binary file extraction on Linux Kernel 2.6 results in bad crc - Fixed 11 FEB 2007
SqlFar UI 0.3.7 - Open New SqlFar Does not clear history table event data from UI - Fixed 16 JAN 2007
SqlFar UI 0.3.5 - User can add more files that the .NET Open File Dialog can support - Still Not Really Resolved
SqlFar UI 0.1.1 - Compression does not work reliably on very small files - Fixed 22 DEC 2006
SqlFar UI 0.1.1 - Compression does not work reliably - Fixed 4 DEC 2006

If you are having a problem or have a feature you would like added, please contact me

Opening SqlFar Archives

Opening SqlFar Archives is equally intuitive as you can double-mouse click any *.sfr file and it should open within the Sqlfar user interface. After loading you can add, delete or extract files from the Archive as described above.
If the Sqlfar user interface is already loaded, you can load another Sqlfar by clicking the button on the toolbar or by selecting "SqlFar -> Open SqlFar" from the main menu.


System Requirements
  • This SqlFar user interface requires Windows Vista, Windows XP,  or Windows 2000 Operating Systems
  • You must have the Microsoft .NET Runtime Version 2.0 installed to run this application
  • It is also recommended your computer has at least 512 MB of Physical Memory to use this application, and 1 GB if you will be processing very large files on a frequent basis

Viewing Files Contained Within The Archive

You can view files two different ways, first you can see an Archive's contents by viewing the main window (above) or if you are looking for files contained within the archive you can use the "Find Files" capability to query your SqlFar using the metadata encoding present within the archive itself.  

Quick Archive History Help:

Using this tool you can quickly and efficiently review the metadata describing this archive's activity, it’s accesses and it’s history.

The Archive History is detailed and enables you to review the Archive’s metadata by querying the following fields using standard sql Syntax:

Available Fields to Query:

dtg = Date Time of the local system when the action took place
action = This is the field containing the actual activity which occurred
os = This field describes the Operating System of the user when the specified action took place
platform = This field describes the platform of the user when the specified action took place
operatingsys = This field describes the version number of the operating system of the user when the specified action took place
pmem = This field describes the total Physical Memory on the system using the SqlFar
computername = This field describes the hostname of the computer system currently manipulating the SqlFar
screenxy = This field describes the computer’s screen dimensions (in pixels) of the computer system currently manipulating the SqlFar
username = This field describes the username of the individual currently manipulating the SqlFar

You can query these fields using standard SQL (Search Query Language) database syntax with one exception. You do not need to specify the initial portion of the SQL query as it is provided for you.

For Example, if you wanted to show all of the instances where any user has Added a File you could use the Following Query:

action like ‘Adding%’

The query above searches the currently loaded SqlFar for any "action" entry that contains the term "Adding" with any other text following.

The Following Examples Are Provided to help you perform simple Queries:

Find All instances of the SqlFar Being Loaded, Perhaps to see all of the Usernames:

action like ‘Loaded%’

Find All instances of Files Being Deleted, Perhaps to see all of the Usernames performing the deletion:
The metadata encoding of Archive files facilitates the discovery of pertinent information from the user perspective while ensuring that the Archive contents will survive and continue to be accessible, until otherwise specified, into the future.

action like ‘Loaded%’

Find All instances of Files Being Added, perhaps to see all of the Usernames performing the additions:

Action like ‘Adding%’

You can Also perform date-time based queries, for example you are trying to determine all the files added on 5 May 2007:

dtg like '5/5/2007%'

You can also perform username based queries, for example you are trying to determine which files where added by the user "Administrator" on the Computer System named "DRAGON-MOBILE"

computername like 'DRAGON-MOBILE' and username like 'Administrator'

you can combine these queries to find very detailed information regarding the activity associated with a particular SqlFar using these powerful queries!
You can Also Re-Use, Insert, Delete and Save Your Queries, Reload them as you desire by using the "History" dialog Form Found on this Application Dialog



The Archive File Content is detailed and enables you to review the Archive’s content by querying the following fields using standard SQL Syntax:
Available Fields to Query during a File Query:

uid = this is the ID of the File Entry, the uid is auto-incremented based on the time the insertion took place
fname = this is the short file name, that is the file name without the original directory path
is_compressed = this is a Boolean entry describing if the inserted file payload was compressed when added
is_encrypted = this is a Boolean entry describing if the inserted file payload was encrypted when added
is_ro = this is a Boolean entry describing if the file inserted should be read only (set by a secret key by the originator)
ro_key = this is the SHA2 hash Key that prohibits writing to this payload entry (must match = true to modify|delete)
size = this is the number of bytes the original file consumed on the host operating system’s disk drive
zip_size = this is the number of bytes the gzipped compressed file consumed on the host operating system’s disk drive
atime = this is the Access time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
ctime = this is the Creation time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
mtime = this is the last Modified time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
verify = this is the verification key used by SqlFar to perform internal operations
ver_hash = this is an MD5 hash used by SqlFar to perform internal operations
usern = this is the username of the current SqlFar Operator
groupn = this is the group of the current user, using the current SqlFar
env = this is an optional KEY->VALUE hashtable  describing anything the creator wishes to add to this specific SqlFar
hostname = this is the hostname of the current computer manipulating the current SqlFar
osver = this is the Operating System description of the computer manipulating the current SqlFar
orig_dir = this is the Original Directory (folder) where the currently described file originated from
out_dir = this is the pre-destined ouput directory for Self Extracting SqlFars within a Secure Environment
payload = this is the null terminated (binary)  file itself

You can query these fields using standard SQL (Search Query Language) database syntax with one exception. You do not need to specify the initial portion of the SQL query as it is provided for you.
For Example, if you wanted to show all of the instances where the filename contains the character "d" and is compressed:

fname like '%d%' and is_compressed like ‘True’

The Following Examples Are Provided to help you perform simple Queries:

Find All instances files where the access time was 5 May 2007, Perhaps to see all of the Usernames:

atime like '5/5/2007%'

Find All instances of UnCompressed Files:

is_compressed like 'False'

Find All instances of Compressed Files:

is_compressed like 'True'

You can also perform username and computername based queries:

Hostname  like 'DRAGON-MOBILE' and usern like 'Administrator'

you can combine these queries to find very detailed information regarding the file contents associated with a particular SqlFar using these powerful queries!
You can Also Re-Use, Insert, Delete and Save Your Queries, Reload them as you desire by using the Red "History" dialog button found on this Application Dialog


Thank You!
This application and the utility it provides could not exist without the ADO.NET 2.0 SQLite data Provider, therefore I would like to extend Special thanks to:

ADO.NET 2.0 SQLite Data Provider
Version 1.0.40.0 January 31, 2007
Using SQLite 3.3.12
Written by Robert Simpson ([email protected])
Released to the public domain, use at your own risk!
Official provider website:  http://sqlite.phxsoftware.com

SqlFar User Interface Error Codes (per the Sqlfar Archive Specification)

If you experience errors while using the SqlFar User Interface, please notify me  and let us know which code you noticed and what you where doing when you noticed the error.

Many of the SqlFar errors are not fatal, they represent notification of features that have yet to be implemented completely, such as Sfar tracking, encryption, SHA2 key creation/key resolution

Error 7001 - Cant Load History
Error 7002 - Cant Hide Myself
Error 7003 - Error Opening File Dialog
Error 7004 - Cant Load History XML File
Error 7005 - Can't Load The Query History, While Displaying XML Nodes
Error 7006 - Target Class Saving ERROR While Trying to Save XML File:
Error 7007 - ERROR While Trying to Flush History to XML File (File Exists)
Error 7008 - ERROR While Trying to Flush History to XML File (File Does Not Exist)
Error 6001 - Error Opening Add New Files Dialog
Error 6002 - Error Specifying Compression
Error 6003 - Error While Closing Myself
Error 5001 - Error During Drag Enter
Error 5002 - Error Processing Dropped Files
Error 5003 - Error While Closing During Drop Session
Error 5004 - Error Trying To Insert New Files Into Sqlfar
Error 5005 - Error Launching Terramagnetoscope Website
Error 5006 - Error Loading The Application About Box
Error 4001 - Error While Creating New SqlFar Object
Error 1001 - Error While Trying To Flush The Query History
Error 1002 - Error While Loading The Main Form
Error 1003 - Aggregate Error During SqlFar Creation
Error 1004 - Create Table ERROR While Creating Attributes
Error 1005 - Create Table ERROR While Creating History Table
Error 1006 - Initial Insert Error
Error 1007 - Aggregate Error During SqlFar Creation From Toolbar
Error 1008 - Error Creating Attributes From Toolbar
Error 1009 - Error Creating History From Toolbar
Error 1010 - Error Performing Initial Insert From Toolbar
Error 1011 - Cannot Add Files Error
Error 1012 - Aggregate Insert Files Error
Error 1013 - Error Adding File Uncompressed
Error 1014 - Error Adding File Uncompressed When Compression Failed
Error 1015 - Error Adding File Compressed
Error 1016 - Error While Updating The User Interface
Error 1017 - Error While Extracting Files
Error 1018 - Error While Extracting Files From Tool Strip
Error 1019 - Error While Opening The File Dialog
Error 1020 - Error During Initialization
Error 1021 - Error During SqlFar Initialization
Error 1022 - Error Displaying SqlFar Initialization
Error 1023 - Error While Updating History
Error 1024 - Error Fetching Quick History
Error 1025 - Error During Deletion
Error 1026 - Error During ToolStrip Deletion
Error 1027 - Error During DragDrop Reception
Error 1028 - Error During DragDrop Entry
Error 1029 - Error Showing History Object
Error 1030 - Error Inserting File Query History
Error 1031 - Error Inserting File History Query String
Error 1032 - Error Fetching History Table
Error 1033 - Error Clearing User Interface
Error 1034 - Error Trying To Add Files To SqlFar
Error 1035 - Error Trying Delete Files From SqlFar
Error 1036 - Error Trying Extract Files From SqlFar
Error 1037 - Error Show the History User Interface
Error 1038 - Error Extracting Files
Error 1039 - Error During Toolstrip Deletion Of Files
Error 1040 - Error Refreshing SqlFar Content

This document describes the concepts and way ahead (if there is one) for the SqlFar Archiving Tool

Metadata is ordered information that describes, elucidates, locates, or enhances data retrieval, use of data sets, or management of an information resource based on associated, structured object definition(s).

The metadata encoding of Archive files facilitates the discovery of pertinent information from the user perspective while ensuring that the Archive contents will survive and continue to be accessible, until otherwise specified, into the future.

The SqlFar is a new type of archiving schema that this user interface facilitates user access and ability to add/remove files to and from a portable SQLite database; while encoding/recording data access and other payload parameters.
Metadata encoding is critical to ensuring data integrity and providing a great timeline of access activity.

While much of the security and authentication access mechanisms have been disabled in the public version, we hope to have it back in place, fully implemented soon. In the interim, this should not deter individuals from using the SqlFar Interface and Archive specification as it is robust and stable in its current form.

The SqlFar Archive Schema Ver 1.1.0 is under development currently, until it is available... please read about the initial, currently implemented schema below.

SqlFar Archive Schema Ver 1.0.0
 
The SqlFar Archive is created by creating a blank Sqlite V3 database file and then  inserting 3 tables into it.

table "attributes"
pass_auth - Password authorization (is access to this archive password authenticated? YES|NO)
password - Password (Key 2 for accessing payload content)
creator - Identification of the archive's creator, can be Md5 hash or other serializable identification string (or just a person's name)
creator_sig - Creator public signature (Key 1 for accessing payload content)
org - An organization identification (Could be office, branch, etc)
classy - This Archive's classification ("Personal", "Proprietary", or more heirichial, structured classification)
destry_when - Date when this archive is eligible for destruction
history - Archive proper use instructions, intent of use, any disclaimers or legal statements

table "history"
dtg = Date Time of the local system when the action took place
action = This is the field containing the actual activity which occurred (add|accessed|loaded|extract|peek|created|queried|deleted|other)
os = This field describes the Operating System of the user when the specified action took place
platform = This field describes the platform of the user when the specified action took place
operatingsys = This field describes the operating system version number of the user when the specified action took place
pmem = This field describes the total Physical Memory on the system using the SqlFar
computername = This field describes the hostname of the computer system currently manipulating the SqlFar
screenxy = This field describes the computer’s screen dimensions (in pixels) of the computer system currently manipulating the SqlFar
username = This field describes the username of the individual currently manipulating the SqlFar

table "htoc"
uid = this is the ID of the File Entry, the uid is auto-incremented based on the time the insertion took place
fname = this is the short file name, that is the file name without the original directory path
is_compressed = this is a Boolean entry describing if the inserted file payload was compressed when added
is_encrypted = this is a Boolean entry describing if the inserted file payload was encrypted when added
is_ro = this is a Boolean entry describing if the file inserted should be read only (set by a secret key by the originator)
ro_key = this is the MD5 | SHA2 (any) hash Key for this row (only) that prohibits writing to this payload entry (must match = true to modify|delete) Blanket read only access can be prohibited by attributes table
size = this is the number of bytes the original file consumed on the host operating system’s disk drive
zip_size = this is the number of bytes the gzipped compressed file consumed on the host operating system’s disk drive
atime = this is the Access time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
ctime = this is the Creation time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
mtime = this is the last Modified time as recorded by the host operating system’s disk drive prior to being inserted into the SqlFar
verify = this is the verification key used by SqlFar to preform internal operations
ver_hash = this is an MD5 hash used by SqlFar to perform internal operations
usern = this is the username of the current SqlFar Operator
groupn = this is the group of the current user, using the current SqlFar
env = this is an optional KEY->VALUE hashtable describing anything the creator wishes to add to this specific SqlFar it should NOT be encrypted by default
hostname = this is the hostname of the current computer manipulating the current SqlFar
osver = this is the Operating System description of the computer manipulating the current SqlFar
orig_dir = this is the Original Directory (folder) where the currently described file originated from
out_dir = this is the pre-destined ouput directory for Self Extracting SqlFars within a Secure Environment
payload = this is the null terminated (binary)  file itself

After the file is created, all accesses should be added to the history table as an action (add|accessed|loaded|extract|peek|created|queried|deleted|other). Removal or modification of the history entries can be prevented by requiring 2 key authentication prior to retrieving/decrypting enciphered history tables.The same retrieval process is required for secure access to each row payload which optionally is decrypted with a separate, centrally located key.

Version 1.1
1. Re-implement the sensor-to-SqlFar direct logging function
2. Future Transport should include Corporate/Enterprise style SqlFar Servers and should allowing individuals to share, upload  archives in a centralized location for common types (sensor log files, collaboration information)
3. Virus extraction protection should be implemented in version 1.1 using available examination means during CRC verification. This will re-enable the file-peek function allowing temporary extraction of files for temporal viewing
4. Re-implement two key, shared key read-only/authentication schema
5. Middleware interface development allowing users to create a SqlFar Archive's for 'connecting' to datastores (such as outlook or webmail) enabling portable data storage archives important, not-so-portable software applications. This will enable individuals to access their information stores on a variety of platforms regardless of application interface (i.e thumbdrive or other portable storage) 

Click Here To Download a Movie of the SqlFar In Action... This was taken using VMWARE Workstation 5.5 which I find to be an INVALUABLE tool.  You can normally see the video fine if you are viewing with Windows media player but if not, you may need to download the Video Codec (For Free From VMWARE Folks HERE).




Copyright © 2006-2007 by Mark Mollenkopf,  All rights reserved.
Copyright © 2000-2008 [Mark Mollenkopf]