Index: /release-kits/shared/search4j/compile.bat
===================================================================
--- /release-kits/shared/search4j/compile.bat	(revision 15093)
+++ /release-kits/shared/search4j/compile.bat	(revision 15093)
@@ -0,0 +1,2 @@
+cl /c -GX search4j.cpp 
+link advapi32.lib search4j.obj /out:search4j.exe 
Index: /release-kits/shared/search4j/head_src/LICENSE.txt
===================================================================
--- /release-kits/shared/search4j/head_src/LICENSE.txt	(revision 15093)
+++ /release-kits/shared/search4j/head_src/LICENSE.txt	(revision 15093)
@@ -0,0 +1,513 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /release-kits/shared/search4j/head_src/consolehead/Makefile.win
===================================================================
--- /release-kits/shared/search4j/head_src/consolehead/Makefile.win	(revision 15093)
+++ /release-kits/shared/search4j/head_src/consolehead/Makefile.win	(revision 15093)
@@ -0,0 +1,33 @@
+# Project: consolehead
+# Makefile created by Dev-C++ 4.9.9.2
+
+CPP  = g++.exe
+CC   = gcc.exe
+WINDRES = windres.exe
+RES  = 
+OBJ  = consolehead.o ../head.o $(RES)
+LINKOBJ  = consolehead.o ../head.o $(RES)
+LIBS =  -L"C:/Dev-Cpp/lib" -n  -s 
+INCS =  -I"C:/Dev-Cpp/include" 
+CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
+BIN  = consolehead.exe
+CXXFLAGS = $(CXXINCS)   -fexpensive-optimizations -O3
+CFLAGS = $(INCS)   -fexpensive-optimizations -O3
+RM = rm -f
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before consolehead.exe all-after
+
+
+clean: clean-custom
+	${RM} $(OBJ) $(BIN)
+
+$(BIN): $(OBJ)
+	$(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS)
+
+consolehead.o: consolehead.c
+	$(CC) -c consolehead.c -o consolehead.o $(CFLAGS)
+
+../head.o: ../head.c
+	$(CC) -c ../head.c -o ../head.o $(CFLAGS)
Index: /release-kits/shared/search4j/head_src/consolehead/consolehead.c
===================================================================
--- /release-kits/shared/search4j/head_src/consolehead/consolehead.c	(revision 15093)
+++ /release-kits/shared/search4j/head_src/consolehead/consolehead.c	(revision 15093)
@@ -0,0 +1,77 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "../resource.h"
+#include "../head.h"
+
+int main(int argc, char* argv[])
+{
+	
+	//added by oran - to store the value of the 'subcommand' to be run
+	char subcom[8] = "run";
+
+    setConsoleFlag();
+	HMODULE hLibrary = NULL;
+	char cmdLine[BIG_STR] = {0};
+    int i; // causes error: 'for' loop initial declaration used outside C99 mode.
+	for (i = 1; i < argc; i++) {
+        BOOL quote = strchr(argv[i], ' ') != NULL;
+        if (quote) {
+           strcat(cmdLine, "\"");
+        }
+		strcat(cmdLine, argv[i]);
+        if (quote) {
+           strcat(cmdLine, "\"");
+        }
+		
+		if ( _stricmp(argv[i], "-find") == 0 ) {
+			strcpy( subcom, "find" );
+		} else if (	_stricmp(argv[i], "-compare") == 0 ) {
+			strcpy( subcom, "compare" );
+		}
+		
+		if (i < argc - 1) {
+			strcat(cmdLine, " ");
+		}
+	}
+		
+	if (!prepare(hLibrary, cmdLine, subcom)) {
+		if (hLibrary != NULL) {
+			FreeLibrary(hLibrary);
+		}
+		return 1;
+	}
+	FreeLibrary(hLibrary);
+	int result = (int) execute(TRUE);
+	if (result == -1) {
+		char errMsg[BIG_STR];
+        strcpy(errMsg, "could not start the application: ");
+		strcat(errMsg, strerror(errno));
+		msgBox(errMsg);
+		return 1;
+	} else {
+		return result;
+	}
+}
Index: /release-kits/shared/search4j/head_src/consolehead/consolehead.dev
===================================================================
--- /release-kits/shared/search4j/head_src/consolehead/consolehead.dev	(revision 15093)
+++ /release-kits/shared/search4j/head_src/consolehead/consolehead.dev	(revision 15093)
@@ -0,0 +1,108 @@
+[Project]
+FileName=consolehead.dev
+Name=consolehead
+UnitCount=4
+Type=1
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=-n_@@_
+IsCpp=0
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=0
+OverrideOutputName=consolehead.exe
+HostApplication=
+Folders=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000000001001000000100
+
+[Unit1]
+FileName=consolehead.c
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit2]
+FileName=..\resource.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=..\head.c
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit4]
+FileName=..\head.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=..\head.rc
+Folder=consolehead
+Compile=1
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit6]
+FileName=..\resid.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
Index: /release-kits/shared/search4j/head_src/guihead/Makefile.win
===================================================================
--- /release-kits/shared/search4j/head_src/guihead/Makefile.win	(revision 15093)
+++ /release-kits/shared/search4j/head_src/guihead/Makefile.win	(revision 15093)
@@ -0,0 +1,33 @@
+# Project: guihead
+# Makefile created by Dev-C++ 4.9.9.2
+
+CPP  = g++.exe
+CC   = gcc.exe
+WINDRES = windres.exe
+RES  = 
+OBJ  = guihead.o ../head.o $(RES)
+LINKOBJ  = guihead.o ../head.o $(RES)
+LIBS =  -L"C:/Dev-Cpp/lib" -mwindows -n  -s 
+INCS =  -I"C:/Dev-Cpp/include" 
+CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
+BIN  = guihead.exe
+CXXFLAGS = $(CXXINCS)   -fexpensive-optimizations -O3
+CFLAGS = $(INCS)   -fexpensive-optimizations -O3
+RM = rm -f
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before guihead.exe all-after
+
+
+clean: clean-custom
+	${RM} $(OBJ) $(BIN)
+
+$(BIN): $(OBJ)
+	$(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS)
+
+guihead.o: guihead.c
+	$(CC) -c guihead.c -o guihead.o $(CFLAGS)
+
+../head.o: ../head.c
+	$(CC) -c ../head.c -o ../head.o $(CFLAGS)
Index: /release-kits/shared/search4j/head_src/guihead/guihead.c
===================================================================
--- /release-kits/shared/search4j/head_src/guihead/guihead.c	(revision 15093)
+++ /release-kits/shared/search4j/head_src/guihead/guihead.c	(revision 15093)
@@ -0,0 +1,159 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "../resource.h"
+#include "../head.h"
+#include "guihead.h"
+
+extern PROCESS_INFORMATION pi;
+
+HWND hWnd;
+DWORD dwExitCode = 0;
+BOOL stayAlive = FALSE;
+BOOL splash = FALSE;
+BOOL splashTimeoutErr;
+BOOL waitForWindow;
+int splashTimeout;		// tick count (s)
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPSTR     lpCmdLine,
+                     int       nCmdShow) {
+	
+	HMODULE hLibrary = NULL;
+	if (!prepare(hLibrary, lpCmdLine, "run")) {
+		if (hLibrary != NULL) {
+			FreeLibrary(hLibrary);
+		}
+		return 1;
+	}
+
+	splash = loadBoolString(hLibrary, SHOW_SPLASH);
+	stayAlive = loadBoolString(hLibrary, GUI_HEADER_STAYS_ALIVE);
+	if (splash || stayAlive) {
+		hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "",
+				WS_POPUP | SS_BITMAP,
+				0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
+		if (splash) {
+			char timeout[10] = {0};
+			if (!loadString(hLibrary, SPLASH_TIMEOUT, timeout)) {
+				msgBox("Cannot load splash timeout property.");
+				return 1;
+			}
+			splashTimeout = atoi(timeout);
+			if (splashTimeout <= 0 || splashTimeout > 60 * 15 /* 15 minutes */) {
+				msgBox("Invalid splash timeout property.");
+				return 1;
+			}
+			splashTimeoutErr = loadBoolString(hLibrary, SPLASH_TIMEOUT_ERR);
+			waitForWindow = loadBoolString(hLibrary, SPLASH_WAITS_FOR_WINDOW);
+			HANDLE hImage = LoadImage(hInstance,	// handle of the instance containing the image
+					MAKEINTRESOURCE(SPLASH_BITMAP),	// name or identifier of image
+					IMAGE_BITMAP,					// type of image
+					0,								// desired width
+					0,								// desired height
+					LR_DEFAULTSIZE);
+			if (hImage == NULL) {
+				msgBox("Cannot load splash screen.");
+				return 1;
+			}
+			SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage);
+			RECT rect;
+			GetWindowRect(hWnd, &rect);
+			int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2;
+			int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2;
+			SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);
+			ShowWindow(hWnd, nCmdShow);
+			UpdateWindow (hWnd);
+		}
+		if (!SetTimer (hWnd, ID_TIMER, 1000 /* 1s */, TimerProc)) {
+			return 1;
+		}
+	}
+	FreeLibrary(hLibrary);
+	if (execute(FALSE) == -1) {
+		char errMsg[BIG_STR];
+        strcpy(errMsg, "Error occured while starting the application...\n");
+		strcat(errMsg, strerror(errno));
+		msgBox(errMsg);
+		return 1;
+	}
+	if (!(splash || stayAlive)) {
+		closeHandles();
+		return 0;
+	}
+	MSG msg;
+	while (GetMessage(&msg, NULL, 0, 0)) {
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+	closeHandles();
+	return dwExitCode;
+}
+
+BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) {
+	DWORD processId;
+	GetWindowThreadProcessId(hwnd, &processId);
+	if (pi.dwProcessId == processId) {
+		LONG styles = GetWindowLong(hwnd, GWL_STYLE);
+		if ((styles & WS_VISIBLE) != 0) {
+			splash = FALSE;
+			ShowWindow(hWnd, SW_HIDE);
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
+VOID CALLBACK TimerProc(
+	HWND hwnd,			// handle of window for timer messages
+	UINT uMsg,			// WM_TIMER message
+	UINT idEvent,		// timer identifier
+	DWORD dwTime) {		// current system time
+	
+	if (splash) {
+		if (splashTimeout == 0) {
+			splash = FALSE;
+			ShowWindow(hWnd, SW_HIDE);
+			if (waitForWindow && splashTimeoutErr) {
+				KillTimer(hwnd, ID_TIMER);
+				msgBox("Could not start the application, operation timed out.");
+				PostQuitMessage(0);
+			}
+		} else {
+			splashTimeout--;
+			if (waitForWindow) {
+				EnumWindows(enumwndfn, 0);
+			}
+		}
+	}
+	GetExitCodeProcess(pi.hProcess, &dwExitCode);
+	if (dwExitCode != STILL_ACTIVE
+			|| !(splash || stayAlive)) {
+		KillTimer(hWnd, ID_TIMER);
+		PostQuitMessage(0);	
+		return;
+	}
+}
Index: /release-kits/shared/search4j/head_src/guihead/guihead.dev
===================================================================
--- /release-kits/shared/search4j/head_src/guihead/guihead.dev	(revision 15093)
+++ /release-kits/shared/search4j/head_src/guihead/guihead.dev	(revision 15093)
@@ -0,0 +1,119 @@
+[Project]
+FileName=guihead.dev
+Name=guihead
+UnitCount=5
+Type=0
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=-n_@@_
+IsCpp=0
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=0
+OverrideOutputName=guihead.exe
+HostApplication=
+Folders=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000000001001000000100
+
+[Unit1]
+FileName=guihead.c
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit2]
+FileName=guihead.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit4]
+FileName=..\head.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit6]
+FileName=..\resource.h
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+CompileCpp=0
+
+[Unit7]
+FileName=..\resid.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=..\head.c
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=..\resource.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
Index: /release-kits/shared/search4j/head_src/guihead/guihead.h
===================================================================
--- /release-kits/shared/search4j/head_src/guihead/guihead.h	(revision 15093)
+++ /release-kits/shared/search4j/head_src/guihead/guihead.h	(revision 15093)
@@ -0,0 +1,33 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#define ID_TIMER 1
+
+VOID CALLBACK TimerProc(
+  HWND hwnd,     // handle of window for timer messages
+  UINT uMsg,     // WM_TIMER message
+  UINT idEvent,  // timer identifier
+  DWORD dwTime   // current system time
+);
Index: /release-kits/shared/search4j/head_src/head.c
===================================================================
--- /release-kits/shared/search4j/head_src/head.c	(revision 15093)
+++ /release-kits/shared/search4j/head_src/head.c	(revision 15093)
@@ -0,0 +1,500 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "resource.h"
+#include "head.h"
+
+BOOL debug = FALSE;
+BOOL console = FALSE;
+int foundJava = NO_JAVA_FOUND;
+
+struct _stat statBuf;
+PROCESS_INFORMATION pi;
+
+char errTitle[STR] = "Launch4j";
+char javaMinVer[STR] = {0};
+char javaMaxVer[STR] = {0};
+char foundJavaVer[STR] = {0};
+
+char workingDir[_MAX_PATH] = {0};
+char javaHome[_MAX_PATH] = {0};
+char cmd[_MAX_PATH] = {0};
+char args[MAX_ARGS] = {0};
+
+//added by oran - whether to run the jar, print out java home, or compare java version strings
+char subcommand[8] = "run"; //can be "run", "find", "compare" - run means behave like unhacked launch4j
+
+void setConsoleFlag() {
+     console = TRUE;
+}
+
+void titledMsgBox(const char* title, const char* text) {
+    if (console) {
+        printf("%s: %s\n", title, text);
+    } else {
+    	MessageBox(NULL, text, title, MB_OK);
+    }
+}
+
+void msgBox(const char* text) {
+    titledMsgBox(errTitle, text);
+}
+
+void showJavaWebPage() {
+	ShellExecute(NULL, "open", "http://java.com/download", NULL, NULL, SW_SHOWNORMAL);
+}
+
+BOOL loadString(HMODULE hLibrary, int resID, char* buffer) {
+	HRSRC hResource;
+	HGLOBAL hResourceLoaded;
+	LPBYTE lpBuffer;
+
+	hResource = FindResourceEx(hLibrary, RT_RCDATA, MAKEINTRESOURCE(resID),
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));
+	if (NULL != hResource) {
+		hResourceLoaded = LoadResource(hLibrary, hResource);
+		if (NULL != hResourceLoaded) {
+			lpBuffer = (LPBYTE) LockResource(hResourceLoaded);            
+			if (NULL != lpBuffer) {     
+				int x = 0;
+				do {
+					buffer[x] = (char) lpBuffer[x];
+				} while (buffer[x++] != 0);
+				return TRUE;
+			}
+		}    
+	}
+	return FALSE;
+}
+
+BOOL loadBoolString(HMODULE hLibrary, int resID) {
+	char boolStr[10] = {0};
+	loadString(hLibrary, resID, boolStr);
+	return strcmp(boolStr, TRUE_STR) == 0;
+}
+
+void regSearch(HKEY hKey, const char* keyName, int searchType) {
+	DWORD x = 0;
+	unsigned long size = BIG_STR;
+	FILETIME time;
+	char buffer[BIG_STR] = {0};
+	while (RegEnumKeyEx(
+				hKey,			// handle to key to enumerate
+				x++,			// index of subkey to enumerate
+				buffer,			// address of buffer for subkey name
+				&size,			// address for size of subkey buffer
+				NULL,			// reserved
+				NULL,			// address of buffer for class string
+				NULL,			// address for size of class buffer
+				&time) == ERROR_SUCCESS) {
+		if (strcmp(buffer, javaMinVer) >= 0
+				&& (javaMaxVer[0] == 0 || strcmp(buffer, javaMaxVer) <= 0)
+				&& strcmp(buffer, foundJavaVer) > 0) {
+			strcpy(foundJavaVer, buffer);
+			foundJava = searchType;
+		}
+		size = BIG_STR;
+	}
+}
+
+BOOL findJavaHome(char* path) {
+	HKEY hKey;
+	const char jre[] = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
+	const char sdk[] = "SOFTWARE\\JavaSoft\\Java Development Kit";
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(jre),
+			0,
+            KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+			&hKey) == ERROR_SUCCESS) {
+		regSearch(hKey, jre, FOUND_JRE);
+		RegCloseKey(hKey);
+	}
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(sdk),
+			0,
+            KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+			&hKey) == ERROR_SUCCESS) {
+		regSearch(hKey, sdk, FOUND_SDK);
+		RegCloseKey(hKey);
+	}
+	if (foundJava != NO_JAVA_FOUND) {
+		char keyBuffer[BIG_STR];
+		unsigned long datatype;
+		unsigned long bufferlength = BIG_STR;
+		if (foundJava == FOUND_JRE)	{
+			strcpy(keyBuffer, jre);
+		} else {
+			strcpy(keyBuffer, sdk);
+		}
+		strcat(keyBuffer, "\\");
+		strcat(keyBuffer, foundJavaVer);
+		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(keyBuffer),
+			0,
+            KEY_QUERY_VALUE,
+			&hKey) == ERROR_SUCCESS) {
+			unsigned char buffer[BIG_STR] = {0};
+			if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, &bufferlength)
+					== ERROR_SUCCESS) {
+				int i = 0;
+				do {
+					path[i] = buffer[i];
+				} while (path[i++] != 0);
+				if (foundJava == FOUND_SDK) {
+					strcat(path, "\\jre");
+				}
+				RegCloseKey(hKey);
+				return TRUE;
+			}
+			RegCloseKey(hKey);
+		}
+	}
+	return FALSE;
+}
+
+/*
+ * Extract the executable name, returns path length.
+ */
+int getExePath(char* exePath) {
+	HMODULE hModule = GetModuleHandle(NULL);
+    if (hModule == 0
+			|| GetModuleFileName(hModule, exePath, _MAX_PATH) == 0) {
+        return -1;
+    }
+	return strrchr(exePath, '\\') - exePath;
+}
+
+void appendJavaw(char* jrePath) {
+    if (console) {
+	    strcat(jrePath, "\\bin\\java.exe");
+    } else {
+        strcat(jrePath, "\\bin\\javaw.exe");
+    }
+}
+
+void appendLauncher(BOOL setProcName, char* exePath, int pathLen, char* cmd) {
+	if (setProcName) {
+		char tmpspec[_MAX_PATH];
+		char tmpfile[_MAX_PATH];
+		strcpy(tmpspec, cmd);
+		strcat(tmpspec, LAUNCH4J_TMP_DIR);
+		tmpspec[strlen(tmpspec) - 1] = 0;
+		if (_stat(tmpspec, &statBuf) == 0) {
+			// remove temp launchers
+			struct _finddata_t c_file;
+			long hFile;
+			strcat(tmpspec, "\\*.exe");
+			strcpy(tmpfile, cmd);
+			strcat(tmpfile, LAUNCH4J_TMP_DIR);
+			char* filename = tmpfile + strlen(tmpfile);
+			if ((hFile = _findfirst(tmpspec, &c_file)) != -1L) {
+				do {
+					strcpy(filename, c_file.name);
+					_unlink(tmpfile);
+				} while (_findnext(hFile, &c_file) == 0);
+			}
+			_findclose(hFile);
+		} else {
+			if (_mkdir(tmpspec) != 0) {
+				appendJavaw(cmd);
+				return;
+			}
+		}
+		char javaw[_MAX_PATH];
+		strcpy(javaw, cmd);
+		appendJavaw(javaw);
+		strcpy(tmpfile, cmd);
+		strcat(tmpfile, LAUNCH4J_TMP_DIR);
+		char* exeFilePart = exePath + pathLen + 1;
+		strcat(tmpfile, exeFilePart);
+		if (CopyFile(javaw, tmpfile, FALSE)) {
+			strcpy(cmd, tmpfile);
+			return;
+		} else if (_stat(javaw, &statBuf) == 0) {
+			long fs = statBuf.st_size;
+			if (_stat(tmpfile, &statBuf) == 0 && fs == statBuf.st_size) {
+				strcpy(cmd, tmpfile);
+				return;
+			}
+		}
+	}
+	appendJavaw(cmd);
+}
+
+BOOL isJrePathOk(char* path) {
+	if (!*path) {
+		return FALSE;
+	}
+	char javaw[_MAX_PATH];
+	strcpy(javaw, path);
+	appendJavaw(javaw);
+	return _stat(javaw, &statBuf) == 0;
+}
+
+//added by oran - added the subcom argument
+BOOL prepare(HMODULE hLibrary, char *lpCmdLine, char *subcom) {
+    char tmp[MAX_ARGS] = {0};
+    GetEnvironmentVariable("launch4j", tmp, STR);
+    debug = _stricmp(tmp, "debug") == 0;
+	
+	//added by oran - set the subcommand
+	strcpy( subcommand, subcom );
+
+	// Open executable
+	char exePath[_MAX_PATH] = {0};
+	int pathLen = getExePath(exePath);
+	if (pathLen == -1) {
+		msgBox("Cannot determinate exe file name.");
+		return FALSE;
+	}
+	hLibrary = LoadLibrary(exePath);
+	if (hLibrary == NULL) {
+		char msg[BIG_STR];
+        strcpy(msg, "Cannot find file: ");
+		strcat(msg, exePath);
+		msgBox(msg);
+		return FALSE;
+	}
+
+	// Error message box title
+	loadString(hLibrary, ERR_TITLE, errTitle);
+
+	// Working dir
+	char tmp_path[_MAX_PATH] = {0};
+	if (loadString(hLibrary, CHDIR, tmp_path)) {
+		strncpy(workingDir, exePath, pathLen);
+		strcat(workingDir, "\\");
+		strcat(workingDir, tmp_path);
+		_chdir(workingDir);
+	}
+
+	// Custom process name
+	const BOOL setProcName = loadBoolString(hLibrary, SET_PROC_NAME);
+
+	// Use bundled jre or find java
+	if (loadString(hLibrary, JRE_PATH, tmp_path)) {
+		if (tmp_path[0] == '\\' || tmp_path[1] == ':') {
+			// Absolute
+			strcpy(cmd, tmp_path);
+		} else {
+			// Relative
+			strncpy(cmd, exePath, pathLen);
+			strcat(cmd, "\\");
+			strcat(cmd, tmp_path);
+		}
+    }
+	if (!isJrePathOk(cmd)) {
+		if (!loadString(hLibrary, JAVA_MIN_VER, javaMinVer)) {
+			msgBox("Cannot find bundled JRE or javaw.exe is missing.");
+			return FALSE;
+		}
+		loadString(hLibrary, JAVA_MAX_VER, javaMaxVer);
+		if (!findJavaHome(cmd)) {
+			char txt[BIG_STR];
+			strcpy(txt, "Cannot find Java ");
+			strcat(txt, javaMinVer);
+			if (*javaMaxVer) {
+				strcat(txt, " - ");
+				strcat(txt, javaMaxVer);
+			}
+			//msgBox(txt);
+			//showJavaWebPage();
+			return FALSE;
+		}
+		if (!isJrePathOk(cmd)) {
+			msgBox("Java found, but javaw.exe seems to be missing.");
+			return FALSE;
+		}
+	}
+
+	//before appending the launcher, save the cmd in javaHome
+	strcpy( javaHome, cmd );
+
+	//only affect the PATH if subcommand is run
+	if ( _stricmp( subcommand, "run" ) ) {
+	    // Append a path to the Path environment variable
+		char jreBinPath[_MAX_PATH];
+		strcpy(jreBinPath, cmd);
+		strcat(jreBinPath, "\\bin");
+		if (!appendToPathVar(jreBinPath)) {
+			msgBox("Cannot set the Path environment variable.");
+			return FALSE;
+		}
+	}
+	
+	appendLauncher(setProcName, exePath, pathLen, cmd);
+
+    // JVM args
+	if (loadString(hLibrary, JVM_ARGS, tmp)) {
+		strcat(tmp, " ");
+	} else {
+        *tmp = 0;
+    }
+	// Load additional JVM arguments from ini file
+	strncpy(tmp_path, exePath, strlen(exePath) - 3);
+	strcat(tmp_path, "ini");
+	long hFile;
+	if ((hFile = _open(tmp_path, _O_RDONLY)) != -1) {
+		const int jvmArgsLen = strlen(tmp);
+		char* src = tmp + jvmArgsLen;
+		char* dst = src;
+		const int len = _read(hFile, src, MAX_ARGS - jvmArgsLen - BIG_STR);
+		int i;
+		for (i = 0; i < len; i++) {
+			if (*src == 13 || *src == 10) {
+				if (dst > tmp && *(dst - 1) != ' ') {
+					*dst++ = ' ';
+				}
+				src++;
+			} else {
+				*dst++ = *src++;
+			}
+		}
+		*dst = 0;
+		if (len > 0 && *(dst - 1) != ' ') {
+			strcat(tmp, " ");
+		}
+		_close(hFile);
+	}
+
+    // Expand environment %variables%
+    if (*tmp) {
+        char varName[STR];
+        char varValue[MAX_VAR_SIZE];
+        char *pos = tmp;
+        while (strlen(pos) > 0) {
+            char *start = strchr(pos, '%');
+            if (start != NULL) {
+                char *end = strchr(start + 1, '%');
+                if (end == NULL) {
+                    return FALSE;
+                }
+                // Copy content up to %VAR%
+                strncat(args, pos, start - pos);
+                // Insert value of %VAR%
+                varName[0] = 0;
+                strncat(varName, start + 1, end - start - 1);
+                if (strcmp(varName, "EXEDIR") == 0) {
+                    strncat(args, exePath, pathLen);
+                } else if (strcmp(varName, "EXEFILE") == 0) {
+                    strcat(args, exePath);                    
+                } else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0) {
+                    strcat(args, varValue);
+                }
+                pos = end + 1;
+            } else {
+                // Copy remaining content
+                strcat(args, pos);
+                break;
+            }
+        }
+	}
+
+	// Jar
+	strcat(args, "-jar \"");
+	if (loadString(hLibrary, JAR, tmp)) {
+        strncat(args, exePath, pathLen);
+        strcat(args, "\\");
+        strcat(args, tmp);
+    } else {
+    	strcat(args, exePath);
+    }
+	strcat(args, "\"");
+
+	// Constant command line args
+	char jarArgs[BIG_STR] = {0};
+	if (loadString(hLibrary, JAR_ARGS, jarArgs)) {
+		strcat(args, " ");
+		strcat(args, jarArgs);
+	}
+
+	// Command line args
+	if (*lpCmdLine) {
+		strcat(args, " ");
+		strcat(args, lpCmdLine);
+	}
+
+    if (debug) {
+        printf("*** Launch4j debug info ***\nWorking dir:\t%s\n", workingDir);
+		printf("Launcher:\t%s\n", cmd);
+        _itoa(strlen(args), tmp, 10);     // 10 -- radix
+		printf("Args length:\t%s/32768 chars\n", tmp);
+		printf("Launcher args:\t%s\n\n", args);
+    }
+	return TRUE;
+}
+
+void closeHandles() {
+	CloseHandle(pi.hThread);
+	CloseHandle(pi.hProcess);
+}
+
+/*
+ * Append a path to the Path environment variable
+ */
+BOOL appendToPathVar(char* path) {
+	char chBuf[MAX_VAR_SIZE] = {0};
+
+	const int pathSize = GetEnvironmentVariable("Path", chBuf, MAX_VAR_SIZE);
+	if (MAX_VAR_SIZE - pathSize - 1 < strlen(path)) {
+		return FALSE;
+	}
+	strcat(chBuf, ";");
+	strcat(chBuf, path);
+	return SetEnvironmentVariable("Path", chBuf);
+}
+
+DWORD execute(BOOL wait) {
+	//added by oran - the original execute function has been wrapped in this if, and a few else ifs added after that
+	if ( _stricmp(subcommand, "run") == 0 ) {
+	
+		STARTUPINFO si;
+	    memset(&pi, 0, sizeof(pi));
+	    memset(&si, 0, sizeof(si));
+	    si.cb = sizeof(si);
+
+		DWORD dwExitCode = -1;
+		char cmdline[MAX_ARGS];
+	    strcpy(cmdline, "\"");
+		strcat(cmdline, cmd);
+		strcat(cmdline, "\" ");
+		strcat(cmdline, args);
+		if (CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
+			if (wait) {
+				WaitForSingleObject(pi.hProcess, INFINITE);
+				GetExitCodeProcess(pi.hProcess, &dwExitCode);
+				closeHandles();
+			} else {
+				dwExitCode = 0;
+			}
+		}
+		return dwExitCode;
+
+	} else if ( _stricmp(subcommand, "find") == 0 ) {
+		printf("%s\n", javaHome);
+	} else if ( _stricmp(subcommand, "compare") == 0 ) {
+		printf("%s\n", foundJavaVer);
+	}
+}
Index: /release-kits/shared/search4j/head_src/head.h
===================================================================
--- /release-kits/shared/search4j/head_src/head.h	(revision 15093)
+++ /release-kits/shared/search4j/head_src/head.h	(revision 15093)
@@ -0,0 +1,77 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#ifndef _LAUNCH4J_HEAD__INCLUDED_
+#define _LAUNCH4J_HEAD__INCLUDED_
+
+#define WIN32_LEAN_AND_MEAN		// VC - Exclude rarely-used stuff from Windows headers
+
+// Windows Header Files:
+#include <windows.h>
+
+// C RunTime Header Files
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+#include <shellapi.h>
+#include <direct.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <io.h>
+#include <process.h>
+#include <advapi32.h>
+
+#define NO_JAVA_FOUND 0
+#define FOUND_JRE 1
+#define FOUND_SDK 2
+
+#define LAUNCH4J_TMP_DIR "\\launch4j-tmp\\"
+
+#define STR 128
+#define BIG_STR 1024
+#define MAX_VAR_SIZE 32767
+#define MAX_ARGS 32768
+
+#define TRUE_STR "true"
+#define FALSE_STR "false"
+
+void titledMsgBox(const char* title, const char* text);
+void msgBox(const char* text);
+void showJavaWebPage();
+BOOL loadString(HMODULE hLibrary, int resID, char* buffer);
+BOOL loadBoolString(HMODULE hLibrary, int resID);
+void regSearch(HKEY hKey, const char* keyName, int searchType);
+BOOL findJavaHome(char* path);
+int getExePath(char* exePath);
+void catJavaw(char* jrePath);
+BOOL isJrePathOk(char* path);
+BOOL prepare(HMODULE hLibrary, char *lpCmdLine, char *subcom);
+void closeHandles();
+BOOL appendToPathVar(char* path);
+DWORD execute(BOOL wait);
+
+#endif // _LAUNCH4J_HEAD__INCLUDED_
Index: /release-kits/shared/search4j/head_src/resource.h
===================================================================
--- /release-kits/shared/search4j/head_src/resource.h	(revision 15093)
+++ /release-kits/shared/search4j/head_src/resource.h	(revision 15093)
@@ -0,0 +1,46 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+// ICON
+#define APP_ICON 1
+
+// BITMAP
+#define SPLASH_BITMAP 1
+
+// RCDATA
+#define JRE_PATH 1
+#define JAVA_MIN_VER 2
+#define JAVA_MAX_VER 3
+#define SHOW_SPLASH 4
+#define SPLASH_WAITS_FOR_WINDOW 5
+#define SPLASH_TIMEOUT 6
+#define SPLASH_TIMEOUT_ERR 7
+#define CHDIR 8
+#define SET_PROC_NAME 9
+#define ERR_TITLE 10
+#define GUI_HEADER_STAYS_ALIVE 11
+#define JVM_ARGS 12
+#define JAR_ARGS 13
+#define JAR 14
Index: /release-kits/shared/search4j/search4j.cpp
===================================================================
--- /release-kits/shared/search4j/search4j.cpp	(revision 15093)
+++ /release-kits/shared/search4j/search4j.cpp	(revision 15093)
@@ -0,0 +1,522 @@
+/*
+* Search4j utility
+* Command Line utility to search a system for java, launch a jar, or compare java versions
+* base on launch4j
+*/
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <windows.h>
+using namespace std;
+
+
+//minimal launch4j stuff
+#define NO_JAVA_FOUND 0
+#define FOUND_JRE 1
+#define FOUND_SDK 2
+int foundJava = NO_JAVA_FOUND;
+char foundJavaVer[128] = {0};
+
+
+//global variables
+bool verbose = false;
+bool use_minimum = false;
+
+enum JvmProperty {
+	JavaHome,
+	Version,
+	Executable
+};
+
+enum Action {
+	Find,
+	Launch,
+	Compare
+};
+
+void replace_all ( std::string & str, std::string const & pattern, std::string const & replacement ) {
+
+	std::string::size_type start = str.find( pattern, 0 );
+
+	while ( start != str.npos ) {
+		str.replace( start, pattern.size(), replacement );
+		start = str.find( pattern, start+replacement.size() );
+	}
+
+}
+
+int process( string command, string &output ) {
+	
+	FILE   *pPipe;
+
+	/* Run command so that it writes its output to a pipe. Open this
+	* pipe with read text attribute so that we can read it 
+	* like a text file. */
+	char cmd[1024]; strcpy(cmd, command.c_str());
+	//if ( verbose ) cout << "process(): running '" << command << "'" << endl;
+	if( (pPipe = _popen( cmd, "rt" )) == NULL ) {
+		if ( verbose ) cout << "could not start process" << endl;
+		_pclose( pPipe );
+		return -1;
+	}
+	//if ( verbose ) cout << "started process" << endl;
+
+	/* Read pipe until end of file. */
+	while( !feof( pPipe ) ) {
+		char psBuffer[128];
+		//if ( verbose ) cout << "get some data" << endl;
+		if( fgets( psBuffer, 128, pPipe ) != NULL ) {
+			
+			//if ( verbose ) cout << "got: " << psBuffer << endl;
+			output.append( psBuffer );
+			
+		} else {
+			//if ( verbose ) cout << "none left" << endl;
+		}
+		
+	}
+
+	/* Close pipe and return return value of pPipe. */
+	int code = _pclose( pPipe );
+	return code;
+}
+
+class Jvm {
+
+	string javaHome;
+	
+	// version string. era.major.minor_update. eg: 1.4.2_02
+	int era;
+	int major;
+	int minor;
+	int update;
+
+	bool isJdk;
+	bool healthy;	
+
+
+	public:
+	Jvm() {
+		healthy = false;
+	}
+
+	void setJavaHome( string jh ) {
+		healthy = true;
+		javaHome = jh;
+		setVersionFromExeOuput();
+	}
+
+	string getJavaHome() {
+		return javaHome;
+	}
+
+	string getExecutable() {
+		string exec = "";
+		exec.append( javaHome );
+		exec.append( "\\bin\\java.exe" );
+		return exec;
+	}
+
+	string getVersion() {
+		stringstream ss;
+		ss << era << "." << major << "." << minor << "_" << update;
+		return ss.str();
+	}
+	
+	bool check() {
+		return healthy;
+	}
+
+	bool setVersionFromString( string version ) {
+		era = atoi( version.substr(0,1).c_str() );
+		major = atoi( version.substr(2,1).c_str() );
+		minor = atoi( version.substr(4,1).c_str() );
+		update = atoi( version.substr(6,2).c_str() );
+		return true;
+	}
+	
+	int compare( Jvm otherJvm ) {
+		//era
+		if ( era > otherJvm.getEra() )
+			return 1;
+		else if ( era < otherJvm.getEra() )
+			return -1;
+		
+		//major
+		if ( major > otherJvm.getMajor() )
+			return 1;
+		else if ( major < otherJvm.getMajor() )
+			return -1;
+			
+		//minor
+		if ( minor > otherJvm.getMinor() )
+			return 1;
+		else if ( minor < otherJvm.getMinor() )
+			return -1;
+
+		//update
+		if ( update > otherJvm.getUpdate() )
+			return 1;
+		else if ( update < otherJvm.getUpdate() )
+			return -1;
+
+		//all the same so far, must be exactly the same
+		return 0;
+
+	}
+	
+	int getEra() { return era; }
+	int getMajor() { return major; }
+	int getMinor() { return minor; }
+	int getUpdate() { return update; }
+	
+	private:
+	
+	void setVersionFromExeOuput() {
+		string command = "", output = "";
+		command.append( "\"" );
+		command.append( getExecutable() );
+		command.append( "\"" );
+		command.append(" -version 2>&1");
+		int result = process( command, output );
+		if ( result == 0 ) {
+			if ( _stricmp( output.substr( 0, 12 ).c_str() , "java version" ) == 0 || true ) {
+				era = atoi( output.substr(14,1).c_str() );
+				major = atoi( output.substr(16,1).c_str() );
+				minor = atoi( output.substr(18,1).c_str() );
+				update = atoi( output.substr(20,2).c_str() );
+				//if ( verbose) cout << "set version to: " << era << "." << major << "." << minor << "_" << update << endl;
+			} else {
+				healthy=false;
+			}
+		} else {
+			healthy = false;
+		}
+	}
+	
+	
+};
+
+string actionToString( Action a ) {
+	if ( a == Find ) 
+		return "Find";
+	else if ( a == Launch )
+		return "Launch";
+	else if ( a == Compare )
+		return "Compare";
+	return "Unknown";
+}
+
+string jvmPropertyToString( JvmProperty jp ) {
+	if ( jp == JavaHome ) 
+		return "JavaHome";
+	else if ( jp == Version )
+		return "Version";
+	else if ( jp == Executable )
+		return "Executable";
+	return "Unknown";
+}
+
+void usage() {
+	
+	cout
+		<< "-----------------" << endl
+		<< " search4j: usage" << endl
+		<< "-----------------" << endl
+		<< "Three usage methods: find, compare and launch" << endl
+		<< endl
+		<< "find:     find java and print out information about it" << endl
+		<< endl
+		<< "          search4j [-v|-e] [-m VERSION_STRING]" << endl
+		<< "          eg: search4j -m 1.4.1_01 -e" << endl
+		<< endl
+		<< "          by default, print JAVA_HOME. E.g., C:\\Program Files\\jre1.5.0_15, or" << endl
+		<< "          if -v is specified, print the java version string. E.g. 1.5.0_15, or" << endl
+		<< "          if -e is specified, print the path the to the java executable. E.g. C:\\Program Files\\jre1.5.0_15\\bin\\java.exe" << endl
+		<< "          if -m option is used, find a java of the given version or newer, or fail" << endl
+		<< endl
+		<< "compare:  compare the found java with the given java version string" << endl
+		<< endl
+		<< "          search4j -c VERSION_STRING" << endl
+		<< "          eg: search4j -c VERSION_STRING" << endl
+		<< endl
+		<< "          print -1 if found java is older" << endl
+		<< "          print 0 if found java is same" << endl
+		<< "          print 1 if found java is newer" << endl
+		<< endl
+		<< "launch:   launch the given executable jar with the found java" << endl
+		<< endl
+		<< "          search4j -l EXECUTABLE_JAR [-m VERSION_STRING]" << endl
+		<< "          eg: search4j -l greenstone3.jar" << endl
+		<< endl
+		<< "          specify the location of the jar relative to the current directory" << endl
+		<< "          if -m option is used, find a java of the given version or newer" << endl
+		<< endl
+		<< "Global Options:" << endl
+		<< "          --verbose : have search4j print out information about what its doing" << endl
+		<< "          --help : display this usage screen" << endl
+		<< endl
+		;
+}
+
+//another global
+Jvm minimum;
+
+
+void regSearch(HKEY hKey, const char* keyName, int searchType) {
+	DWORD x = 0;
+	unsigned long size = 1024;
+	FILETIME time;
+	char buffer[1024] = {0};
+	while (RegEnumKeyEx(
+				hKey,			// handle to key to enumerate
+				x++,			// index of subkey to enumerate
+				buffer,			// address of buffer for subkey name
+				&size,			// address for size of subkey buffer
+				NULL,			// reserved
+				NULL,			// address of buffer for class string
+				NULL,			// address for size of class buffer
+				&time) == ERROR_SUCCESS) {
+		strcpy(foundJavaVer, buffer);
+		foundJava = searchType;
+		size = 1024;
+	}
+}
+
+
+/*
+* function to find java
+* implements the logic drawn on the dl lab whiteboard in feb 08
+* return a Jvm object which represents the jvm on disk
+*/
+bool find( Jvm &jvm ) {
+	
+	if ( verbose ) cout << "Searching for a JVM" << endl;
+	char *javaHome = "";
+	bool jvmFound = false;
+	
+	if ( !jvmFound ) {
+		//try JAVA_HOME
+		if ( verbose ) cout << " - trying JAVA_HOME: ";
+		javaHome = getenv( "JAVA_HOME" );
+		if ( javaHome != NULL ) {
+			jvm.setJavaHome( javaHome );
+			if ( jvm.check() ) {
+				if ( use_minimum ) {
+					if ( jvm.compare( minimum ) >= 0 ) {
+						jvmFound = true;
+					}
+				} else {
+					jvmFound = true;
+				}
+			}
+		}
+		if ( verbose ) { if( jvmFound ) cout << "yes" << endl; else cout << "no" << endl; }
+	}
+	
+	if ( !jvmFound ) {
+		//try JRE_HOME
+		if ( verbose ) cout << " - trying JRE_HOME: ";
+		javaHome = getenv( "JRE_HOME" );
+		if ( javaHome != NULL ) {
+			jvm.setJavaHome( javaHome );
+			if ( jvm.check() ) {
+				if ( use_minimum ) {
+					if ( jvm.compare( minimum ) >= 0 ) {
+						jvmFound = true;
+					}
+				} else {
+					jvmFound = true;
+				}
+			}
+		}
+		if ( verbose ) { if( jvmFound ) cout << "yes" << endl; else cout << "no" << endl; }
+	}
+	
+	if ( !jvmFound ) {
+		//try the registry - this code based on launch4j code
+		if ( verbose ) cout << " - trying the registry: ";
+		HKEY hKey;
+		const char jre[] = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
+		const char sdk[] = "SOFTWARE\\JavaSoft\\Java Development Kit";
+		
+		if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(jre), 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hKey) == ERROR_SUCCESS ) {
+			regSearch(hKey, jre, FOUND_JRE);
+			RegCloseKey(hKey);
+		}
+		
+		if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(sdk), 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hKey) == ERROR_SUCCESS ) {
+			regSearch(hKey, sdk, FOUND_SDK);
+			RegCloseKey(hKey);
+		}
+		
+		if ( foundJava != NO_JAVA_FOUND ) {
+			char path[1024] = {0};
+			char keyBuffer[1024];
+			unsigned long datatype;
+			unsigned long bufferlength = 1024;
+			if (foundJava == FOUND_JRE)	{
+				strcpy(keyBuffer, jre);
+			} else {
+				strcpy(keyBuffer, sdk);
+			}
+			strcat(keyBuffer, "\\");
+			strcat(keyBuffer, foundJavaVer);
+			if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(keyBuffer), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
+				unsigned char buffer[1024] = {0};
+				if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, &bufferlength) == ERROR_SUCCESS) {
+					int i = 0;
+					do {
+						path[i] = buffer[i];
+					} while (path[i++] != 0);
+					if (foundJava == FOUND_SDK) {
+						strcat(path, "\\jre");
+					}
+					jvm.setJavaHome( path );
+					if ( jvm.check() ) {
+						if ( use_minimum ) {
+							if ( jvm.compare( minimum ) >= 0 ) {
+								jvmFound = true;
+							}
+						} else {
+							jvmFound = true;
+						}
+					}
+				}
+				RegCloseKey(hKey);
+			}
+		}
+		if ( verbose ) { if( jvmFound ) cout << "yes" << endl; else cout << "no" << endl; }
+	}
+
+	return jvmFound;
+}
+
+int main ( int argc, char** argv ) {
+	//cout << "testing process()" << endl;
+	//string out = "";
+	//process( "dir", out );
+	//cout << out << endl;
+	//return 0;
+
+
+	JvmProperty jvmProperty = JavaHome;
+	Action action = Find;
+	string arg1 = "";
+	
+	//parse commandline arguments
+	for (int i=1; i<argc; i++) {
+		if ( _stricmp(argv[i], "--verbose") == 0 ) {
+			verbose = true;
+		} else if ( _stricmp(argv[i], "--help") == 0 || _stricmp(argv[i], "--usage") == 0 ) {
+			usage();
+			return 0;
+		} else if ( _stricmp(argv[i], "-v") == 0 ) {
+			jvmProperty = Version;
+		} else if ( _stricmp(argv[i], "-e") == 0 ) {
+			jvmProperty = Executable;
+		} else if ( _stricmp(argv[i], "-c") == 0 ) {
+			action = Compare;
+			if ( i == argc-1 ) {
+				usage();
+				return 0;
+			} else {
+				arg1 = argv[++i];
+			}
+
+			} else if ( _stricmp(argv[i], "-m") == 0 ) {
+			if ( i == argc-1 ) {
+				usage();
+				return 0;
+			} else {
+				if ( !minimum.setVersionFromString( argv[++i] ) ) {
+					usage();
+					return 0;
+				}
+				use_minimum = true;
+			}
+
+		} else if ( _stricmp(argv[i], "-l") == 0 ) {
+			action = Launch;
+			arg1 = argv[++i];
+
+		} else {
+			cout << "unknown option: " << argv[i] << endl;
+			return -1;
+		}
+	}
+	
+	//summarise commandline arguments
+	if ( verbose ) {
+		cout << "Action: " << actionToString( action ) << endl;
+	}
+
+	//find java
+	Jvm foundJvm;
+	bool found = find( foundJvm );
+
+	//check if it was found
+	if ( found ) {
+		if ( verbose ) cout << "Found JVM at '" << foundJvm.getJavaHome() << "'" << endl;
+	} else {
+		//not found - exit with -1
+		if ( verbose ) cout << "JVM not found" << endl;
+		return -1;
+	}
+
+
+	//Find Action
+	//---------------
+	if ( action == Find ) {
+
+		if ( verbose ) cout << "Property to print: " << jvmPropertyToString( jvmProperty ) << endl;		
+
+		//found - print out info about it
+		if ( jvmProperty == JavaHome ) {
+			cout << foundJvm.getJavaHome() << endl;
+		} else if ( jvmProperty == Version ) {
+			cout << foundJvm.getVersion() << endl;
+		} else if ( jvmProperty == Executable ) {
+			cout << foundJvm.getExecutable() << endl;
+		} else {
+			return -1; //should never happen
+		}
+			
+
+	//Compare Action
+	//---------------
+	} else if ( action == Compare ) {
+		
+		if ( verbose ) cout << "Compare to java at: " << arg1 << endl;
+
+		//load a dummy jvm for comparison
+		Jvm givenJvm;
+		if ( !givenJvm.setVersionFromString(arg1) ) {
+			if ( verbose ) cout << "Could not parse that version string" << endl;
+			return -1;
+		}
+		
+		//compare
+		cout << foundJvm.compare( givenJvm );
+		return 0;
+
+		
+	//Launch Action
+	//---------------
+	} else if ( action == Launch ) {
+
+		if ( verbose ) cout << "Jar to launch: " << arg1 << endl;
+		
+		string cmd = "\"", output = "";
+		cmd.append( foundJvm.getExecutable() );
+		cmd.append( "\" -jar " );
+		cmd.append( arg1 );
+		
+		process( cmd, output );
+		
+	}
+	
+	return 0;
+}
Index: /release-kits/shared/search4j/search4j.cpp-createprocess
===================================================================
--- /release-kits/shared/search4j/search4j.cpp-createprocess	(revision 15093)
+++ /release-kits/shared/search4j/search4j.cpp-createprocess	(revision 15093)
@@ -0,0 +1,296 @@
+/*
+* Search4j utility
+* Command Line utility to search a system for java, launch a jar, or compare java versions
+* base on launch4j
+*/
+
+#include <iostream>
+#include <string>
+#include <windows.h>
+using namespace std;
+
+bool verbose = false;
+
+enum JvmProperty {
+	JavaHome,
+	Version,
+	Executable
+};
+
+enum Action {
+	Find,
+	Launch,
+	Compare
+};
+
+int process( char* command, string &output ) {
+	PROCESS_INFORMATION pi;
+	STARTUPINFO si;
+    memset(&pi, 0, sizeof(pi));
+    memset(&si, 0, sizeof(si));
+    si.cb = sizeof(si);
+
+	DWORD dwExitCode = -1;
+	char cmdline[1024];
+    strcpy(cmdline, "dir");
+
+	if ( CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) ) {
+		WaitForSingleObject(pi.hProcess, INFINITE);
+		GetExitCodeProcess(pi.hProcess, &dwExitCode);
+		CloseHandle(pi.hThread);
+		CloseHandle(pi.hProcess);
+	}
+	return 1;
+
+}
+
+class Jvm {
+
+	string javaHome;
+	bool isJdk;
+
+	// version string. era.major.minor_update. eg: 1.4.2_02
+	string version;
+	int era;
+	int major;
+	int minor;
+	int update;
+
+	public:	
+
+	void setJavaHome( string jh ) {
+		javaHome = jh;
+		setVersion();
+	}
+
+	string getJavaHome() {
+		return javaHome;
+	}
+
+	string getExecutable() {
+		string exec = "";
+		exec.append( javaHome );
+		exec.append( "\\bin\\java.exe" );
+		return exec;
+	}
+
+	string getVersion() {
+		return version;
+	}
+	
+	bool check() {
+		return true;
+	}
+	
+	private:
+	
+	void setVersion() {
+
+		string command = "", output="";
+		command.append( getExecutable() );
+		command.append(" -version");
+		//bool result = process( command, output );
+	}
+	
+	
+};
+
+
+string actionToString( Action a ) {
+	if ( a == Find ) 
+		return "Find";
+	else if ( a == Launch )
+		return "Launch";
+	else if ( a == Compare )
+		return "Compare";
+	return "Unknown";
+}
+
+string jvmPropertyToString( JvmProperty jp ) {
+	if ( jp == JavaHome ) 
+		return "JavaHome";
+	else if ( jp == Version )
+		return "Version";
+	else if ( jp == Executable )
+		return "Executable";
+	return "Unknown";
+}
+
+void usage() {
+	
+	cout
+		<< "-----------------" << endl
+		<< " search4j: usage" << endl
+		<< "-----------------" << endl
+		<< "Three usage methods: find, compare and launch" << endl
+		<< endl
+		<< "find:     find java and print out information about it" << endl
+		<< endl
+		<< "          search4j [-v|-e] [-m VERSION_STRING]" << endl
+		<< "          eg: search4j -m 1.4.1_01 -e" << endl
+		<< endl
+		<< "          by default, print JAVA_HOME. E.g., C:\\Program Files\\jre1.5.0_15, or" << endl
+		<< "          if -v is specified, print the java version string. E.g. 1.5.0_15, or" << endl
+		<< "          if -e is specified, print the path the to the java executable. E.g. C:\\Program Files\\jre1.5.0_15\\bin\\java.exe" << endl
+		<< "          if -m option is used, find a java of the given version or newer, or fail" << endl
+		<< endl
+		<< "compare:  compare the found java with the given java version string" << endl
+		<< endl
+		<< "          search4j -c VERSION_STRING" << endl
+		<< "          eg: search4j -c VERSION_STRING" << endl
+		<< endl
+		<< "          print -1 if found java is older" << endl
+		<< "          print 0 if found java is same" << endl
+		<< "          print 1 if found java is newer" << endl
+		<< endl
+		<< "launch:   launch the given executable jar with the found java" << endl
+		<< endl
+		<< "          search4j -l EXECUTABLE_JAR [-m VERSION_STRING]" << endl
+		<< "          eg: search4j -l greenstone3.jar" << endl
+		<< endl
+		<< "          specify the location of the jar relative to the current directory" << endl
+		<< "          if -m option is used, find a java of the given version or newer" << endl
+		<< endl
+		<< "Global Options:" << endl
+		<< "          --verbose : have search4j print out information about what its doing" << endl
+		<< "          --help : display this usage screen" << endl
+		<< endl
+		;
+}
+
+
+/*
+* function to find java
+* implements the logic drawn on the dl lab whiteboard in feb 08
+* return a Jvm object which represents the jvm on disk
+*/
+bool find( Jvm &jvm ) {
+	
+	if ( verbose ) cout << "Searching for a JVM" << endl;
+	char *javaHome = "";
+	bool jvmFound = false;
+	
+	if ( !jvmFound ) {
+		//try JAVA_HOME
+		if ( verbose ) cout << " - trying JAVA_HOME" << endl;	
+		javaHome = getenv( "JAVA_HOME" );
+		if ( javaHome != NULL ) {
+			jvm.setJavaHome( javaHome );
+			if ( jvm.check() ) {
+				jvmFound = true;
+			}
+		}
+	}
+	
+	if ( !jvmFound ) {
+		//try JRE_HOME
+		if ( verbose ) cout << " - trying JRE_HOME" << endl;
+		javaHome = getenv( "JRE_HOME" );
+		if ( javaHome != NULL ) {
+			jvm.setJavaHome( javaHome );
+			if ( jvm.check() ) {
+				jvmFound = true;
+			}
+		}
+	}
+
+	return jvmFound;
+}
+
+
+int main ( int argc, char** argv ) {
+
+	string output = "";
+	int result = process("dir", output);
+	cout << "dir:" << endl << output << endl << result << endl;
+	
+	JvmProperty jvmProperty = JavaHome;
+	Action action = Find;
+	string arg1 = "";
+	
+	//parse commandline arguments
+	for (int i=1; i<argc; i++) {
+		if ( _stricmp(argv[i], "--verbose") == 0 ) {
+			verbose = true;
+		} else if ( _stricmp(argv[i], "--help") == 0 || _stricmp(argv[i], "--usage") == 0 ) {
+			usage();
+			return 0;
+		} else if ( _stricmp(argv[i], "-v") == 0 ) {
+			jvmProperty = Version;
+		} else if ( _stricmp(argv[i], "-e") == 0 ) {
+			jvmProperty = Executable;
+		} else if ( _stricmp(argv[i], "-c") == 0 ) {
+			action = Compare;
+			if ( i == argc-1 ) {
+				usage();
+				return 0;
+			} else {
+				arg1 = argv[++i];
+			}
+		} else if ( _stricmp(argv[i], "-l") == 0 ) {
+			action = Launch;
+			arg1 = argv[++i];
+		} else {
+			cout << "unknown option: " << argv[i] << endl;
+			return -1;
+		}
+	}
+	
+	//summarise commandline arguments
+	if ( verbose ) {
+		cout << "Action: " << actionToString( action ) << endl;
+		if ( action == Find ) cout << "Property to print: " << jvmPropertyToString( jvmProperty ) << endl;
+		if ( action == Compare ) cout << "Compare to java at: " << arg1 << endl;
+		if ( action == Launch ) cout << "Jar to launch: " << arg1 << endl;
+	}
+
+
+	//Find Action
+	//---------------
+	if ( action == Find ) {
+		
+		//find java
+		Jvm jvm;
+		bool found = find( jvm );
+		
+		//check if it was found
+		if ( found ) {
+
+			//found - print out info about it
+			if ( verbose ) cout << "JVM found!" << endl;
+			if ( jvmProperty == JavaHome ) {
+				cout << jvm.getJavaHome() << endl;
+			} else if ( jvmProperty == Version ) {
+				cout << jvm.getVersion() << endl;
+			} else if ( jvmProperty == Version ) {
+				cout << jvm.getExecutable() << endl;
+			} else {
+				return -1; //should never happen
+			}
+			
+		} else {
+		
+			//not found - exit with -1
+			if ( verbose ) cout << "JVM not found" << endl;
+			return -1;
+			
+		}
+	
+	
+
+	//Compare Action
+	//---------------
+	} else if ( action == Compare ) {
+		//compare();
+
+
+
+	//Launch Action
+	//---------------
+	} else if ( action == Launch ) {
+		//launch();
+	}
+	
+	
+	return 0;
+}
Index: /release-kits/shared/search4j/stderr
===================================================================
--- /release-kits/shared/search4j/stderr	(revision 15093)
+++ /release-kits/shared/search4j/stderr	(revision 15093)
@@ -0,0 +1,3 @@
+java version "1.4.1_01"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
+Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)
