diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0365ead
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,139 @@
+#
+#    Copyright (c) 2010-2013 Nest Labs, Inc.
+#    All rights reserved.
+#
+#    This document is the property of Nest. It is considered
+#    confidential and proprietary information.
+#
+#    This document may not be reproduced or transmitted in any form,
+#    in whole or in part, without the express written permission of
+#    Nest.
+#
+#    Description:
+#      This file is the make file for the daemon-monitoring daemon
+#      (DMD), monit.
+#
+
+BuildConfigSpecialized	:= No
+BuildProductSpecialized	:= No
+
+include pre.mak
+
+PackageName		:= monit
+
+PackageExtension	:= tar.gz
+PackageSeparator	:= -
+
+PackagePatchArgs	:= -p1
+
+PackageArchive		:= $(PackageName).$(PackageExtension)
+PackageSourceDir	:= $(PackageName)$(PackageSeparator)$(PackageVersion)
+
+PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)
+
+PackageBuildConfigure	= $(call GenerateBuildPaths,configure)
+
+LicenseSourceFiles	:= LICENSE COPYING
+LicenseSourcePaths      := $(addprefix $(PackageSourceDir)/,$(LicenseSourceFiles))
+
+CleanPaths		+= $(PackageLicenseFile)
+
+OpenSSLDir		:= sw/tps/openssl
+OpenSSLIncDir		:= $(call GenerateResultPaths,$(OpenSSLDir),usr/include)
+OpenSSLLibDir		:= $(call GenerateResultPaths,$(OpenSSLDir),usr/lib)
+
+ZlibDir			:= sw/tps/zlib
+ZlibIncDir      	:= $(call GenerateResultPaths,$(ZlibDir),usr/include)
+ZlibLibDir      	:= $(call GenerateResultPaths,$(ZlibDir),usr/lib)
+
+all: $(PackageDefaultGoal)
+
+# Generate the package license contents.
+
+$(LicenseSourcePaths): source
+
+$(PackageLicenseFile): $(LicenseSourcePaths)
+	$(Verbose)touch $@
+	$(Verbose)for file in $(LicenseSourcePaths); do	\
+		echo "Concatenating \"$${file}\"...";	\
+		cat $${file} >> $@;			\
+	done
+
+# Extract the source from the archive and apply patches, if any.
+
+$(PackageSourceDir): $(PackageArchive) $(PackagePatchPaths)
+	$(expand-and-patch-package)
+
+# Prepare the sources.
+
+.PHONY: source
+source: | $(PackageSourceDir)
+
+# Patch the sources, if necessary.
+
+.PHONY: patch
+patch: source
+
+# Generate the package build configure script by shadowing the source
+# tree as a link farm.
+#
+# This is generally unnecessary for most GNU autoconf-based packages;
+# however, monit completely drops the ball on non-colocated builds.
+
+$(PackageBuildConfigure): | $(PackageSourceDir) $(BuildDirectory)
+	$(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))
+
+# Generate the package build makefile.
+
+$(PackageBuildMakefile): $(PackageBuildConfigure)
+	$(Verbose)cd $(BuildDirectory) && \
+	./configure \
+	--config-cache \
+	CC="$(CC)" CXX="$(CXX)" AR=$(AR) RANLIB=$(RANLIB) STRIP=$(STRIP) NM=$(NM) OBJDUMP=$(OBJDUMP) \
+	LDFLAGS="-Wl,-rpath-link -Wl,$(ZlibLibDir)" \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+	libmonit_cv_setjmp_available=yes \
+	libmonit_cv_vsnprintf_c99_conformant=yes \
+	ac_cv_ipv6=yes \
+	--build=$(HostTuple) \
+	--host=$(TargetTuple) \
+	--prefix=/usr \
+	--sysconfdir=/etc \
+	--localstatedir=/var \
+	--enable-optimized \
+	--with-ssl-incl-dir=$(OpenSSLIncDir) \
+	--with-ssl-lib-dir=$(OpenSSLLibDir) \
+	--without-pam
+
+# Configure the source for building.
+
+.PHONY: configure
+configure: source $(PackageBuildMakefile)
+
+# Build the source.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: build
+build: configure
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) all
+
+# Stage the build to a temporary installation area.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: stage
+stage: build | $(ResultDirectory)
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+	DESTDIR=$(ResultDirectory) \
+	MODE_PROGS=775 \
+	install
+
+clean:
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)
+
+include post.mak
diff --git a/monit-5.4/CHANGES b/monit-5.4/CHANGES
new file mode 100644
index 0000000..e965c85
--- /dev/null
+++ b/monit-5.4/CHANGES
@@ -0,0 +1,879 @@
+                     CHANGES version 5.4
+                                
+           This file summarizes changes made since 5.0
+                                
+       Bug fixes may refer to an auto-generated id in our
+          bug-tracking system, which can be found here
+          https://savannah.nongnu.org/bugs/?group=monit
+
+
+Version 5.4
+
+IMPROVEMENTS:
+
+* New process uptime test added. Allows to do some action in
+  the case that the process uptime matches the given limit.
+  For example to restart the process once per 3 days:
+    if uptime > 3 days then restart
+
+* Linux uCLibc support: use internal getloadavg implementation
+  in the case that the system libc doesn't implement it.
+
+BUGFIXES:
+
+* The monit hostname will fallback to plain machine's hostname if the
+  lookup for FQDN hostname didn't found matching entry. The problem
+  was, that based on the order in the /etc/hosts the FQDN lookup
+  returned sometimes 'localhost' instead of the FQDN hostname.
+
+* The CPU usage for multi-threaded processes on multi-core machine was
+  reported incorrectly in the case that the process used more CPU
+  resources then equivalent to one core. Thanks to Tom Pepper for patch.
+
+* The content match test now sends one event per cycle and pattern.
+  Even if there are multiple lines matching the same pattern, only
+  one event will be generated. Also the event rate is fixed now, so
+  it is possible to require match for X cycles before generating the
+  event.
+
+* The /proc/ files content match test was skipped, as the file size on
+  the procfs is 0, so monit supposed that there is no content to read.
+
+* FreeBSD: If the monitored process had children with multiple threads,
+  the total memory usage was reported incorrectly. Thanks to Phil Kulin
+  for reporting the problem.
+
+* Allow reading status and perform Monit actions when using client SSL
+  certificate. Previously, if Monit http server was setup to use ssl
+  and a client cert, status and action failed. Thanks to Markus Linnala
+  for initial patch.
+
+* When the process is starting/stopping, do the process state check more
+  effectively to not stress the low power devices with aggresive polling.
+  Thanks to Thomas Petazzoni for initial patch.
+
+* Make the process start/stop wait resistant to large time changes.
+
+* Compilation: If PAM is enabled but the PAM headers or library are not
+  found by the configure script, it will report error.
+
+* Cross-compilation: the configure checks the setjmp and vsnprintf with
+  test program which usually cannot be executed when cross-compiling
+  for other architecture. The configure script now takes the following
+  arguments which allow to specify whether the setjmp works on this
+  platform and whether the vsnprintf is C99 compliant. Thanks to
+  Thomas Petazzoni for patch.
+        ./configure \
+                libmonit_cv_setjmp_available=[yes|no] \
+                libmonit_cv_vsnprintf_c99_conformant=[yes|no]
+
+* Manual page language fixes. Thanks to Jonathan Boulle for patch.
+
+
+
+Version 5.3.2
+
+BUGFIXES:
+
+* Fix bug #34801: The file content match test did reset of the
+  read position in the case that the unmonitor or stop action
+  was done. When the file monitoring was enabled again, the
+  content match test was applied to the content which was
+  tested already.
+
+* Log error details in the case that the name resolving failed.
+
+* Fix the system cpu usage statistics when pattern based process
+  check is used and the service is restarted. Thanks to Wayne
+  Lawrence for report.
+
+* AIX 6.1 compile fix. Thanks to Benedikt Wegmann for patch.
+
+* Debian Bug#652715: "include files not found" warning. Do not
+  display the warning if the include directory is empty.
+
+
+
+Version 5.3.1
+
+IMPROVEMENTS:
+
+* Log the particular connection attempt failure in debug mode
+  when the retry is enabled.
+
+* Monit can deliver events and status to independent M/Monit
+  instances if multiple mmonit URLs are set:
+      set mmonit https://user1:pass1@mmonit1/collector
+                 https://user2:pass2@mmonit2/collector
+
+BUGFIXES:
+
+* The ICMP echo (ping) test may report false positive error
+  if the machine where Monit is running has heavy ICMP
+  traffic generated by other applications.
+
+* The file content match test will be performed even on the
+  existing content when Monit starts. The last position is
+  saved to the statefile, so monit won't generate alert
+  after restart. Note that when you start the monit 5.3.1
+  the first time, it can do actions for content match which
+  was handled by previous monit version already as the
+  previous monit versions didn't saved the position.
+
+* Make the monitoring state persistent for manual mode services.
+
+* Display the memory usage total % in the status overview.
+  The memory usage in kB displayed the total already, so the
+  percentage didn't match.
+
+* Fix the HTML overview page alignment in the Internet Explorer.
+  Thanks to Darhl Thomason for patch.
+
+* Extend the SSL library search path for Debian Sid.
+
+* Fix Solaris 10 compilation and Sun Studio support.
+
+* Fix sporadic SSL routines:func(169):reason(161) errors
+
+* If MySQL protocol test failed, report the correct MySQL
+  error code. Thanks to Vitaly Lipatov for patch.
+
+
+Version 5.3
+
+* New 'check program' statement added. Allows to check the exit
+  status of an external program or script from Monit.
+
+* Added crontab style support for individual services. You can
+  now specify when an individual service should run its checks
+  (or not run). You can now, for instance, specify that apache
+  should be checked continuously, except between 1AM-5AM on
+  Sunday.
+
+* Connection retry option added. Allows to retry a network
+  connection in the same testing cycle before reporting an error.
+
+* Detailed protocol connection errors are now included in alerts.
+
+* The HTML overview page displays the CPU and memory total now
+  (including children), so real service related usage is displayed
+  also for services which spawn worker processes, such as Apache
+  or Spamassassin.
+
+* HTML view improvements
+
+* Fix MySQL protocol test: MySQL 5.5.12 returns new error code in
+  the case of authentication failure.
+
+* Fix Debian bug #621047: monit fails to build after SSLv2 removal
+
+* Fix crash on Solaris which may occur if the system load is zero.
+  Thanks to Paul Sun for report.
+
+* The stacktrace logging on error is disabled in -v (verbose) mode
+  as it was too verbose for common service debugging tasks, it can
+  be enabled using -vv option.
+
+* Improve how fast Monit check if a program was started or stopped.
+  Thanks to Michael Renner for patch. 
+
+* Fix the monitoring state presentation during service restart which
+  temporarily displayed "Not monitored", whereas the monitoring was
+  enabled.
+
+* The "data collected" is updated only if the check was not skipped.
+
+
+Version 5.2.5
+
+* Fix process match check - when the monitored process failed and
+  was restarted by Monit, Monit didn't recognized  it is  running
+  after the restart and reported  start failure (similar on stop).
+  Thanks to  Kenichi Futatsumori for report and  helping to root
+  cause the problem.
+
+* Fix Debian #617259: symbolic links in the filesystem check doesn't
+  work.  Thanks to Sergey B Kirpichev for report.
+
+* Fix Debian bug #614984: smtp protocol test issues both EHLO and
+  HELO.  Thanks to Sergey B Kirpichev for report.
+
+* Fix bug #32583: Multiple SIP OPTIONS messages use the same header
+  data.  Thanks to Hugh Waite for patch.
+
+* Try harder to get FQDN hostname for the host where monit is running.
+  The hostname in the $HOST variable which is used in the mail sender
+  may thus change. Thanks to Sergey B Kirpichev for patch.
+
+* AIX: Fix the time display which was off by GMT difference. Thanks
+  to Helen Chen for report.
+
+* AIX: Fix the M/Monit heartbeat. Thanks to Helen Chen for report.
+
+* Support symbolic link to monit configuration file.
+
+* Fix crash when monit daemon start delay option was used and monit
+  was signalized to stop before the start delay passed. Thanks to
+  John Schult for report.
+
+
+
+Version 5.2.4
+
+NEW FEATURES AND FUNCTIONS:
+
+* Added the "procmatch" CLI command which allows for easy testing
+  of pattern for process match check. The command takes regular
+  expression as an argument and displays all running processes
+  matching the pattern. Example usage:
+      $ monit procmatch "iChatAgent"
+
+* Set the default log file mask to 0640 (originally it was 0664).
+  Thanks to Sergey B Kirpichev.
+
+* Reduced monit memory footprint by ca. 10%.
+
+BUGFIXES:
+
+* FreeBSD, NetBSD, OpenBSD, MacOSX, Solaris filesystem check fix:
+  If block/character device was used in the filesystem path instead
+  of mountpoint, monit reported usage of wrong filesystem.
+
+* NetBSD filesystem check: Fix space usage report.
+
+* Fix memory usage monitoring in OpenVZ VPS 2.6.32 virtual hosts.
+  Thanks to Kelly for report.
+
+* If the protocol test failed, show the request in the event. Thanks
+  to Marco for report.
+
+* Randomize the mail message id to prevent duplicates in the case, that
+  the same hostname is used on multiple hosts running monit and messages
+  are generated in the same second in parallel. Thanks to Sergey B
+  Kirpichev.
+
+* Spelling fixes. Thanks to Sergey B Kirpichev.
+
+
+
+Version 5.2.3
+
+BUGFIXES:
+
+* Mysql protocol test supports mysql 5.5.x and newer now.
+
+
+
+Version 5.2.2
+
+BUGFIXES:
+
+* Fix crash on MacOSX
+
+* ICMP echo test (ping):
+     - bug #31128: do not log error if different response type is received
+     - bug #31129: do not require root to use ping test. Privilege to create
+       raw socket is still required, but on some platforms such as Solaris it
+       can be granted to non-root users too. If the user has no permission to
+       perform ping, monit will skip the icmp test and log message (in debug
+       mode only).
+
+* rsync protocol test:
+     - wait for full server response and verify exit was received
+     - bug #31249: send full version to rsync server. Thanks to John Hall
+       for report
+
+
+
+Version 5.2.1
+
+BUGFIXES:
+
+* HTTP and URL protocol tests: Fixed a problem where HTTP protocol
+  tests using a specific request always failed. This bug may also
+  affect URL tests. The problem was caused by faulty URL encoding. In
+  the process of fixing this bug the new feature that allowed slash in
+  service names has been reverted and instead will be added in a later
+  release.
+
+
+
+Version 5.2
+
+NEW FEATURES AND FUNCTIONS:
+
+* Added support for monitoring processes without pidfile using pattern
+  matching. You can use POSIX regular expressions or string matching
+  process name with arguments as provided by the 'ps' utility. If the
+  pattern matches multiple processes, the first match is used.
+  Example:
+      check process debian 
+            matching "/usr/lib/vmware/bin/vmware-vmx .*deb.vmx"
+
+* Added support for swap monitoring. Example:
+      check system myserver
+          if swap usage > 25% then alert
+
+* Allow to override the default action when service doesn't exist. The
+  default action is restart, it can be customized with following
+  statement:
+    if [does] not exist [[<x> times within] <y> cycles] then <action1>
+
+* Monit automatically registers credentials with M/Monit now, so it's
+  not necessary to set it manually in M/Monit anymore. To disable
+  credentials registration:
+     set mmonit https://monit:monit@10.0.0.1:8443/collector
+         and register without credentials
+
+* Added memcache protocol test. Thanks to Sébastien Debrard for the
+  patch.
+
+* Added openssl FIPS to Monit httpd. Thanks to Lior Okman for the
+  patch.
+
+* The 'check system' can now use start/stop program statements too.
+
+* Added the option to set the "Reply-To" mail header in mail-format.
+
+* Display backtrace on error if debug mode is enabled (requires
+  backtrace support in libc)
+
+BUGFIXES:
+
+* Show real process uptime - formerly the presented uptime was based
+  on create and modify timestamp of process' pidfile which provides
+  invalid uptime if the pidfile is replaced and process keeps running
+  with original PID. Thanks to Nima Chavooshi for report.
+
+* When user triggered action for some service (such as stop) and
+  before that action completed user triggered another action for the
+  same service (such as start), the second action has been ignored.
+  Monit will not accept new action and return temporary error until
+  the previous action completed.
+
+* If process resource usage gathering failed, retry next cycle as the
+  error can be temporary.
+
+* Fixed sporadic failures when SSL was used.
+
+* ICMP echo test (ping):
+     - fixed sporadic false positive/negative
+     - removed limit of 20 pings per cycle
+
+* DNS test:
+     - accept NS root request refusal as correct response because
+       server reacts on request
+     - accept authority answer as alternative to record. Thanks to
+       Nick Osborn for patch
+
+* RADIUS test fix. Thanks to Alan DeKok for patch.
+
+* M/Monit heartbeat is fully independent of testing cycle now to
+  prevent false positive when service test blocks.
+
+* Fixed SMTP STARTTLS protocol, required for servers that adhere
+  strictly to RFC 3207 4.2. Thanks to Lorenzo A. Sedano Cadinanos for
+  patch.
+
+* Service name:
+     - allow the service name to start with "/"
+     - fixed handling of the service names which contain "/" in the
+       name in Monit web interface. Thanks to Artyom Khafizov for
+       patch.
+  
+* When 'check system' is not defined, monit adds it automatically
+  using hostname for service name. If existing service was defined
+  with the same service name (matching hostname), monit didn't added
+  the entry and reported confusing error message pointing to the end
+  of configuration file. Thanks to Thorsten Kampe for report and help.
+
+* Remove extra NL characters from message when resource succeeded
+  event is sent. The extra NL character may break the mail headers.
+  Thanks to Hanno Boeck for patch.
+
+* Fixed display of cpu user/system/wait usage which temporarily
+  displayed -1.0% between two monitoring cycles while cpu monitoring
+  was initializing. Thanks to Marcus Muelbuesch for report.
+
+* Fixed display of port response time as -1 if 'monit status' was
+  called in the middle of service test.
+
+* Fixed display of service initializing state after monit start or
+  reload.
+
+* Fixed MONIT_DESCRIPTION environment variable. Thanks to Marco
+  Roeland for patch
+
+* AIX:
+     - fixed compilation
+     - fixed system load average monitoring
+     - fixed ICMP echo test
+
+* Mac OS X:
+     - allow monitoring of system-wide load average, cpu and memory
+       usage even if
+       Monit is running as non-root user
+
+* NetBSD:
+     - fixed ICMP echo test
+
+
+
+Version 5.1.1
+
+BUGFIXES:
+
+* Fix FTP protocol test. Thanks to Axel Reinhold for report.
+
+* Fix the HTTP protocol test's hostheader option which was added in 5.1.
+  Thanks to Naoya Nakazawa for report.
+
+* Removed warning about missing system service check. Missing system service
+  check is not error and it shouldn't be reported as such.
+
+* Fix manual page formating. Thanks to Stefan Alfredsson for report.
+
+
+
+Version 5.1
+
+NEW FEATURES AND FUNCTIONS:
+
+* It is now possible to define any action for the restart timeout rule.
+  Multiple restart timeout rules can also be defined. Example:
+      if 3 restarts within 5 cycles then exec "/foo/bar"
+      if 8 restarts within 10 cycles then unmonitor
+
+* Service can be added to multiple groups. Thanks to Brad Gessler
+  for suggestion. Syntax:
+    check filesystem wwwdata with path /www
+      group www
+      group filesystem
+
+* Added GPS protocol test. Thanks to Sebastien Debrard for patch.
+
+* Added RADIUS protocol test. Thanks to Alan DeKok for patch. Example syntax:
+    check process radiusd with pidfile /var/run/radiusd.pid
+       start program = "/etc/init.d/freeradius start"
+       stop program = "/etc/init.d/freeradius stop"
+       if failed 
+          host 127.0.0.1 port 2000 type udp protocol radius secret testing1234 
+       then alert
+       if 5 restarts within 5 cycles then timeout
+
+* The HTTP protocol test now supports a hostheader option which allows to
+  override Host header in HTTP request. It can be used for example
+  to test a farm of HTTP servers by IP addresses and to set specific
+  Host header. Thanks to Brady Catherman for patch. Example:
+    if failed host 192.168.1.100 protocol http hostheader "example.com" then alert
+
+* If an error occur during Monit command-line execution, report the error
+  and exit with 1, so it is possible to react if Monit is used from a script.
+  On success, 0 is returned as usual. Previously, Monit always exited with
+  0 even if an error occurred.
+
+* Do not require SSL version type when specifying SSL communication with M/Monit
+  (SSL version is set to auto).
+
+* If the Monit http interface failed to start, provide more details about
+  the reason.
+
+BUGFIXES:
+
+* Support resource monitoring (cpu usage, etc.) when Monit is running
+  inside virtual environment. Tested on:
+      - FreeBSD jail
+      - Solaris zone
+      - Linux Vserver
+
+* Fix #26752: inside Solaris Zone, Monit failed to detect children
+  and computed host memory wrong
+
+* On Solaris, FreeBSD, NetBSD and OpenBSD, Monit no longer needs to run as root user
+  in order to be able to watch process resource usage (cpu and memory).
+
+* Send heartbeat to M/Monit even if Monit is busy in a long testing cycle to prevent
+  false alerts about non-responsive Monit agent.
+
+* Fixed SMTP protocol test which may sometimes incorrectly
+  report ESMTP protocol failure. Thanks to Axel Reinhold for
+  report.
+
+* Fixed content match check which reported only first
+  match during the same cycle. Thanks to Pavel Shevaev for
+  report.
+  
+* Allow for the use of complete SSL certificate chains. 
+  Thanks to Lawrence Tan for patch.
+
+* Added support for multiline greetings to FTP protocol test.
+  Thanks to Giovanni D'Cristina for report.
+
+* Fix Debian Bug #541139: uses gethostbyname() and thus does
+  not work with "options inet6" in /etc/resolv.conf. Thanks to
+  Michael Stapelberg for patch.
+
+* If Monit configuration allowed http interface access for a read-only
+  user and it was specified as the first allow entry, Monit command line
+  commands failed because it used the read-only account so commands
+  like start, stop, etc. were rejected. Monit will now use full access
+  regardless of allow option order. Thanks to Thorsten Kampe for report.
+
+* Passive monitoring mode fixed. Thanks to Nelson Vale for report.
+
+* Fixed #27784: wait_start/wait_stop can advance too quickly.
+  Thanks to Randy Puro for report.
+
+* Solaris resource usage fixed when Monit was compiled with optimizations enabled.
+
+* Fixed #28369: escape XML properly
+
+* Check service name uniqueness when 'check system' is missing in monitrc and virtual
+  system service with name set to local hostname is added. Thanks to Marcus Muelbuesch
+  for report.
+
+* Fix crash when queued event delivery was retried for service which was no longer
+  configured in Monit.
+
+
+
+Version 5.0.3
+
+BUGFIXES:
+
+* Fixed #26664: crash on service timeout or unmonitor action
+  (introduced in 5.0.2). Thanks to Bretislav Kubesa and
+  Michael Shigorin for report.
+
+* Removed the configure --without-resource option. If the user
+  who is running Monit doesn't have permissions to check the
+  processes state, the related checks are disabled dynamically. 
+
+
+
+Version 5.0.2
+
+BUGFIXES:
+
+* 35 improvements based on code scan with Klocwork
+  (http://www.klocwork.com/) which we were evaluating.
+  Huge thanks to Klocwork for their great product.
+
+* Fixed #26382: if start or stop script for some service didn't
+  exist, monit logged error during configuration file parsing and
+  refused to start. Monit now just logs warning and continues.
+
+
+
+Version 5.0.1
+
+BUGFIXES:
+
+* Fixed a bug where Monit did not stop logging succeeded events.
+  This bug occurred if PID, PPID, timestamp or size change tests
+  were used and failed and then succeeded again.
+
+
+
+Version 5.0
+
+NEW FEATURES AND FUNCTIONS:
+
+* M/Monit support added. If you run Monit on more than one
+  server, you can use M/Monit to manage and control all your
+  Monit enabled servers from one simple Web Interface. See
+  http://mmonit.com/ for details.
+
+* Support use of symbolic links in filesystem check. Thanks to
+  Aleksander Kamenik for suggestion. Example:
+    check filesystem rootfs path 
+         /dev/disk/by-uuid/4ef973f7-67d1-4bb0-8223-cb1c692b72e4
+      if space usage > 95% then alert
+      if inode usage > 95% then alert
+
+* If no 'set mailserver' was defined in monitrc, Monit tried to
+  fallback to localhost:25 SMTP server. This fallback was removed
+  since it may be confusing. If you want to deliver mail alerts
+  from Monit, the 'set mailserver' option is necessary. In case
+  it is missing, Monit will log appropriate error and hint to add
+  it.
+
+* The generic send/expect protocol test limited the expect input
+  to 256 bytes. It's possible to set the input buffer for expect
+  globally - for example: set expectbuffer 20 kb Thanks to Asil
+  Carlin for suggestion.
+
+* The following event types were added CONTENT, FSFLAGS, PID and
+  PPID and the following generic event types CHANGED and MATCH were
+  removed and replaced by the above types and with the existing SIZE,
+  CHECKSUM, TIMESTAMP events so the information is more specific
+  The event types are internal to Monit and unless you have used
+  either CHANGED or MATCH event in your alert filters, no change
+  is necessary (alerts are delivered as usual, the tests just use
+  different types internally).
+  
+* Monit now generates a unique id on first start and store the id
+  in a permanent file. This id is used in protocol communication
+  between Monit and M/Monit to pair a Monit instance with it's
+  host entry in M/Monit. By default the id file is placed in
+  $HOME/.monit.id. The location can be changed by using the set
+  idfile statement, for example:
+    set idfile /var/monit.id
+
+* Monit now keep its service monitoring state even on Monit
+  restart. Previously Monit dropped the state when it was stopped
+  correctly. Services in manual monitoring mode will remember the
+  monitoring state across Monit restarts. If Monit is used in a
+  cluster, it is recommended to place the state file in a
+  temporary filesystem incase the primary machine will crash and
+  the the spare machine takeover, the state will be dropped on
+  reboot for the crashed machine and the services in manual
+  monitoring mode won't be started on reboot. For example the
+  "set statefile /tmp/monit.state" can be used to place the state
+  file in the /tmp/ filesystem.
+
+* Added a protocol test for testing the LMTP protocol. Thanks
+  to Fco. Javier Felix for patch.
+
+* Added the start delay option for daemon statement which allows
+  to pause Monit on its startup for a while. If monitored
+  services are started by init scripts in parallel on system
+  boot, Monit may be too fast and detect that the service is not
+  running (yet) and restart the service. Note that it's still
+  recommended Monit is setup to be responsible for service
+  startup (that is, don't use init to start Monit controlled
+  services, instead use Monit). This will ensure correct startup
+  without need for a start delay since Monit will have full
+  control of service startup. Many users start services from init
+  on boot anyway, so in such cases this option will solve their
+  problems. Default start delay is 0 which corresponds to the
+  current behavior. Example syntax which will make Monit wait one
+  minute before starting its first monitoring cycle:
+  --8<--
+    set daemon 5 with start delay 60
+  --8<--
+  Thanks to Fco. Javier Felix for patch.
+
+* Added PAM support for Monit http interface authentication. Note
+  that PAM is not supported on all platforms - currently works on
+  Linux, Mac OS X, FreeBSD, NetBSD. Monit uses the PAM service "monit".
+  Here is a Monit PAM service example for Mac OS X which is able
+  to authenticate system users for Monit access -
+  /etc/pam.d/monit:
+  --8<--
+    # monit: auth account password session
+    auth       sufficient     pam_securityserver.so
+    auth       sufficient     pam_unix.so
+    auth       required       pam_deny.so
+    account    required       pam_permit.so
+  --8<--
+  And configuration for monitrc which allows only group admins
+  to access the http interface:
+  --8<--
+    set httpd port 2812 allow @admin
+  --8<--
+  See the PAM manual page for details on how to configure the PAM
+  service on your system and the available PAM plugins. Thanks to
+  Wilhelm Meier for patch.
+
+* Added more detailed reports for Monit resource tests on service
+  recovery. Thanks to Lars Kotthoff for patch.
+
+* Set locale to C.
+
+* Added a protocol test for testing the SIP protocol which is
+  used by popular communication servers such as Asterisk and
+  FreeSWITCH. We received two patches for this protocol and have
+  taken code from both and merged them. Many thanks to Bret 
+  McDanel and to Pierrick Grasland for supplying the patches.
+
+* Added MONIT_DESCRIPTION to the list of environment variables
+  available to programs started by monit. Thanks to Morten 
+  Bressendorff Schmidt for patch.
+
+* If a service group is specified for Monit CLI action,
+  Monit no longer requires the "all" verb, so the following
+  command is possible:
+    monit -g web stop
+  If group is not specified (i.e. the -g option is omitted), the
+  service name or "all" is still required as a safeguard.
+
+* Added an option to the 'set mailserver' statement so it is
+  possible to override the hostname used in SMTP EHLO/HELO and in
+  the Message-ID header when sending mail. Monit defaults to use
+  the localhost name. I.e. what you get when executing this
+  command 'uname -n'. Overriding the host name can be useful if
+  the host does not have a DNS entry and if the receiving
+  mailserver uses DNS verification as spam protection. The new
+  override option is:
+  set mailserver foo.bar.baz using hostname "my.monit.host"
+
+* A new Event_Action type was added which reports actions
+  performed on Monit's administrator request (either via web
+  interface or CLI). If you don't want to received these events,
+  you can set the mail-filter for "action" event type.
+
+* NOTA BENE: Monit start action is synchronous now. This improves
+  the startup sequence for dependent services, since Monit will
+  wait for parent service to start before trying to start the
+  child.
+
+* It is now possible to define execution timeout for start and
+  stop commands. That is, how long Monit will wait after
+  executing a command before it assume execution failed. If the
+  timeout option is omitted, Monit defaults to 30 seconds. You
+  can override the timeout for example for services which are
+  starting slower.
+  Example syntax:
+    start program = "/bin/foo start" with timeout 60 seconds
+
+* The event passed state is renamed to succeeded as this name
+  more reflects the state of things.
+
+* The device service test is renamed to filesystem.
+
+BUGFIXES:
+
+* Some linux virtualization platforms report CPU count as 0.
+  Monit then dynamically disabled CPU usage monitoring. In such
+  case we now override the CPU count from 0 to 1 so resource
+  usage monitoring can continue. Thanks to Jenny Hopkins for
+  report.
+
+* Increased the server socket backlog queue which will make Monit
+  able to handle more services. Thanks to Jochen Kramer.
+
+* Fixed #24866: Email messages such as: cpu wait usage check
+  succeeded [current cpu wait usage=17.4%] were displayed as
+  "...usage<SOMEGARBAGE>.4%". The problem was incorrect transfer
+  encoding header in the email (the body itself was OK). Thanks
+  to Dave Cheney for report.
+
+* When a Monit shutdown requested was issued while Monit were
+  working and testing services, Monit did not shutdown until all
+  work were done, i.e. until all services were tested. Monit will
+  now shutdown faster - as soon as it finish testing the current
+  service.
+
+* Monit blocked/unblocked SIGTERM, SIGINT SIGHUP and SIGUSR1
+  signals during operation to protect certain code sections. When
+  a signal was sent during such a time, for example to stop
+  Monit, it was dropped and had to be retried in order to stop
+  Monit. This limitation is now removed and signals will be
+  processed at any time. Thanks to Nicola Tiling for report.
+
+* If the Monit httpd allow option did not include a
+  user:password, Monit CLI logged the following error (even if
+  the action was performed anyway):
+     Cleartext credentials needed for basic authorization!
+  This error was false - even access restriction based on
+  host/net is sufficient - user and password is just one of
+  possible options (not requirement). Thanks to Gilad Benjamini
+  for report.
+
+* Allow localhost as a value for the host header in the http
+  protocol test instead of setting an empty host header and let
+  the http server decide
+
+* The 'if changed checksum ...' test can now be used even if a
+  monitored file doesn't exist at Monit startup. Thanks to Joe
+  Shang for report.
+
+* If both event handlers (M/Monit and mail alerts) temporarily
+  failed at once and event queue was enabled, events will be
+  stored in the queue and delivered in the next cycle. However, a
+  bug caused delivery to be retried for every cycle for both
+  handlers if just one of them was recovered. Monit could then
+  deliver the same message multiple times until both handlers
+  recovered. The problem is now fixed and only one copy of the
+  event is sent even if only one handler did recover.
+
+* Make unit in size test optional and default to byte unless
+  specified. So it is possible to write, if size > 1000 then ..
+
+* Fixed handling of invalid input files in event queue handler.
+  Thanks to Fco.Javier Felix for patch.
+
+* Set the content type to text/html for Monit web interface POST
+  responses. Thanks to Rich Drummond for patch.
+
+* Fixed #23530: configure script will return error if bison,
+  byacc or yacc are not found at Monit compile time.
+
+* Fix CPU and memory monitoring on Solaris (it was disabled on
+  Monit start)
+
+* AIX fixes and extensions, Monit should run on AIX without
+  problems, including cpu, memory and filesystem monitoring
+  (tested with AIX 5.3). Thanks to Brian Downey for support
+  and help.
+
+* HP-UX fixes and extensions, Monit should run on HP-UX without
+  problems, including cpu, memory and filesystem monitoring.
+  Thanks to Brian Downey for support and help.
+
+* Fixed #23467: Don't exit, only issue a warning if the "include"
+  statement did not find any files to include.
+
+* Fixed #23530: Event queue did not work with the default
+  unlimited slots.
+
+* Fixed #23617: The process cpu usage is initializing in the
+  first cycle so the value is set to 0% - if the 'cpu usage <
+  xyz%' test was used to check that the process usage is higher
+  then given level, it was always true. Monit now skips the
+  process cpu usage check in the first cycle.
+
+* Make sure Monit alerts has a unique message id. Thanks to Steve
+  Purcell for report
+
+* Fixed possible crash when Monit is watching VPS environment on
+  Linux which reports number of CPUs as 0. Thanks to Marius
+  Schmidt for report.
+
+* Cleanup event states during a service stop/unmonitor so old 
+  events are not sent when the service is started/monitored again.
+
+* Fixed #21989: Monit could start two instances of the process
+  when service restart is performed and the process is starting
+  slowly. Thanks to Nick Upson, Aaron Scamehorn and David Greaves
+  for report.
+
+* Fixed #21550: Fix crash when Monit event queue contained an
+  empty file. Thanks to Douglas J Hunley for report.
+
+* Fixed possible crash when the 'if changed checksum' test was
+  used along with restart action. Thanks to Brian Candler for
+  report.
+
+* Fixed #22075: Allow using a mail address as username when using
+  SMTP authentication.
+
+* Fixed #22191 and #19823: If the file content test does not match
+  anymore, reset the service error state. (Previous versions did 
+  not clear the error state and kept showing a match in the status
+  listing and in the http interface).
+
+* The 'if changed size ...' test can now be used even if the
+  monitored file does not exist on monit's start.
+
+* If a htpasswd file is used to control Monit http interface
+  access and the hash type is set to MD5 but the file contains
+  wrong format (non-MD5), report the error and keep running.
+  Formerly Monit exited with an assert exception. Thanks to
+  Adrian Bridgett for report.
+
+BACKWARD INCOMPATIBLE CHANGES:
+
+* The current CPU usage test which checked the cpu usage of the
+  process itself plus the cpu usage of child processes was
+  renamed to TOTALCPU (otherwise it works the same). The new CPU
+  usage test checks the CPU usage of the process itself only.
+  This change was introduced to align the syntax with MEMORY and
+  TOTALMEMORY tests and to allow to test the CPU usage of
+  processes which fork child processes but the user don't want to
+  include children (such as Mythtv). Users who are using the CPU
+  check for services like Apache webserver to watch total cpu
+  utilization (including children) should rename the CPU
+  statement in their configuration to TOTALCPU.
+
diff --git a/monit-5.4/COPYING b/monit-5.4/COPYING
new file mode 100644
index 0000000..77a25e0
--- /dev/null
+++ b/monit-5.4/COPYING
@@ -0,0 +1,677 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, 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
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state 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 program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
+
+                        License Exception
+
+In addition, as a special exception, the copyright holders give
+permission to link the code of portions of this program with the
+OpenSSL library under certain conditions as described in each
+individual source file, and distribute linked combinations
+including the two.
+
+You must obey the GNU General Public License in all respects
+for all of the code used other than OpenSSL. If you modify
+file(s) with this exception, you may extend this exception to your
+version of the file(s), but you are not obligated to do so. If you
+do not wish to do so, delete this exception statement from your
+version. If you delete this exception statement from all source
+files in the program, then also delete it here.
diff --git a/monit-5.4/Makefile.am b/monit-5.4/Makefile.am
new file mode 100644
index 0000000..9213a6a
--- /dev/null
+++ b/monit-5.4/Makefile.am
@@ -0,0 +1,152 @@
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
+ACLOCAL_AMFLAGS	 = -I m4
+
+EXTRA_DIST	= README CHANGES COPYING bootstrap doc src config monitrc contrib libmonit monit.1
+
+SUBDIRS		= libmonit
+
+CC		= @CC@
+FLEX		= @FLEX@
+FLEXFLAGS	= -i
+YACC		= @YACC@
+YACCFLAGS	= -dvt
+POD2MAN		= @POD2MAN@
+POD2MANFLAGS	= @POD2MANFLAGS@
+
+AM_CPPFLAGS	= $(CPPFLAGS) $(EXTCPPFLAGS) -D@ARCH@ -DSYSCONFDIR="\"@sysconfdir@\""
+AM_LDFLAGS	= $(LDFLAGS) $(EXTLDFLAGS) -L./lib/
+INCLUDES	= -I./src -I./src/device -I./src/http -I./src/process -I./src/protocols 
+INCLUDES	+= -I./libmonit/src
+
+bin_PROGRAMS	= monit
+monit_SOURCES	= src/y.tab.c \
+		  src/lex.yy.c \
+		  src/monit.c \
+		  src/alert.c \
+		  src/collector.c \
+		  src/control.c \
+		  src/daemonize.c \
+		  src/env.c \
+		  src/event.c \
+		  src/file.c \
+		  src/gc.c \
+		  src/http.c \
+		  src/log.c \
+		  src/md5.c \
+		  src/md5_crypt.c \
+		  src/net.c \
+		  src/process.c \
+		  src/sendmail.c \
+		  src/sha1.c \
+		  src/signal.c \
+		  src/socket.c \
+		  src/spawn.c \
+		  src/ssl.c \
+		  src/state.c \
+		  src/status.c \
+		  src/util.c \
+		  src/validate.c \
+		  src/xml.c \
+		  src/http/base64.c \
+		  src/http/cervlet.c \
+		  src/http/engine.c \
+		  src/http/processor.c \
+		  src/protocols/apache_status.c \
+		  src/protocols/clamav.c \
+		  src/protocols/default.c \
+		  src/protocols/dns.c \
+		  src/protocols/dwp.c \
+		  src/protocols/ftp.c \
+		  src/protocols/generic.c \
+		  src/protocols/gps.c \
+		  src/protocols/http.c \
+		  src/protocols/imap.c \
+		  src/protocols/ldap2.c \
+		  src/protocols/ldap3.c \
+		  src/protocols/lmtp.c \
+		  src/protocols/memcache.c \
+		  src/protocols/mysql.c \
+		  src/protocols/nntp.c \
+		  src/protocols/ntp3.c \
+		  src/protocols/pgsql.c \
+		  src/protocols/pop.c \
+		  src/protocols/postfix_policy.c \
+		  src/protocols/protocol.c \
+		  src/protocols/radius.c \
+		  src/protocols/rdate.c \
+		  src/protocols/rsync.c \
+		  src/protocols/sip.c \
+		  src/protocols/smtp.c \
+		  src/protocols/ssh.c \
+		  src/protocols/tns.c \
+		  src/device/device_common.c \
+		  src/device/sysdep_@ARCH@.c \
+		  src/process/process_common.c \
+		  src/process/sysdep_@ARCH@.c
+ 
+monit_LDADD 	= libmonit/libmonit.la
+monit_LDFLAGS 	= -static $(EXTLDFLAGS)
+
+man_MANS 	= monit.1
+
+BUILT_SOURCES   = src/lex.yy.c src/y.tab.c src/tokens.h
+
+CLEANFILES	= 
+DISTCLEANFILES	= *~ $(BUILT_SOURCES)
+
+
+# -------
+# Targets
+# -------
+
+dist-hook::
+	-rm -rf `find $(distdir) -name "._*"`
+	-rm -rf `find $(distdir) -name ".DS_Store"`
+	-rm -rf `find $(distdir) -name ".libs"`
+	-rm -rf `find $(distdir) -name ".svn"`
+	-rm -rf `find $(distdir) -name ".dirstamp"`
+	-rm -rf $(distdir)/libmonit/libmonit.xcodeproj
+	-rm -rf $(distdir)/libmonit/config.log
+	-rm -rf $(distdir)/libmonit/config.status
+	-rm -rf $(distdir)/libmonit/autom4te.cache
+	-rm -f $(distdir)/src/config.h
+	-rm -f $(distdir)/src/stamp-*
+	-rm -f $(distdir)/src/y.output
+	-perl -pi -e 's/^Version: .*/Version: '$(VERSION)'/' $(distdir)/contrib/packages/redhat/monit.spec
+	-chmod 600 monitrc
+	
+clean-local:
+	-rm -f `find . -name "*.o" -o -name "*.lo" -o -name "*.loT" -o -name "*~"`
+
+distclean-local:
+	-rm -rf autom4te.cache/ \
+		src/y.output \
+		monit-[0-9].*tar.gz
+	-rm -rf lib include
+
+cleanall: clean distclean
+	-rm -f Makefile.in configure aclocal.m4 autom4te.cache src/config.h.in monit.1 config/config.*
+	-rm -rf m4
+		
+monit.1: doc/monit.pod
+	$(POD2MAN) $(POD2MANFLAGS) $< > $@
+	-rm -f pod2*
+
+
+# -------------
+# Grammar rules
+# -------------
+
+src/y.tab.c src/tokens.h : src/p.y
+	$(YACC) $(YACCFLAGS) $< -o src/y.tab.c
+	-echo "#include <config.h>" > src/.y.tab.c
+	-cat src/y.tab.c >> src/.y.tab.c
+	-mv src/.y.tab.c src/y.tab.c
+	-mv src/y.tab.h src/tokens.h
+	
+src/lex.yy.c: src/l.l
+	$(FLEX) $(FLEXFLAGS) -o$@ $< 
+
+
diff --git a/monit-5.4/Makefile.in b/monit-5.4/Makefile.in
new file mode 100644
index 0000000..280b1d4
--- /dev/null
+++ b/monit-5.4/Makefile.in
@@ -0,0 +1,1220 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = monit$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure \
+	$(top_srcdir)/contrib/monit.service.in \
+	$(top_srcdir)/contrib/monit.upstart.in \
+	$(top_srcdir)/src/config.h.in COPYING config/config.guess \
+	config/config.sub config/install-sh config/ltmain.sh \
+	config/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = contrib/monit.upstart contrib/monit.service
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__dirstamp = $(am__leading_dot)dirstamp
+am_monit_OBJECTS = src/y.tab.$(OBJEXT) src/lex.yy.$(OBJEXT) \
+	src/monit.$(OBJEXT) src/alert.$(OBJEXT) \
+	src/collector.$(OBJEXT) src/control.$(OBJEXT) \
+	src/daemonize.$(OBJEXT) src/env.$(OBJEXT) src/event.$(OBJEXT) \
+	src/file.$(OBJEXT) src/gc.$(OBJEXT) src/http.$(OBJEXT) \
+	src/log.$(OBJEXT) src/md5.$(OBJEXT) src/md5_crypt.$(OBJEXT) \
+	src/net.$(OBJEXT) src/process.$(OBJEXT) src/sendmail.$(OBJEXT) \
+	src/sha1.$(OBJEXT) src/signal.$(OBJEXT) src/socket.$(OBJEXT) \
+	src/spawn.$(OBJEXT) src/ssl.$(OBJEXT) src/state.$(OBJEXT) \
+	src/status.$(OBJEXT) src/util.$(OBJEXT) src/validate.$(OBJEXT) \
+	src/xml.$(OBJEXT) src/http/base64.$(OBJEXT) \
+	src/http/cervlet.$(OBJEXT) src/http/engine.$(OBJEXT) \
+	src/http/processor.$(OBJEXT) \
+	src/protocols/apache_status.$(OBJEXT) \
+	src/protocols/clamav.$(OBJEXT) src/protocols/default.$(OBJEXT) \
+	src/protocols/dns.$(OBJEXT) src/protocols/dwp.$(OBJEXT) \
+	src/protocols/ftp.$(OBJEXT) src/protocols/generic.$(OBJEXT) \
+	src/protocols/gps.$(OBJEXT) src/protocols/http.$(OBJEXT) \
+	src/protocols/imap.$(OBJEXT) src/protocols/ldap2.$(OBJEXT) \
+	src/protocols/ldap3.$(OBJEXT) src/protocols/lmtp.$(OBJEXT) \
+	src/protocols/memcache.$(OBJEXT) src/protocols/mysql.$(OBJEXT) \
+	src/protocols/nntp.$(OBJEXT) src/protocols/ntp3.$(OBJEXT) \
+	src/protocols/pgsql.$(OBJEXT) src/protocols/pop.$(OBJEXT) \
+	src/protocols/postfix_policy.$(OBJEXT) \
+	src/protocols/protocol.$(OBJEXT) \
+	src/protocols/radius.$(OBJEXT) src/protocols/rdate.$(OBJEXT) \
+	src/protocols/rsync.$(OBJEXT) src/protocols/sip.$(OBJEXT) \
+	src/protocols/smtp.$(OBJEXT) src/protocols/ssh.$(OBJEXT) \
+	src/protocols/tns.$(OBJEXT) src/device/device_common.$(OBJEXT) \
+	src/device/sysdep_@ARCH@.$(OBJEXT) \
+	src/process/process_common.$(OBJEXT) \
+	src/process/sysdep_@ARCH@.$(OBJEXT)
+monit_OBJECTS = $(am_monit_OBJECTS)
+monit_DEPENDENCIES = libmonit/libmonit.la
+monit_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(monit_LDFLAGS) \
+	$(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(monit_SOURCES)
+DIST_SOURCES = $(monit_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+ARCH = @ARCH@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FLEX = @FLEX@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POD2MAN = @POD2MAN@
+POD2MANFLAGS = @POD2MANFLAGS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+YACC = @YACC@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sslincldir = @sslincldir@
+ssllibdir = @ssllibdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
+ACLOCAL_AMFLAGS = -I m4
+EXTRA_DIST = README CHANGES COPYING bootstrap doc src config monitrc contrib libmonit monit.1
+SUBDIRS = libmonit
+FLEXFLAGS = -i
+YACCFLAGS = -dvt
+AM_CPPFLAGS = $(CPPFLAGS) $(EXTCPPFLAGS) -D@ARCH@ -DSYSCONFDIR="\"@sysconfdir@\""
+AM_LDFLAGS = $(LDFLAGS) $(EXTLDFLAGS) -L./lib/
+INCLUDES = -I./src -I./src/device -I./src/http -I./src/process \
+	-I./src/protocols -I./libmonit/src
+monit_SOURCES = src/y.tab.c \
+		  src/lex.yy.c \
+		  src/monit.c \
+		  src/alert.c \
+		  src/collector.c \
+		  src/control.c \
+		  src/daemonize.c \
+		  src/env.c \
+		  src/event.c \
+		  src/file.c \
+		  src/gc.c \
+		  src/http.c \
+		  src/log.c \
+		  src/md5.c \
+		  src/md5_crypt.c \
+		  src/net.c \
+		  src/process.c \
+		  src/sendmail.c \
+		  src/sha1.c \
+		  src/signal.c \
+		  src/socket.c \
+		  src/spawn.c \
+		  src/ssl.c \
+		  src/state.c \
+		  src/status.c \
+		  src/util.c \
+		  src/validate.c \
+		  src/xml.c \
+		  src/http/base64.c \
+		  src/http/cervlet.c \
+		  src/http/engine.c \
+		  src/http/processor.c \
+		  src/protocols/apache_status.c \
+		  src/protocols/clamav.c \
+		  src/protocols/default.c \
+		  src/protocols/dns.c \
+		  src/protocols/dwp.c \
+		  src/protocols/ftp.c \
+		  src/protocols/generic.c \
+		  src/protocols/gps.c \
+		  src/protocols/http.c \
+		  src/protocols/imap.c \
+		  src/protocols/ldap2.c \
+		  src/protocols/ldap3.c \
+		  src/protocols/lmtp.c \
+		  src/protocols/memcache.c \
+		  src/protocols/mysql.c \
+		  src/protocols/nntp.c \
+		  src/protocols/ntp3.c \
+		  src/protocols/pgsql.c \
+		  src/protocols/pop.c \
+		  src/protocols/postfix_policy.c \
+		  src/protocols/protocol.c \
+		  src/protocols/radius.c \
+		  src/protocols/rdate.c \
+		  src/protocols/rsync.c \
+		  src/protocols/sip.c \
+		  src/protocols/smtp.c \
+		  src/protocols/ssh.c \
+		  src/protocols/tns.c \
+		  src/device/device_common.c \
+		  src/device/sysdep_@ARCH@.c \
+		  src/process/process_common.c \
+		  src/process/sysdep_@ARCH@.c
+
+monit_LDADD = libmonit/libmonit.la
+monit_LDFLAGS = -static $(EXTLDFLAGS)
+man_MANS = monit.1
+BUILT_SOURCES = src/lex.yy.c src/y.tab.c src/tokens.h
+CLEANFILES = 
+DISTCLEANFILES = *~ $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+src/config.h: src/stamp-h1
+	@if test ! -f $@; then \
+	  rm -f src/stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; \
+	else :; fi
+
+src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status
+	@rm -f src/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(top_srcdir)/src/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f src/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f src/config.h src/stamp-h1
+contrib/monit.upstart: $(top_builddir)/config.status $(top_srcdir)/contrib/monit.upstart.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+contrib/monit.service: $(top_builddir)/config.status $(top_srcdir)/contrib/monit.service.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p || test -f $$p1; \
+	  then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' `; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/y.tab.$(OBJEXT): src/$(am__dirstamp)
+src/lex.yy.$(OBJEXT): src/$(am__dirstamp)
+src/monit.$(OBJEXT): src/$(am__dirstamp)
+src/alert.$(OBJEXT): src/$(am__dirstamp)
+src/collector.$(OBJEXT): src/$(am__dirstamp)
+src/control.$(OBJEXT): src/$(am__dirstamp)
+src/daemonize.$(OBJEXT): src/$(am__dirstamp)
+src/env.$(OBJEXT): src/$(am__dirstamp)
+src/event.$(OBJEXT): src/$(am__dirstamp)
+src/file.$(OBJEXT): src/$(am__dirstamp)
+src/gc.$(OBJEXT): src/$(am__dirstamp)
+src/http.$(OBJEXT): src/$(am__dirstamp)
+src/log.$(OBJEXT): src/$(am__dirstamp)
+src/md5.$(OBJEXT): src/$(am__dirstamp)
+src/md5_crypt.$(OBJEXT): src/$(am__dirstamp)
+src/net.$(OBJEXT): src/$(am__dirstamp)
+src/process.$(OBJEXT): src/$(am__dirstamp)
+src/sendmail.$(OBJEXT): src/$(am__dirstamp)
+src/sha1.$(OBJEXT): src/$(am__dirstamp)
+src/signal.$(OBJEXT): src/$(am__dirstamp)
+src/socket.$(OBJEXT): src/$(am__dirstamp)
+src/spawn.$(OBJEXT): src/$(am__dirstamp)
+src/ssl.$(OBJEXT): src/$(am__dirstamp)
+src/state.$(OBJEXT): src/$(am__dirstamp)
+src/status.$(OBJEXT): src/$(am__dirstamp)
+src/util.$(OBJEXT): src/$(am__dirstamp)
+src/validate.$(OBJEXT): src/$(am__dirstamp)
+src/xml.$(OBJEXT): src/$(am__dirstamp)
+src/http/$(am__dirstamp):
+	@$(MKDIR_P) src/http
+	@: > src/http/$(am__dirstamp)
+src/http/base64.$(OBJEXT): src/http/$(am__dirstamp)
+src/http/cervlet.$(OBJEXT): src/http/$(am__dirstamp)
+src/http/engine.$(OBJEXT): src/http/$(am__dirstamp)
+src/http/processor.$(OBJEXT): src/http/$(am__dirstamp)
+src/protocols/$(am__dirstamp):
+	@$(MKDIR_P) src/protocols
+	@: > src/protocols/$(am__dirstamp)
+src/protocols/apache_status.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/clamav.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/default.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/dns.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/dwp.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/ftp.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/generic.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/gps.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/http.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/imap.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/ldap2.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/ldap3.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/lmtp.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/memcache.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/mysql.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/nntp.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/ntp3.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/pgsql.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/pop.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/postfix_policy.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/protocol.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/radius.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/rdate.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/rsync.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/sip.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/smtp.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/ssh.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/protocols/tns.$(OBJEXT): src/protocols/$(am__dirstamp)
+src/device/$(am__dirstamp):
+	@$(MKDIR_P) src/device
+	@: > src/device/$(am__dirstamp)
+src/device/device_common.$(OBJEXT): src/device/$(am__dirstamp)
+src/device/sysdep_@ARCH@.$(OBJEXT): src/device/$(am__dirstamp)
+src/process/$(am__dirstamp):
+	@$(MKDIR_P) src/process
+	@: > src/process/$(am__dirstamp)
+src/process/process_common.$(OBJEXT): src/process/$(am__dirstamp)
+src/process/sysdep_@ARCH@.$(OBJEXT): src/process/$(am__dirstamp)
+monit$(EXEEXT): $(monit_OBJECTS) $(monit_DEPENDENCIES) 
+	@rm -f monit$(EXEEXT)
+	$(monit_LINK) $(monit_OBJECTS) $(monit_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f src/alert.$(OBJEXT)
+	-rm -f src/collector.$(OBJEXT)
+	-rm -f src/control.$(OBJEXT)
+	-rm -f src/daemonize.$(OBJEXT)
+	-rm -f src/device/device_common.$(OBJEXT)
+	-rm -f src/device/sysdep_@ARCH@.$(OBJEXT)
+	-rm -f src/env.$(OBJEXT)
+	-rm -f src/event.$(OBJEXT)
+	-rm -f src/file.$(OBJEXT)
+	-rm -f src/gc.$(OBJEXT)
+	-rm -f src/http.$(OBJEXT)
+	-rm -f src/http/base64.$(OBJEXT)
+	-rm -f src/http/cervlet.$(OBJEXT)
+	-rm -f src/http/engine.$(OBJEXT)
+	-rm -f src/http/processor.$(OBJEXT)
+	-rm -f src/lex.yy.$(OBJEXT)
+	-rm -f src/log.$(OBJEXT)
+	-rm -f src/md5.$(OBJEXT)
+	-rm -f src/md5_crypt.$(OBJEXT)
+	-rm -f src/monit.$(OBJEXT)
+	-rm -f src/net.$(OBJEXT)
+	-rm -f src/process.$(OBJEXT)
+	-rm -f src/process/process_common.$(OBJEXT)
+	-rm -f src/process/sysdep_@ARCH@.$(OBJEXT)
+	-rm -f src/protocols/apache_status.$(OBJEXT)
+	-rm -f src/protocols/clamav.$(OBJEXT)
+	-rm -f src/protocols/default.$(OBJEXT)
+	-rm -f src/protocols/dns.$(OBJEXT)
+	-rm -f src/protocols/dwp.$(OBJEXT)
+	-rm -f src/protocols/ftp.$(OBJEXT)
+	-rm -f src/protocols/generic.$(OBJEXT)
+	-rm -f src/protocols/gps.$(OBJEXT)
+	-rm -f src/protocols/http.$(OBJEXT)
+	-rm -f src/protocols/imap.$(OBJEXT)
+	-rm -f src/protocols/ldap2.$(OBJEXT)
+	-rm -f src/protocols/ldap3.$(OBJEXT)
+	-rm -f src/protocols/lmtp.$(OBJEXT)
+	-rm -f src/protocols/memcache.$(OBJEXT)
+	-rm -f src/protocols/mysql.$(OBJEXT)
+	-rm -f src/protocols/nntp.$(OBJEXT)
+	-rm -f src/protocols/ntp3.$(OBJEXT)
+	-rm -f src/protocols/pgsql.$(OBJEXT)
+	-rm -f src/protocols/pop.$(OBJEXT)
+	-rm -f src/protocols/postfix_policy.$(OBJEXT)
+	-rm -f src/protocols/protocol.$(OBJEXT)
+	-rm -f src/protocols/radius.$(OBJEXT)
+	-rm -f src/protocols/rdate.$(OBJEXT)
+	-rm -f src/protocols/rsync.$(OBJEXT)
+	-rm -f src/protocols/sip.$(OBJEXT)
+	-rm -f src/protocols/smtp.$(OBJEXT)
+	-rm -f src/protocols/ssh.$(OBJEXT)
+	-rm -f src/protocols/tns.$(OBJEXT)
+	-rm -f src/sendmail.$(OBJEXT)
+	-rm -f src/sha1.$(OBJEXT)
+	-rm -f src/signal.$(OBJEXT)
+	-rm -f src/socket.$(OBJEXT)
+	-rm -f src/spawn.$(OBJEXT)
+	-rm -f src/ssl.$(OBJEXT)
+	-rm -f src/state.$(OBJEXT)
+	-rm -f src/status.$(OBJEXT)
+	-rm -f src/util.$(OBJEXT)
+	-rm -f src/validate.$(OBJEXT)
+	-rm -f src/xml.$(OBJEXT)
+	-rm -f src/y.tab.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-man1: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	test -z "$$files" || { \
+	  echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
+	  cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@list='$(MANS)'; if test -n "$$list"; then \
+	  list=`for p in $$list; do \
+	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	    if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+	  if test -n "$$list" && \
+	    grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+	    echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+	    grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+	    echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+	    echo "       typically \`make maintainer-clean' will remove them" >&2; \
+	    exit 1; \
+	  else :; fi; \
+	else :; fi
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f src/$(am__dirstamp)
+	-rm -f src/device/$(am__dirstamp)
+	-rm -f src/http/$(am__dirstamp)
+	-rm -f src/process/$(am__dirstamp)
+	-rm -f src/protocols/$(am__dirstamp)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool clean-local \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \
+	ctags-recursive install install-am install-strip \
+	tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libtool clean-local ctags ctags-recursive \
+	dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzma \
+	dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-local distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man1 \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \
+	uninstall-man1
+
+
+# -------
+# Targets
+# -------
+
+dist-hook::
+	-rm -rf `find $(distdir) -name "._*"`
+	-rm -rf `find $(distdir) -name ".DS_Store"`
+	-rm -rf `find $(distdir) -name ".libs"`
+	-rm -rf `find $(distdir) -name ".svn"`
+	-rm -rf `find $(distdir) -name ".dirstamp"`
+	-rm -rf $(distdir)/libmonit/libmonit.xcodeproj
+	-rm -rf $(distdir)/libmonit/config.log
+	-rm -rf $(distdir)/libmonit/config.status
+	-rm -rf $(distdir)/libmonit/autom4te.cache
+	-rm -f $(distdir)/src/config.h
+	-rm -f $(distdir)/src/stamp-*
+	-rm -f $(distdir)/src/y.output
+	-perl -pi -e 's/^Version: .*/Version: '$(VERSION)'/' $(distdir)/contrib/packages/redhat/monit.spec
+	-chmod 600 monitrc
+
+clean-local:
+	-rm -f `find . -name "*.o" -o -name "*.lo" -o -name "*.loT" -o -name "*~"`
+
+distclean-local:
+	-rm -rf autom4te.cache/ \
+		src/y.output \
+		monit-[0-9].*tar.gz
+	-rm -rf lib include
+
+cleanall: clean distclean
+	-rm -f Makefile.in configure aclocal.m4 autom4te.cache src/config.h.in monit.1 config/config.*
+	-rm -rf m4
+
+monit.1: doc/monit.pod
+	$(POD2MAN) $(POD2MANFLAGS) $< > $@
+	-rm -f pod2*
+
+# -------------
+# Grammar rules
+# -------------
+
+src/y.tab.c src/tokens.h : src/p.y
+	$(YACC) $(YACCFLAGS) $< -o src/y.tab.c
+	-echo "#include <config.h>" > src/.y.tab.c
+	-cat src/y.tab.c >> src/.y.tab.c
+	-mv src/.y.tab.c src/y.tab.c
+	-mv src/y.tab.h src/tokens.h
+
+src/lex.yy.c: src/l.l
+	$(FLEX) $(FLEXFLAGS) -o$@ $< 
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/monit-5.4/README b/monit-5.4/README
new file mode 100644
index 0000000..863f50f
--- /dev/null
+++ b/monit-5.4/README
@@ -0,0 +1,109 @@
+
+MONIT - UNIX Systems Management
+
+                                      
+Introduction
+------------
+
+Monit is a utility for managing and monitoring processes, programs, files,
+directories and filesystems on a Unix system. Monit conducts automatic
+maintenance and repair and can execute meaningful causal actions in error
+situations.
+
+Monit logs to syslog or to its own log file and notifies you about error
+conditions via customizable alert messages. Monit can perform various
+TCP/IP network checks, protocol checks and can utilize SSL for such checks.
+Monit provides an optional http(s) interface and you can use a browser to
+access the Monit program.
+
+
+System requirements
+-------------------
+
+* Memory and Disk space
+
+  A minimum of 1 megabytes RAM are required and around 500KB of free disk
+  space. You may need more RAM depending on how many services Monit should
+  monitor.
+
+* ANSI-C Compiler and Build System
+
+  You will need an ANSI-C99 compiler installed to build Monit. The GNU C
+  compiler (GCC) from the Free Software Foundation (FSF) is recommended. In
+  addition, your PATH must contain basic build tools such as make.
+
+
+Installation
+------------
+
+Monit utilize the GNU auto-tools and provided the requirements above are
+satisfied, building Monit is conducted via the standard;
+
+ ./configure
+ make
+ make install 
+
+This will install Monit and the Monit man-file in /usr/local/bin and
+/usr/local/man/man1 respectively. If you want another location than
+/usr/local, run configure with the prefix options, like so: ./configure
+--prefix=<dir>
+
+Use ./configure --help for build and install options. By default, Monit is
+built with SSL, PAM and large file support. You may change this with the
+--without-<xxx> options to ./configure. E.g. --without-ssl, --without-pam
+or --without-largefiles.
+
+
+QUICK START
+-----------
+
+After you have built Monit you can simply start the monit program from the
+build directory to test it. Monit will use the monitrc control file located
+in this directory for it's configuration. The file is setup to start
+Monit's http server so you have something interesting to look at; After you
+have started monit, point your browser to http://127.0.0.1:2812/ and log in
+with the username admin and password monit.
+
+Once started, monit will run as a background process. To stop monit, use
+monit quit. To run monit in the foreground and in diagnostic mode, start
+monit with the -Iv options. In diagnostic mode, monit will print debug
+information to the console. Use ctrl+c to stop monit in diagnostic mode. To
+see all options for the program, use monit -h.
+
+Copy monitrc in the build directory to $HOME/.monitrc or if you plan to run
+Monit as root, to /etc/monitc. Use this file as a starting point to write
+your own configuration file for Monit.
+
+
+DOCUMENTATION
+-------------
+
+Please use `man monit' for an in-depth documentation of the program. More 
+documentation can be found at http://mmonit.com/monit/documentation/
+
+
+Questions and support
+---------------------
+
+If you have questions or comments about the software or documentation
+please subscribe to the Monit general mailing list and post your questions
+there. http://lists.nongnu.org/mailman/listinfo/monit-general
+
+
+Acknowledgments
+---------------
+
+Thanks to the Free Software Foundation (FSF) for hosting the mailing list.
+
+The design of libmonit was inspired by principles put forth by David R. 
+Hanson <drh@drhanson.net> in his excellent book "C Interfaces and 
+Implementations". You can learn more about this book here 
+http://www.cs.princeton.edu/software/cii/
+
+
+Contact information
+-------------------
+
+Monit is a product of Tildeslash Ltd. a company registered in Norway and in
+United Kingdom. For further information about this Software, please visit 
+http://mmonit.com/contact/
diff --git a/monit-5.4/aclocal.m4 b/monit-5.4/aclocal.m4
new file mode 100644
index 0000000..91c7b24
--- /dev/null
+++ b/monit-5.4/aclocal.m4
@@ -0,0 +1,8917 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
+[m4_warning([this file was generated for autoconf 2.65.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
+
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
+
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
+
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# Generated from ltversion.in.
+
+# serial 3017 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6b])
+m4_define([LT_PACKAGE_REVISION], [1.3017])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6b'
+macro_revision='1.3017'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/monit-5.4/bootstrap b/monit-5.4/bootstrap
new file mode 100755
index 0000000..65fd1de
--- /dev/null
+++ b/monit-5.4/bootstrap
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Use this script to re-create configure. Requires the following auto-tools,
+# autoconf        >= 2.59
+# automake        >= 1.10
+# libtool         >= 1.4
+if (glibtoolize -f -c 2>/dev/null || libtoolize -f -c) && aclocal -I config && autoheader && automake --foreign --add-missing --copy && autoconf 
+then
+        if cd libmonit && ./bootstrap
+        then
+                echo "Success bootstrapping Monit" 
+                exit 0;
+        fi
+fi
+echo "Failed bootstrapping Monit"
+exit 1;
+
diff --git a/monit-5.4/config/config.guess b/monit-5.4/config/config.guess
new file mode 100755
index 0000000..e3a2116
--- /dev/null
+++ b/monit-5.4/config/config.guess
@@ -0,0 +1,1533 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-06-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/monit-5.4/config/config.sub b/monit-5.4/config/config.sub
new file mode 100755
index 0000000..eb0389a
--- /dev/null
+++ b/monit-5.4/config/config.sub
@@ -0,0 +1,1693 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-06-11'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+        -bluegene*)
+	        os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/monit-5.4/config/install-sh b/monit-5.4/config/install-sh
new file mode 100755
index 0000000..6781b98
--- /dev/null
+++ b/monit-5.4/config/install-sh
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/monit-5.4/config/ltmain.sh b/monit-5.4/config/ltmain.sh
new file mode 100755
index 0000000..7ed280b
--- /dev/null
+++ b/monit-5.4/config/ltmain.sh
@@ -0,0 +1,8413 @@
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6b
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#     --config             show all configuration variables
+#     --debug              enable verbose shell tracing
+# -n, --dry-run            display commands without modifying any files
+#     --features           display basic configuration information and exit
+#     --mode=MODE          use operation mode MODE
+#     --preserve-dup-deps  don't remove duplicate dependency libraries
+#     --quiet, --silent    don't print informational messages
+#     --tag=TAG            use configuration variables from tag TAG
+# -v, --verbose            print informational messages (default)
+#     --version            print version information
+# -h, --help               print short or long help message
+#
+# MODE must be one of the following:
+#
+#       clean              remove files from the build directory
+#       compile            compile a source file into a libtool object
+#       execute            automatically set library path, then run a program
+#       finish             complete the installation of libtool libraries
+#       install            install libraries or executables
+#       link               create a library or an executable
+#       uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#       host-triplet:	$host
+#       shell:		$SHELL
+#       compiler:		$LTCC
+#       compiler flags:		$LTCFLAGS
+#       linker:		$LD (gnu? $with_gnu_ld)
+#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1
+#       automake:		$automake_version
+#       autoconf:		$autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="2.2.6b Debian-2.2.6b-2ubuntu1"
+TIMESTAMP=""
+package_revision=1.3017
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/bin/sed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+  -*) progname=./$progname ;;
+esac
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "X$my_tmpdir" | $Xsed
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "X$1" | $Xsed \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/# -h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    $ECHO
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell, and then maybe $ECHO will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    $ECHO "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $ECHO "enable shared libraries"
+    else
+      $ECHO "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $ECHO "enable static libraries"
+    else
+      $ECHO "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
+
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
+    ;;
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
+    ;;
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
+    ;;
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
+    ;;
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
+    ;;
+  esac
+
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+      --config)		func_config					;;
+
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
+
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
+
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
+
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
+  fi
+
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval std_shrext=\"$shrext_cmds\"
+
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
+
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
+
+    $ECHO
+    $ECHO "Try \`$progname --help' for more information about other modes."
+
+    exit $?
+}
+
+  # Now that we've collected a possible --mode arg, show help if necessary
+  $opt_help && func_mode_help
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	$ECHO "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    $ECHO "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    $ECHO
+    $ECHO "If you ever happen to want to link against installed libraries"
+    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
+    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $ECHO "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $ECHO "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $ECHO "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $ECHO
+
+    $ECHO "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	$ECHO "pages."
+	;;
+      *)
+        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+}
+
+test "$mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    eval '$ECHO ": $name " >> "$nlist"'
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+	func_emit_wrapper_part1_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part1_arg1=$1
+	fi
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    ECHO=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$ECHO works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$ECHO will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$ECHO "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+"
+}
+# end: func_emit_wrapper_part1
+
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
+
+	$ECHO "\
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
+	fi
+
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
+
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
+
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
+
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
+	  return 0;
+	}
+    }
+
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
+
+  p = strchr (arg, (int)'=');
+
+  if (!p)
+    return 1;
+
+  *value = xstrdup (++p);
+
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
+
+  return 0;
+}
+
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
+
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		$ECHO
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
+		$ECHO "*** that it is just a static archive that I should not use here."
+	      else
+		$ECHO
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_duplicate_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+		esac
+	      fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    $ECHO
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  $ECHO
+			  $ECHO "*** And there doesn't seem to be a static archive available"
+			  $ECHO "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $ECHO
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** I have the capability to make that library automatically link in when"
+	    $ECHO "*** you link to this library.  But I can only do this if you have a"
+	    $ECHO "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $ECHO "*** But as you try to build a module library, libtool will still create "
+	      $ECHO "*** a static module, that should work as long as the dlopening application"
+	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$ECHO
+		$ECHO "*** However, this would only work if libtool was able to extract symbol"
+		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$ECHO "*** not find such a program.  So, this module is probably useless."
+		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  $ECHO
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $ECHO
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    $ECHO "*** I have the capability to make that library automatically link in when"
+		    $ECHO "*** you link to this library.  But I can only do this if you have a"
+		    $ECHO "*** shared version of the library, which I believe you do not have"
+		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $ECHO
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      $ECHO "*** I have the capability to make that library automatically link in when"
+		      $ECHO "*** you link to this library.  But I can only do this if you have a"
+		      $ECHO "*** shared version of the library, which you do not appear to have"
+		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
+		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $ECHO
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $ECHO "*** make it link in!  You will probably need to install it or some"
+		  $ECHO "*** library that it depends on before this library will be fully"
+		  $ECHO "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+	    done
+	  fi
+	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
+	     $GREP . >/dev/null; then
+	    $ECHO
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $ECHO "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $ECHO
+	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $ECHO "*** a static module, that should work as long as the dlopening"
+	    $ECHO "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $ECHO
+	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
+	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $ECHO "*** not find such a program.  So, this module is probably useless."
+	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
+	    $ECHO "*** automatically added whenever a program is linked with this library"
+	    $ECHO "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $ECHO
+	      $ECHO "*** Since this library must not contain undefined symbols,"
+	      $ECHO "*** because either the platform does not support them or"
+	      $ECHO "*** it was explicitly requested with -no-undefined,"
+	      $ECHO "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    $ECHO 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    $ECHO ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=$obj
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles="$delfiles $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $ECHO for shipping.
+      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $ECHO "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/monit-5.4/config/missing b/monit-5.4/config/missing
new file mode 100755
index 0000000..28055d2
--- /dev/null
+++ b/monit-5.4/config/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/monit-5.4/configure b/monit-5.4/configure
new file mode 100755
index 0000000..7c87327
--- /dev/null
+++ b/monit-5.4/configure
@@ -0,0 +1,16032 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.65 for monit 5.4.
+#
+# Report bugs to <monit-general@nongnu.org>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: monit-general@nongnu.org about your system, including
+$0: any error possibly output before this message. Then
+$0: install a modern shell, or manually run the script
+$0: under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+$*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "$0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='monit'
+PACKAGE_TARNAME='monit'
+PACKAGE_VERSION='5.4'
+PACKAGE_STRING='monit 5.4'
+PACKAGE_BUGREPORT='monit-general@nongnu.org'
+PACKAGE_URL=''
+
+ac_unique_file="src/monit.c"
+enable_option_checking=no
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+ssllibdir
+sslincldir
+ARCH
+LIBOBJS
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+lt_ECHO
+RANLIB
+AR
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+POD2MANFLAGS
+POD2MAN
+FLEX
+YACC
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+subdirs
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+enable_optimized
+with_largefiles
+enable_largefile
+with_pam
+with_ssl_static
+with_ssl
+with_ssl_dir
+with_ssl_incl_dir
+with_ssl_lib_dir
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+ac_subdirs_all='libmonit'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information."
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures monit 5.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/monit]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of monit 5.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-static[=PKGS]  build static libraries [default=no]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-optimized      Build software optimized
+  --disable-largefile     omit support for large files
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --without-largefiles    disable large files support (default: enabled)
+  --without-pam           disable the use of pam (default: enabled)
+  --with-ssl-static=DIR       location of SSL installation
+  --without-ssl           disable the use of ssl (default: enabled)
+  --with-ssl-dir=DIR       location of SSL installation
+  --with-ssl-incl-dir=DIR  location of installed SSL include files
+  --with-ssl-lib-dir=DIR   location of installed SSL library files
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <monit-general@nongnu.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+monit configure 5.4
+generated by GNU Autoconf 2.65
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( cat <<\_ASBOX
+## --------------------------------------- ##
+## Report this to monit-general@nongnu.org ##
+## --------------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_member
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by monit $as_me 5.4, which was
+generated by GNU Autoconf 2.65.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_aux_dir=
+for ac_dir in config "$srcdir"/config; do
+  for ac_t in install-sh install.sh shtool; do
+    if test -f "$ac_dir/$ac_t"; then
+      ac_aux_dir=$ac_dir
+      ac_install_sh="$ac_aux_dir/$ac_t -c"
+      break 2
+    fi
+  done
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='monit'
+ VERSION='5.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+
+subdirs="$subdirs libmonit"
+
+ac_config_commands="$ac_config_commands libtool_patch"
+
+
+
+# ------------------------------------------------------------------------
+# Programs
+# ------------------------------------------------------------------------
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "no acceptable C compiler found in \$PATH
+See \`config.log' for more details." "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "C compiler cannot create executables
+See \`config.log' for more details." "$LINENO" 5; }; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+for ac_prog in 'bison -y' byacc yacc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_YACC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/local/bin:/usr/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_YACC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
+$as_echo "$YACC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="no"
+
+if test "x$YACC" = "xno"; then
+	# Require bison unless y.tab.c already is built
+	if test ! -f src/y.tab.c; then
+                as_fn_error "Monit require bison, byacc or yacc. Download bison from http://www.gnu.org/software/bison/" "$LINENO" 5
+	fi
+fi
+# Extract the first word of "flex", so it can be a program name with args.
+set dummy flex; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_FLEX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $FLEX in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FLEX="$FLEX" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/local/bin:/usr/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_FLEX="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_FLEX" && ac_cv_path_FLEX="no"
+  ;;
+esac
+fi
+FLEX=$ac_cv_path_FLEX
+if test -n "$FLEX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX" >&5
+$as_echo "$FLEX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "x$FLEX" = "xno"; then
+	# Require flex unless lex.yy.c already is built
+	if test ! -f src/lex.yy.c; then
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: flex is required. Download from http://www.gnu.org/software/flex/" >&5
+$as_echo "flex is required. Download from http://www.gnu.org/software/flex/" >&6; }
+	fi
+fi
+# Extract the first word of "pod2man", so it can be a program name with args.
+set dummy pod2man; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_path_POD2MAN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $POD2MAN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_POD2MAN="$POD2MAN" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/local/bin:/usr/bin"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_POD2MAN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_POD2MAN" && ac_cv_path_POD2MAN="no"
+  ;;
+esac
+fi
+POD2MAN=$ac_cv_path_POD2MAN
+if test -n "$POD2MAN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2MAN" >&5
+$as_echo "$POD2MAN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "x$POD2MAN" = "xno"; then
+	# Require pod2man unless monit.1 already is built
+	if test ! -f monit.1; then
+		as_fn_error "pod2man is required to build the monit.1 man file." "$LINENO" 5
+	fi
+else
+	d=`date  '+%B %d. %Y'`
+	POD2MANFLAGS="--center 'User Commands' --release '${d}' --date='www.mmonit.com' --lax"
+
+fi
+
+
+# ------------------------------------------------------------------------
+# Libtool
+# ------------------------------------------------------------------------
+
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.2.6b'
+macro_revision='1.3017'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if test "${ac_cv_path_SED+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test "${lt_cv_path_NM+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:4836: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:4839: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:4842: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 6048 "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if test "${lt_cv_objdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7544: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7548: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+
+
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7883: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7887: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7988: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:7992: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:8043: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:8047: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  whole_archive_flag_spec=''
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo(void) {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
+$as_echo "$archive_cmds_need_lc" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 10427 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 10523 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+
+# ---------------------------------------------------------------------------
+# Build options
+# ---------------------------------------------------------------------------
+
+# Check whether --enable-optimized was given.
+if test "${enable_optimized+set}" = set; then :
+  enableval=$enable_optimized;
+        CFLAGS=`echo $CFLAGS|sed 's/-O.//'`
+        if test "x$enableval" = "xyes" ; then
+                CFLAGS=`echo $CFLAGS|sed 's/-g//'`
+                CFLAGS="$CFLAGS -O3"
+                OPTIMIZED=1
+        else
+                OPTIMIZED=0
+        fi
+
+else
+
+        OPTIMIZED=0
+
+
+fi
+
+
+
+# ------------------------------------------------------------------------
+# Libraries
+# ------------------------------------------------------------------------
+
+# Check for libraries
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
+$as_echo_n "checking for socket in -lsocket... " >&6; }
+if test "${ac_cv_lib_socket_socket+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_socket=yes
+else
+  ac_cv_lib_socket_socket=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
+$as_echo "$ac_cv_lib_socket_socket" >&6; }
+if test "x$ac_cv_lib_socket_socket" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSOCKET 1
+_ACEOF
+
+  LIBS="-lsocket $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -linet" >&5
+$as_echo_n "checking for socket in -linet... " >&6; }
+if test "${ac_cv_lib_inet_socket+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-linet  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket ();
+int
+main ()
+{
+return socket ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_inet_socket=yes
+else
+  ac_cv_lib_inet_socket=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_socket" >&5
+$as_echo "$ac_cv_lib_inet_socket" >&6; }
+if test "x$ac_cv_lib_inet_socket" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBINET 1
+_ACEOF
+
+  LIBS="-linet $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_addr in -lnsl" >&5
+$as_echo_n "checking for inet_addr in -lnsl... " >&6; }
+if test "${ac_cv_lib_nsl_inet_addr+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_addr ();
+int
+main ()
+{
+return inet_addr ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nsl_inet_addr=yes
+else
+  ac_cv_lib_nsl_inet_addr=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_inet_addr" >&5
+$as_echo "$ac_cv_lib_nsl_inet_addr" >&6; }
+if test "x$ac_cv_lib_nsl_inet_addr" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNSL 1
+_ACEOF
+
+  LIBS="-lnsl $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5
+$as_echo_n "checking for inet_aton in -lresolv... " >&6; }
+if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_aton ();
+int
+main ()
+{
+return inet_aton ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_resolv_inet_aton=yes
+else
+  ac_cv_lib_resolv_inet_aton=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5
+$as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
+if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBRESOLV 1
+_ACEOF
+
+  LIBS="-lresolv $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lc" >&5
+$as_echo_n "checking for crypt in -lc... " >&6; }
+if test "${ac_cv_lib_c_crypt+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_c_crypt=yes
+else
+  ac_cv_lib_c_crypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_crypt" >&5
+$as_echo "$ac_cv_lib_c_crypt" >&6; }
+if test "x$ac_cv_lib_c_crypt" = x""yes; then :
+  :
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
+$as_echo_n "checking for crypt in -lcrypt... " >&6; }
+if test "${ac_cv_lib_crypt_crypt+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_crypt_crypt=yes
+else
+  ac_cv_lib_crypt_crypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5
+$as_echo "$ac_cv_lib_crypt_crypt" >&6; }
+if test "x$ac_cv_lib_crypt_crypt" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPT 1
+_ACEOF
+
+  LIBS="-lcrypt $LIBS"
+
+fi
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
+if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_create ();
+int
+main ()
+{
+return pthread_create ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pthread_pthread_create=yes
+else
+  ac_cv_lib_pthread_pthread_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+else
+  as_fn_error "POSIX thread library is required" "$LINENO" 5
+fi
+
+
+# ------------------------------------------------------------------------
+# Header files
+# ------------------------------------------------------------------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if test "${ac_cv_header_sys_wait_h+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+  int s;
+  wait (&s);
+  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_sys_wait_h=yes
+else
+  ac_cv_header_sys_wait_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
+$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
+if test "${ac_cv_header_stat_broken+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined S_ISBLK && defined S_IFDIR
+extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#endif
+
+#if defined S_ISBLK && defined S_IFCHR
+extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
+#endif
+
+#if defined S_ISLNK && defined S_IFREG
+extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
+#endif
+
+#if defined S_ISSOCK && defined S_IFREG
+extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stat_broken=no
+else
+  ac_cv_header_stat_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
+$as_echo "$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
+
+$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if test "${ac_cv_header_time+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
+else
+  ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+
+for ac_header in  \
+        alloca.h \
+	arpa/inet.h \
+	asm/page.h \
+	asm/param.h \
+	cf.h \
+	crt_externs.h \
+	ctype.h \
+	crypt.h \
+	dirent.h \
+	errno.h \
+	execinfo.h \
+	fcntl.h \
+	getopt.h \
+	glob.h \
+	grp.h \
+	kvm.h \
+	paths.h \
+	kstat.h \
+	sys/protosw.h \
+	limits.h \
+	loadavg.h \
+	locale.h \
+        mach/host_info.h \
+        mach/mach.h \
+        mach/mach_host.h \
+	memory.h \
+	mntent.h \
+	netdb.h \
+        sys/socket.h \
+	netinet/in.h \
+        netinet/in_systm.h \
+        pam/pam_appl.h \
+        security/pam_appl.h \
+	poll.h \
+	procfs.h \
+	sys/procfs.h \
+	procinfo.h \
+	pthread.h \
+	pwd.h \
+	regex.h \
+	setjmp.h \
+	signal.h \
+	stdarg.h \
+        stddef.h \
+	stdio.h \
+	string.h \
+	strings.h \
+	stropts.h \
+	sys/cfgodm.h \
+	sys/cfgdb.h \
+	sys/dk.h \
+	sys/dkstat.h \
+	sys/filio.h \
+	sys/ioctl.h \
+	sys/loadavg.h \
+	sys/lock.h \
+	sys/mnttab.h \
+	sys/mutex.h \
+	sys/nlist.h \
+	sys/param.h \
+	sys/pstat.h \
+	sys/queue.h \
+	sys/resource.h \
+	sys/statfs.h \
+	sys/statvfs.h \
+	sys/sysinfo.h \
+	sys/systemcfg.h \
+	sys/time.h \
+	sys/tree.h \
+	sys/types.h \
+	sys/un.h \
+	sys/utsname.h \
+        sys/vmmeter.h \
+	sys/vfs.h \
+	syslog.h \
+	unistd.h \
+        uvm/uvm.h \
+        uvm/uvm_extern.h \
+        vm/vm.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+	libperfstat.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_PROTOSW_H
+         #include <sys/protosw.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+	netinet/ip.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_TYPES_H
+         #include <sys/types.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in_systm.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+	net/if.h \
+	netinet/ip_icmp.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_TYPES_H
+         #include <sys/types.h>
+         #endif
+         #if HAVE_SYS_SOCKET_H
+         #include <sys/socket.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in_systm.h>
+         #endif
+         #if HAVE_NETINET_IP_H
+         #include <netinet/ip.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+        sys/sysctl.h \
+        sys/mount.h \
+        sys/proc.h \
+        sys/swap.h \
+	sys/ucred.h \
+        sys/user.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_PARAM_H
+         #include <sys/param.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+	machine/vmparam.h \
+        vm/pmap.h \
+        machine/pmap.h \
+        vm/vm_map.h \
+	vm/vm_object.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_PARAM_H
+         #include <sys/param.h>
+         #endif
+         #ifdef HAVE_SYS_QUEUE_H
+         #include <sys/queue.h>
+         #endif
+         #ifdef HAVE_SYS_LOCK_H
+         #include <sys/lock.h>
+         #endif
+         #ifdef HAVE_SYS_MUTEX_H
+         #include <sys/mutex.h>
+         #endif
+         #ifdef HAVE_VM_VM_H
+         #include <vm/vm.h>
+         #endif
+         #ifdef HAVE_VM_PMAP_H
+         #include <vm/pmap.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+        sys/resourcevar.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_TIME_H
+         #include <sys/time.h>
+         #endif
+         #ifdef HAVE_SYS_RESOURCE_H
+         #include <sys/resource.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in  \
+	uvm/uvm_map.h \
+	uvm/uvm_pmap.h \
+	uvm/uvm_object.h \
+
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "
+         #ifdef HAVE_SYS_TIME_H
+         #include <sys/time.h>
+         #endif
+         #ifdef HAVE_SYS_LOCK_H
+         #include <sys/lock.h>
+         #endif
+         #ifdef HAVE_SYS_TREE_H
+         #include <sys/tree.h>
+         #endif
+         #ifdef HAVE_UVM_UVM_EXTERN_H
+         #include <uvm/uvm_extern.h>
+         #endif
+
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Check for types.
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = x""yes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = x""yes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = x""yes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = x""yes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if test "${ac_cv_type_signal+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_type_signal=int
+else
+  ac_cv_type_signal=void
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+
+# Check for structures.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
+$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; }
+if test "${ac_cv_struct_tm+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm tm;
+				     int *p = &tm.tm_sec;
+				     return !p;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_struct_tm=time.h
+else
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5
+$as_echo "$ac_cv_struct_tm" >&6; }
+if test $ac_cv_struct_tm = sys/time.h; then
+
+$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "$ac_includes_default"
+if test "x$ac_cv_member_struct_tm_tm_gmtoff" = x""yes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_TM_TM_GMTOFF 1
+_ACEOF
+
+
+fi
+
+
+
+# ------------------------------------------------------------------------
+# Functions
+# ------------------------------------------------------------------------
+
+# Checks for library functions.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
+$as_echo_n "checking for error_at_line... " >&6; }
+if test "${ac_cv_lib_error_at_line+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <error.h>
+int
+main ()
+{
+error_at_line (0, 0, "", 0, "an error occurred");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_error_at_line=yes
+else
+  ac_cv_lib_error_at_line=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
+$as_echo "$ac_cv_lib_error_at_line" >&6; }
+if test $ac_cv_lib_error_at_line = no; then
+  case " $LIBOBJS " in
+  *" error.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS error.$ac_objext"
+ ;;
+esac
+
+fi
+
+for ac_header in vfork.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
+if test "x$ac_cv_header_vfork_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_VFORK_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in fork vfork
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+eval as_val=\$$as_ac_var
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test "x$ac_cv_func_fork" = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
+$as_echo_n "checking for working fork... " >&6; }
+if test "${ac_cv_func_fork_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_fork_works=cross
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	  /* By Ruediger Kuhlmann. */
+	  return fork () < 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_fork_works=yes
+else
+  ac_cv_func_fork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
+$as_echo "$ac_cv_func_fork_works" >&6; }
+
+else
+  ac_cv_func_fork_works=$ac_cv_func_fork
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+  case $host in
+    *-*-amigaos* | *-*-msdosdjgpp*)
+      # Override, as these systems have only a dummy fork() stub
+      ac_cv_func_fork_works=no
+      ;;
+    *)
+      ac_cv_func_fork_works=yes
+      ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
+$as_echo_n "checking for working vfork... " >&6; }
+if test "${ac_cv_func_vfork_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_vfork_works=cross
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Thanks to Paul Eggert for this test.  */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+   argument registers are propagated back to the parent.  The compiler
+   is told about this with #include <vfork.h>, but some compilers
+   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
+   static variable whose address is put into a register that is
+   clobbered by the vfork.  */
+static void
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+  static pid_t child;
+  if (!child) {
+    child = vfork ();
+    if (child < 0) {
+      perror ("vfork");
+      _exit(2);
+    }
+    if (!child) {
+      arg = getpid();
+      write(-1, "", 0);
+      _exit (arg);
+    }
+  }
+}
+
+int
+main ()
+{
+  pid_t parent = getpid ();
+  pid_t child;
+
+  sparc_address_test (0);
+
+  child = vfork ();
+
+  if (child == 0) {
+    /* Here is another test for sparc vfork register problems.  This
+       test uses lots of local variables, at least as many local
+       variables as main has allocated so far including compiler
+       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
+       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
+       reuse the register of parent for one of the local variables,
+       since it will think that parent can't possibly be used any more
+       in this routine.  Assigning to the local variable will thus
+       munge parent in the parent process.  */
+    pid_t
+      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+    /* Convince the compiler that p..p7 are live; otherwise, it might
+       use the same hardware register for all 8 local variables.  */
+    if (p != p1 || p != p2 || p != p3 || p != p4
+	|| p != p5 || p != p6 || p != p7)
+      _exit(1);
+
+    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+       from child file descriptors.  If the child closes a descriptor
+       before it execs or exits, this munges the parent's descriptor
+       as well.  Test for this by closing stdout in the child.  */
+    _exit(close(fileno(stdout)) != 0);
+  } else {
+    int status;
+    struct stat st;
+
+    while (wait(&status) != child)
+      ;
+    return (
+	 /* Was there some problem with vforking?  */
+	 child < 0
+
+	 /* Did the child fail?  (This shouldn't happen.)  */
+	 || status
+
+	 /* Did the vfork/compiler bug occur?  */
+	 || parent != getpid()
+
+	 /* Did the file descriptor bug occur?  */
+	 || fstat(fileno(stdout), &st) != 0
+	 );
+  }
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_vfork_works=yes
+else
+  ac_cv_func_vfork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
+$as_echo "$ac_cv_func_vfork_works" >&6; }
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+  ac_cv_func_vfork_works=$ac_cv_func_vfork
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
+
+else
+
+$as_echo "#define vfork fork" >>confdefs.h
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
+$as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
+if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f conftest.sym conftest.file
+echo >conftest.file
+if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_lstat_dereferences_slashed_symlink=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+struct stat sbuf;
+     /* Linux will dereference the symlink and fail, as required by POSIX.
+	That is better in the sense that it means we will not
+	have to compile and use the lstat wrapper.  */
+     return lstat ("conftest.sym/", &sbuf) == 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_lstat_dereferences_slashed_symlink=yes
+else
+  ac_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+else
+  # If the `ln -s' command failed, then we probably don't even
+  # have an lstat function.
+  ac_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f conftest.sym conftest.file
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5
+$as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; }
+
+test $ac_cv_func_lstat_dereferences_slashed_symlink = yes &&
+
+cat >>confdefs.h <<_ACEOF
+#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
+_ACEOF
+
+
+if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then
+  case " $LIBOBJS " in
+  *" lstat.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS lstat.$ac_objext"
+ ;;
+esac
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5
+$as_echo_n "checking whether stat accepts an empty string... " >&6; }
+if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_stat_empty_string_bug=yes
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+struct stat sbuf;
+  return stat ("", &sbuf) == 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_stat_empty_string_bug=no
+else
+  ac_cv_func_stat_empty_string_bug=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5
+$as_echo "$ac_cv_func_stat_empty_string_bug" >&6; }
+if test $ac_cv_func_stat_empty_string_bug = yes; then
+  case " $LIBOBJS " in
+  *" stat.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS stat.$ac_objext"
+ ;;
+esac
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STAT_EMPTY_STRING_BUG 1
+_ACEOF
+
+fi
+
+for ac_func in strftime
+do :
+  ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime"
+if test "x$ac_cv_func_strftime" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRFTIME 1
+_ACEOF
+
+else
+  # strftime is in -lintl on SCO UNIX.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5
+$as_echo_n "checking for strftime in -lintl... " >&6; }
+if test "${ac_cv_lib_intl_strftime+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strftime ();
+int
+main ()
+{
+return strftime ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_intl_strftime=yes
+else
+  ac_cv_lib_intl_strftime=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5
+$as_echo "$ac_cv_lib_intl_strftime" >&6; }
+if test "x$ac_cv_lib_intl_strftime" = x""yes; then :
+  $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h
+
+LIBS="-lintl $LIBS"
+fi
+
+fi
+done
+
+for ac_func in statfs
+do :
+  ac_fn_c_check_func "$LINENO" "statfs" "ac_cv_func_statfs"
+if test "x$ac_cv_func_statfs" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STATFS 1
+_ACEOF
+
+fi
+done
+
+for ac_func in statvfs
+do :
+  ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs"
+if test "x$ac_cv_func_statvfs" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STATVFS 1
+_ACEOF
+
+fi
+done
+
+for ac_func in setlocale
+do :
+  ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
+if test "x$ac_cv_func_setlocale" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SETLOCALE 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getaddrinfo
+do :
+  ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETADDRINFO 1
+_ACEOF
+
+fi
+done
+
+for ac_func in syslog
+do :
+  ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog"
+if test "x$ac_cv_func_syslog" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYSLOG 1
+_ACEOF
+
+fi
+done
+
+for ac_func in vsyslog
+do :
+  ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog"
+if test "x$ac_cv_func_vsyslog" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_VSYSLOG 1
+_ACEOF
+
+fi
+done
+
+for ac_func in backtrace
+do :
+  ac_fn_c_check_func "$LINENO" "backtrace" "ac_cv_func_backtrace"
+if test "x$ac_cv_func_backtrace" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_BACKTRACE 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getloadavg
+do :
+  ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
+if test "x$ac_cv_func_getloadavg" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETLOADAVG 1
+_ACEOF
+
+fi
+done
+
+
+# Check for SOL_IP
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOL_IP" >&5
+$as_echo_n "checking for SOL_IP... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include <netdb.h>
+	#include <sys/socket.h>
+int
+main ()
+{
+int level = SOL_IP;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_SOL_IP 1" >>confdefs.h
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5
+$as_echo_n "checking for va_copy... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include <stdarg.h>
+
+int
+main ()
+{
+
+	va_list ap;
+	va_list ap_copy;
+	va_copy(ap, ap_copy);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_VA_COPY 1" >>confdefs.h
+
+
+else
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+# ------------------------------------------------------------------------
+# Compiler
+# ------------------------------------------------------------------------
+
+# Compiler characteristics
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if test "${ac_cv_c_const+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if test "${ac_cv_c_bigendian+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+# If the compiler is gcc, tune warnings and make the char type unsigned
+# and enable C99 support
+if test "x$GCC" = "xyes"; then
+	CFLAGS="$CFLAGS -Wall -Wunused -Wno-unused-label -funsigned-char";
+        # Add C99 support
+        CFLAGS="$CFLAGS -D_GNU_SOURCE -std=c99"
+        # does this compiler support -Wno-pointer-sign ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-pointer-sign $CFLAGS"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$svd_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        # does this compiler support -Wno-address ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-address $CFLAGS"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$svd_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+# ------------------------------------------------------------------------
+# Paths
+# ------------------------------------------------------------------------
+
+# Find the right directory to put the root-mode PID file in
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pid file location" >&5
+$as_echo_n "checking pid file location... " >&6; }
+if test -d "/var/run"
+then
+	piddir="/var/run"
+elif test -d "/etc"
+then
+	piddir="/etc"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PIDDIR "$piddir"
+_ACEOF
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $piddir" >&5
+$as_echo "$piddir" >&6; }
+
+# Test mounted filesystem description file
+if test -f "/etc/mtab"
+then
+
+$as_echo "#define HAVE_MTAB 1" >>confdefs.h
+
+elif test -f "/etc/mnttab"; then
+
+$as_echo "#define HAVE_MNTTAB 1" >>confdefs.h
+
+fi
+
+# ------------------------------------------------------------------------
+# Architecture/OS detection
+# ------------------------------------------------------------------------
+
+# Backward compatibility until we get ride of arch settings
+architecture=`uname`
+if test "$architecture" = "SunOS"
+then
+   ARCH="SOLARIS"
+   CFLAGS="$CFLAGS -D _REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -m64"
+   LDFLAGS="$LDFLAGS -m64"
+   test_kstat="true"
+
+$as_echo "#define HAVE_CPU_WAIT 1" >>confdefs.h
+
+   if test `uname -m` = "i86pc"
+   then
+      if test "x$GCC" = "xyes"
+      then
+            CFLAGS="$CFLAGS -mtune=opteron"
+            LDFLAGS="$LDFLAGS -mtune=opteron"
+      else
+            CFLAGS="$CFLAGS -xarch=sse2"
+            LDFLAGS="$LDFLAGS -xarch=sse2"
+      fi
+   else
+      if test "x$GCC" = "xyes"
+      then
+            CFLAGS="$CFLAGS -mtune=v9"
+            LDFLAGS="$LDFLAGS -mtune=v9"
+      else
+            CFLAGS="$CFLAGS -xarch=sparc"
+            LDFLAGS="$LDFLAGS -xarch=sparc"
+      fi
+   fi
+elif test "$architecture" = "Linux"
+then
+   ARCH="LINUX"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   LDFLAGS="$LDFLAGS -rdynamic"
+   if test `uname -r | awk -F '.' '{print$1$2}'` -ge "26"
+   then
+
+$as_echo "#define HAVE_CPU_WAIT 1" >>confdefs.h
+
+   fi
+elif test "$architecture" = "HP-UX"
+then
+   ARCH="HPUX"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+
+$as_echo "#define HAVE_CPU_WAIT 1" >>confdefs.h
+
+elif test "$architecture" = "OpenBSD"
+then
+   ARCH="OPENBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+   use_pam=0 # No PAM on OpenBSD (supports BSD Auth API instead of PAM)
+elif test "$architecture" = "FreeBSD"
+then
+   ARCH="FREEBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "GNU/kFreeBSD"
+then
+   ARCH="FREEBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "NetBSD"
+then
+   ARCH="NETBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "Darwin"
+then
+   ARCH="DARWIN"
+   CFLAGS="$CFLAGS -DREENTRANT -no-cpp-precomp -DNEED_SOCKLEN_T_DEFINED"
+   test_kvm="true"
+   LIBS="$LIBS -framework System -multiply_defined suppress"
+elif test "$architecture" = "AIX"
+then
+   ARCH="AIX"
+   CFLAGS="$CFLAGS -D_THREAD_SAFE -D_REENTRANT"
+   LIBS="$LIBS -lodm"
+   # AIX v. 5.2
+   LIBS="$LIBS -lcfg"
+   # AIX v. 5.3
+   LIBS="$LIBS -lperfstat"
+
+$as_echo "#define HAVE_CPU_WAIT 1" >>confdefs.h
+
+else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Architecture not supported: ${architecture}" >&5
+$as_echo "$as_me: WARNING: Architecture not supported: ${architecture}" >&2;}
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   ARCH="UNKNOWN"
+fi
+
+
+# ------------------------------------------------------------------------
+# Resource code
+# ------------------------------------------------------------------------
+
+# Test for kvm libs
+kvm_libs=""
+if test "$test_kvm"; then
+       	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_open in -lkvm" >&5
+$as_echo_n "checking for kvm_open in -lkvm... " >&6; }
+if test "${ac_cv_lib_kvm_kvm_open+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkvm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char kvm_open ();
+int
+main ()
+{
+return kvm_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_kvm_kvm_open=yes
+else
+  ac_cv_lib_kvm_kvm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_kvm_open" >&5
+$as_echo "$ac_cv_lib_kvm_kvm_open" >&6; }
+if test "x$ac_cv_lib_kvm_kvm_open" = x""yes; then :
+  kvm_libs="-lkvm"
+fi
+
+       	if test "$kvm_libs"
+       	then
+       	        LIBS="$LIBS $kvm_libs"
+       	fi
+fi
+kstat_libs=""
+if test "$test_kstat"; then
+       	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5
+$as_echo_n "checking for kstat_open in -lkstat... " >&6; }
+if test "${ac_cv_lib_kstat_kstat_open+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char kstat_open ();
+int
+main ()
+{
+return kstat_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_kstat_kstat_open=yes
+else
+  ac_cv_lib_kstat_kstat_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kstat_kstat_open" >&5
+$as_echo "$ac_cv_lib_kstat_kstat_open" >&6; }
+if test "x$ac_cv_lib_kstat_kstat_open" = x""yes; then :
+  kstat_libs="-lkstat"
+fi
+
+       	if test "$kstat_libs"
+       	then
+       	        LIBS="$LIBS $kstat_libs"
+       	fi
+fi
+
+
+# ------------------------------------------------------------------------
+# Large files code
+# ------------------------------------------------------------------------
+
+# Check if we want to have large files support
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for large files support" >&5
+$as_echo_n "checking for large files support... " >&6; }
+
+# Check whether --with-largefiles was given.
+if test "${with_largefiles+set}" = set; then :
+  withval=$with_largefiles;
+                if test "x$withval" = "xno" ; then
+            use_largefiles=0
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+        fi
+        if test "x$withval" = "xyes" ; then
+            use_largefiles=1
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+        fi
+
+else
+
+	if test `uname` = "AIX"
+	then
+	    use_largefiles=0
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+	else
+	    use_largefiles=1
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+	fi
+
+
+fi
+
+
+# Settings for largefiles support
+if test "$use_largefiles" = 1; then
+        # Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+fi
+
+fi
+
+
+# ------------------------------------------------------------------------
+# PAM Code
+# ------------------------------------------------------------------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PAM support" >&5
+$as_echo_n "checking for PAM support... " >&6; }
+
+# Check whether --with-pam was given.
+if test "${with_pam+set}" = set; then :
+  withval=$with_pam;
+                if test "x$withval" = "xno" ; then
+            use_pam=0
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+        fi
+        if test "x$withval" = "xyes" ; then
+            use_pam=1
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+        fi
+
+else
+
+        if test "x$use_pam" = "x" ; then
+            use_pam=1
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+        fi
+
+
+fi
+
+
+if test "$use_pam" = "1"; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5
+$as_echo_n "checking for pam_start in -lpam... " >&6; }
+if test "${ac_cv_lib_pam_pam_start+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpam  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pam_start ();
+int
+main ()
+{
+return pam_start ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pam_pam_start=yes
+else
+  ac_cv_lib_pam_pam_start=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_start" >&5
+$as_echo "$ac_cv_lib_pam_pam_start" >&6; }
+if test "x$ac_cv_lib_pam_pam_start" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPAM 1
+_ACEOF
+
+  LIBS="-lpam $LIBS"
+
+else
+  as_fn_error "PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam" "$LINENO" 5
+fi
+
+fi
+
+
+# ------------------------------------------------------------------------
+# SSL Code
+# ------------------------------------------------------------------------
+
+# Check for ssl includes
+checksslincldir() { :
+    if test -f "$1/openssl/ssl.h"; then
+        sslincldir="$1"
+        return 0
+    fi
+    return 1
+}
+
+# Check for ssl libraries
+checkssllibdirdynamic() { :
+    CRYPTOLIB=`ls -1 $1/libcrypto.so* $1/libcrypto.dylib* 2>/dev/null | wc -l`
+    SSLLIB=`ls -1 $1/libssl.so* $1/libssl.dylib* 2>/dev/null | wc -l`
+    if test "(" $CRYPTOLIB -gt 0 -a $SSLLIB -gt 0 ")"
+    then
+        ssllibdir="$1"
+        return 0
+    fi
+    return 1
+}
+
+checkssllibdirstatic() { :
+    if test "(" -f "$1/libcrypto.a" ")"  -a \
+            "(" -f "$1/libssl.a" ")" ; then
+        ssllibdir="$1"
+        return 0
+    fi
+    return 1
+}
+
+# Check if we want to have SSL
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for static SSL support" >&5
+$as_echo_n "checking for static SSL support... " >&6; }
+
+
+# Check whether --with-ssl-static was given.
+if test "${with_ssl_static+set}" = set; then :
+  withval=$with_ssl_static;
+                for dir in "$withval" "$withval/include"; do
+            checksslincldir "$dir"
+        done
+        for dir in "$withval" "$withval/lib"; do
+            checkssllibdirstatic "$dir" && break 2
+        done
+        use_sslstatic=1
+        LDFLAGS="`echo $LDFLAGS | sed -e 's/-rdynamic/-ldl/g'`"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+
+$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
+
+
+
+        CFLAGS="$CFLAGS -I$sslincldir"
+        LIBS="$LIBS $ssllibdir/libssl.a $ssllibdir/libcrypto.a"
+
+else
+
+	use_sslstatic=0
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+
+
+fi
+
+
+if test "$use_sslstatic" = "0"
+then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL support" >&5
+$as_echo_n "checking for SSL support... " >&6; }
+
+
+# Check whether --with-ssl was given.
+if test "${with_ssl+set}" = set; then :
+  withval=$with_ssl;
+                        if test "x$withval" = "xno" ; then
+                use_ssl=0
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+            fi
+            if test "x$withval" = "xyes" ; then
+                use_ssl=1
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+            fi
+
+else
+
+            use_ssl=1
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled" >&5
+$as_echo "enabled" >&6; }
+
+
+fi
+
+
+
+    # Check for SSL directory
+    if test "$use_ssl" = "1"; then
+
+
+# Check whether --with-ssl-dir was given.
+if test "${with_ssl_dir+set}" = set; then :
+  withval=$with_ssl_dir;
+                                for dir in "$withval" "$withval/include"; do
+                	checksslincldir "$dir"
+                done
+                for dir in "$withval" "$withval/lib"; do
+                    checkssllibdirdynamic "$dir" && break 2
+                done
+
+
+fi
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL include directory" >&5
+$as_echo_n "checking for SSL include directory... " >&6; }
+
+# Check whether --with-ssl-incl-dir was given.
+if test "${with_ssl_incl_dir+set}" = set; then :
+  withval=$with_ssl_incl_dir;
+                                checksslincldir "$withval"
+
+else
+
+                if test -z "$sslincldir"; then
+                                        for maindir in /usr /usr/local /usr/lib /usr/pkg /var /opt /usr/sfw /opt/csw /opt/freeware; do
+                        for dir in "$maindir/include"\
+                                   "$maindir/include/openssl"\
+                                   "$maindir/include/ssl"\
+                                   "$maindir/ssl/include"; do
+                            checksslincldir $dir && break 2
+                        done
+                    done
+                fi
+
+
+fi
+
+        if test -z "$sslincldir"; then
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5
+$as_echo "Not found" >&6; }
+            echo
+            echo "Couldn't find your SSL header files."
+            echo "Use --with-ssl-incl-dir option to fix this problem or disable"
+            echo "the SSL support with --without-ssl"
+            echo
+            exit 1
+        fi
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sslincldir" >&5
+$as_echo "$sslincldir" >&6; }
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL library directory" >&5
+$as_echo_n "checking for SSL library directory... " >&6; }
+
+# Check whether --with-ssl-lib-dir was given.
+if test "${with_ssl_lib_dir+set}" = set; then :
+  withval=$with_ssl_lib_dir;
+                                checkssllibdirdynamic "$withval"
+
+else
+
+                if test -z "$ssllibdir"; then
+                                        for maindir in "" \
+                                   /usr \
+                                   /usr/local \
+                                   /usr/pkg \
+                                   /var \
+                                   /opt \
+                                   /usr/sfw \
+                                   /opt/csw \
+                                   /opt/freeware; do
+                        for dir in $maindir \
+                                   $maindir/openssl \
+                                   $maindir/ssl \
+                                   $maindir/lib \
+                                   $maindir/lib/openssl \
+                                   $maindir/lib/ssl \
+                                   $maindir/ssl/lib \
+                                   $maindir/lib/64 \
+                                   $maindir/lib/64/openssl \
+                                   $maindir/lib/64/ssl \
+                                   $maindir/ssl/lib/64 \
+                                   $maindir/lib64 \
+                                   $maindir/lib64/openssl \
+                                   $maindir/lib64/ssl \
+                                   $maindir/ssl/lib64 \
+                                   $maindir/lib/${build} \
+                                   $maindir/lib/${build_alias}; do
+                            checkssllibdirdynamic $dir && break 2
+                        done
+                    done
+                fi
+
+
+fi
+
+        if test -z "$ssllibdir"; then
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5
+$as_echo "Not found" >&6; }
+            echo
+            echo "Couldn't find your SSL library files."
+            echo "Use --with-ssl-lib-dir option to fix this problem or disable the"
+            echo "SSL support with --without-ssl"
+            echo
+            exit 1
+        fi
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ssllibdir" >&5
+$as_echo "$ssllibdir" >&6; }
+
+
+$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
+
+
+
+    fi
+
+    # Add SSL includes and libraries
+    if test "$sslincldir" -a "$ssllibdir"
+    then
+        if test "x$ARCH" = "xDARWIN"; then
+         # Darwin already knows about ssldirs
+         LIBS="$LIBS -lssl -lcrypto"
+        elif test -f "/usr/kerberos/include/krb5.h"; then
+         # Redhat 9 compilation fix:
+         CFLAGS="$CFLAGS -I$sslincldir -I/usr/kerberos/include"
+         LIBS="$LIBS -L$ssllibdir -lssl -lcrypto"
+        else
+         CFLAGS="$CFLAGS -I$sslincldir"
+         LIBS="$LIBS -L$ssllibdir -lssl -lcrypto"
+        fi
+    fi
+fi
+
+# ------------------------------------------------------------------------
+# Outputs
+# ------------------------------------------------------------------------
+
+
+
+ac_config_headers="$ac_config_headers src/config.h"
+
+ac_config_files="$ac_config_files Makefile"
+
+ac_config_files="$ac_config_files contrib/monit.upstart"
+
+ac_config_files="$ac_config_files contrib/monit.service"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by monit $as_me 5.4, which was
+generated by GNU Autoconf 2.65.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <monit-general@nongnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+monit config.status 5.4
+configured by $0, generated by GNU Autoconf 2.65,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
+macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
+host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
+host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
+host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
+build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
+build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
+build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
+SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
+Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
+GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
+EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
+FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
+LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
+NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
+LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
+exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
+AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
+GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
+SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
+ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
+need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
+LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
+libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
+version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
+striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+SHELL \
+ECHO \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
+  ;;
+esac
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "libtool_patch") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool_patch" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "contrib/monit.upstart") CONFIG_FILES="$CONFIG_FILES contrib/monit.upstart" ;;
+    "contrib/monit.service") CONFIG_FILES="$CONFIG_FILES contrib/monit.service" ;;
+
+  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+	|| as_fn_error "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "libtool_patch":C) test `uname` = "OpenBSD" && perl -p -i -e "s/deplibs_check_method=.*/deplibs_check_method=pass_all/g" libtool ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that does not interpret backslashes.
+ECHO=$lt_ECHO
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
+    ;;
+  esac
+
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit $?
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+  # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+  # so they do not pile up.
+  ac_sub_configure_args=
+  ac_prev=
+  eval "set x $ac_configure_args"
+  shift
+  for ac_arg
+  do
+    if test -n "$ac_prev"; then
+      ac_prev=
+      continue
+    fi
+    case $ac_arg in
+    -cache-file | --cache-file | --cache-fil | --cache-fi \
+    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+      ac_prev=cache_file ;;
+    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+    | --c=*)
+      ;;
+    --config-cache | -C)
+      ;;
+    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+      ac_prev=srcdir ;;
+    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+      ;;
+    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+      ac_prev=prefix ;;
+    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+      ;;
+    --disable-option-checking)
+      ;;
+    *)
+      case $ac_arg in
+      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      esac
+      as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+    esac
+  done
+
+  # Always prepend --prefix to ensure using the same prefix
+  # in subdir configurations.
+  ac_arg="--prefix=$prefix"
+  case $ac_arg in
+  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+  # Pass --silent
+  if test "$silent" = yes; then
+    ac_sub_configure_args="--silent $ac_sub_configure_args"
+  fi
+
+  # Always prepend --disable-option-checking to silence warnings, since
+  # different subdirs can have different --enable and --with options.
+  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+  ac_popdir=`pwd`
+  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+    # Do not complain, so a configure script can configure whichever
+    # parts of a large source tree are present.
+    test -d "$srcdir/$ac_dir" || continue
+
+    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+    $as_echo "$ac_msg" >&6
+    as_dir="$ac_dir"; as_fn_mkdir_p
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+    cd "$ac_dir"
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      ac_sub_configure=$ac_srcdir/configure.gnu
+    elif test -f "$ac_srcdir/configure"; then
+      ac_sub_configure=$ac_srcdir/configure
+    elif test -f "$ac_srcdir/configure.in"; then
+      # This should be Cygnus configure.
+      ac_sub_configure=$ac_aux_dir/configure
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+      ac_sub_configure=
+    fi
+
+    # The recursion is here.
+    if test -n "$ac_sub_configure"; then
+      # Make the cache file name correct relative to the subdirectory.
+      case $cache_file in
+      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+      *) # Relative name.
+	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+      esac
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      # The eval makes quoting arguments work.
+      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+	as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+    fi
+
+    cd "$ac_popdir"
+  done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo
+echo "Monit Build Information:"
+echo
+echo "                Architecture: ${ARCH}"
+if test "$use_sslstatic" = "1" -o "$use_ssl" = "1"; then
+echo "       SSL include directory: ${sslincldir}"
+echo "       SSL library directory: ${ssllibdir}"
+fi
+echo "              Compiler flags: ${CFLAGS}"
+echo "                Linker flags: ${LIBS}"
+echo "           pid file location: ${piddir}"
+echo "           Install directory: ${prefix}"
+echo
+
+cat <<EOT
++------------------------------------------------------------+
+| License:                                                   |
+| This is Open Source Software and use is subject to the GNU |
+| AFFERO GENERAL PUBLIC LICENSE version 3, available in this |
+| distribution in the file COPYING.                          |
+|                                                            |
+| By continuing this installation process, you are bound by  |
+| the terms of this license agreement. If you do not agree   |
+| with the terms of this license, you must abort the         |
+| installation process at this point.                        |
++------------------------------------------------------------+
+| Monit has been configured with the following options:      |
+|                                                            |
+EOT
+if test "$use_pam" = "1"; then
+echo "|   PAM support:                                  ENABLED    |"
+else
+echo "|   PAM support:                                  DISABLED   |"
+fi
+if test "$use_sslstatic" = "1" -o "$use_ssl" = "1"; then
+echo "|   SSL support:                                  ENABLED    |"
+else
+echo "|   SSL support:                                  DISABLED   |"
+fi
+if test "$use_largefiles" = "1"; then
+echo "|   Large files support:                          ENABLED    |"
+else
+echo "|   Large files support:                          DISABLED   |"
+fi
+if test "x1" = "x$OPTIMIZED"; then
+echo "|   Optimized:                                    ENABLED    |"
+else
+echo "|   Optimized:                                    DISABLED   |"
+fi
+echo "+------------------------------------------------------------+"
diff --git a/monit-5.4/configure.ac b/monit-5.4/configure.ac
new file mode 100644
index 0000000..cc1ff23
--- /dev/null
+++ b/monit-5.4/configure.ac
@@ -0,0 +1,890 @@
+# Process this file with bootstrap to produce a configure script.
+
+# autoconf requirement
+AC_PREREQ([2.53])
+
+# Note: in  case of beta subversion, use underscore "_" rather then dash "-"
+# since RPM doesn't allow dash in Version
+# Example: 5.0_beta2
+AC_INIT([monit], [5.4], [monit-general@nongnu.org])
+AC_CONFIG_AUX_DIR(config)
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE
+AC_CONFIG_SRCDIR([src/monit.c])
+AC_CONFIG_SUBDIRS([libmonit])
+AC_CONFIG_COMMANDS([libtool_patch],[test `uname` = "OpenBSD" && perl -p -i -e "s/deplibs_check_method=.*/deplibs_check_method=pass_all/g" libtool])
+
+
+# ------------------------------------------------------------------------
+# Programs 
+# ------------------------------------------------------------------------
+
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+AC_CHECK_PROGS([YACC], ['bison -y' byacc yacc], [no], [$PATH:/usr/local/bin:/usr/bin])
+if test "x$YACC" = "xno"; then
+	# Require bison unless y.tab.c already is built
+	if test ! -f src/y.tab.c; then
+                AC_MSG_ERROR([Monit require bison, byacc or yacc. Download bison from http://www.gnu.org/software/bison/])
+	fi
+fi
+AC_PATH_PROG([FLEX], [flex], [no], [$PATH:/usr/local/bin:/usr/bin])
+if test "x$FLEX" = "xno"; then
+	# Require flex unless lex.yy.c already is built
+	if test ! -f src/lex.yy.c; then
+                AC_MSG_RESULT([flex is required. Download from http://www.gnu.org/software/flex/])
+	fi
+fi
+AC_PATH_PROG([POD2MAN], [pod2man], [no], [$PATH:/usr/local/bin:/usr/bin])
+if test "x$POD2MAN" = "xno"; then
+	# Require pod2man unless monit.1 already is built
+	if test ! -f monit.1; then
+		AC_MSG_ERROR([pod2man is required to build the monit.1 man file.])
+	fi
+else
+	d=`date  '+%B %d. %Y'`
+	POD2MANFLAGS="--center 'User Commands' --release '${d}' --date='www.mmonit.com' --lax"
+	AC_SUBST([POD2MANFLAGS])
+fi
+
+
+# ------------------------------------------------------------------------
+# Libtool 
+# ------------------------------------------------------------------------
+
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
+
+
+# ---------------------------------------------------------------------------
+# Build options
+# ---------------------------------------------------------------------------
+
+AC_ARG_ENABLE(optimized,
+        AS_HELP_STRING([--enable-optimized],
+                [Build software optimized]),
+    [
+        CFLAGS=`echo $CFLAGS|sed 's/-O.//'`
+        if test "x$enableval" = "xyes" ; then
+                CFLAGS=`echo $CFLAGS|sed 's/-g//'`
+                CFLAGS="$CFLAGS -O3"
+                OPTIMIZED=1
+        else
+                OPTIMIZED=0
+        fi
+    ],
+    [
+        OPTIMIZED=0
+    ]
+)
+
+
+# ------------------------------------------------------------------------
+# Libraries 
+# ------------------------------------------------------------------------
+
+# Check for libraries
+AC_CHECK_LIB([socket], [socket])
+AC_CHECK_LIB([inet],   [socket])
+AC_CHECK_LIB([nsl],    [inet_addr])
+AC_CHECK_LIB([resolv], [inet_aton])
+AC_CHECK_LIB([c], [crypt], [:], [AC_CHECK_LIB([crypt], [crypt])])
+
+AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([POSIX thread library is required])])
+
+# ------------------------------------------------------------------------
+# Header files 
+# ------------------------------------------------------------------------
+
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_HEADER_STAT
+AC_HEADER_TIME
+
+AC_CHECK_HEADERS([ \
+        alloca.h \
+	arpa/inet.h \
+	asm/page.h \
+	asm/param.h \
+	cf.h \
+	crt_externs.h \
+	ctype.h \
+	crypt.h \
+	dirent.h \
+	errno.h \
+	execinfo.h \
+	fcntl.h \
+	getopt.h \
+	glob.h \
+	grp.h \
+	kvm.h \
+	paths.h \
+	kstat.h \
+	sys/protosw.h \
+	limits.h \
+	loadavg.h \
+	locale.h \
+        mach/host_info.h \
+        mach/mach.h \
+        mach/mach_host.h \
+	memory.h \
+	mntent.h \
+	netdb.h \
+        sys/socket.h \
+	netinet/in.h \
+        netinet/in_systm.h \
+        pam/pam_appl.h \
+        security/pam_appl.h \
+	poll.h \
+	procfs.h \
+	sys/procfs.h \
+	procinfo.h \
+	pthread.h \
+	pwd.h \
+	regex.h \
+	setjmp.h \
+	signal.h \
+	stdarg.h \
+        stddef.h \
+	stdio.h \
+	string.h \
+	strings.h \
+	stropts.h \
+	sys/cfgodm.h \
+	sys/cfgdb.h \
+	sys/dk.h \
+	sys/dkstat.h \
+	sys/filio.h \
+	sys/ioctl.h \
+	sys/loadavg.h \
+	sys/lock.h \
+	sys/mnttab.h \
+	sys/mutex.h \
+	sys/nlist.h \
+	sys/param.h \
+	sys/pstat.h \
+	sys/queue.h \
+	sys/resource.h \
+	sys/statfs.h \
+	sys/statvfs.h \
+	sys/sysinfo.h \
+	sys/systemcfg.h \
+	sys/time.h \
+	sys/tree.h \
+	sys/types.h \
+	sys/un.h \
+	sys/utsname.h \
+        sys/vmmeter.h \
+	sys/vfs.h \
+	syslog.h \
+	unistd.h \
+        uvm/uvm.h \
+        uvm/uvm_extern.h \
+        vm/vm.h \
+	])
+
+AC_CHECK_HEADERS([ \
+	libperfstat.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_PROTOSW_H
+         #include <sys/protosw.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+	netinet/ip.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_TYPES_H
+         #include <sys/types.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in_systm.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+	net/if.h \
+	netinet/ip_icmp.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_TYPES_H
+         #include <sys/types.h>
+         #endif
+         #if HAVE_SYS_SOCKET_H
+         #include <sys/socket.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in.h>
+         #endif
+         #if HAVE_NETINET_IN_SYSTM_H
+         #include <netinet/in_systm.h>
+         #endif
+         #if HAVE_NETINET_IP_H
+         #include <netinet/ip.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+        sys/sysctl.h \
+        sys/mount.h \
+        sys/proc.h \
+        sys/swap.h \
+	sys/ucred.h \
+        sys/user.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_PARAM_H
+         #include <sys/param.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+	machine/vmparam.h \
+        vm/pmap.h \
+        machine/pmap.h \
+        vm/vm_map.h \
+	vm/vm_object.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_PARAM_H
+         #include <sys/param.h>
+         #endif
+         #ifdef HAVE_SYS_QUEUE_H
+         #include <sys/queue.h>
+         #endif
+         #ifdef HAVE_SYS_LOCK_H
+         #include <sys/lock.h>
+         #endif
+         #ifdef HAVE_SYS_MUTEX_H
+         #include <sys/mutex.h>
+         #endif
+         #ifdef HAVE_VM_VM_H
+         #include <vm/vm.h>
+         #endif
+         #ifdef HAVE_VM_PMAP_H
+         #include <vm/pmap.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+        sys/resourcevar.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_TIME_H
+         #include <sys/time.h>
+         #endif
+         #ifdef HAVE_SYS_RESOURCE_H
+         #include <sys/resource.h>
+         #endif
+        ])
+
+AC_CHECK_HEADERS([ \
+	uvm/uvm_map.h \
+	uvm/uvm_pmap.h \
+	uvm/uvm_object.h \
+        ],
+        [],
+        [],
+        [
+         #ifdef HAVE_SYS_TIME_H
+         #include <sys/time.h>
+         #endif
+         #ifdef HAVE_SYS_LOCK_H
+         #include <sys/lock.h>
+         #endif
+         #ifdef HAVE_SYS_TREE_H
+         #include <sys/tree.h>
+         #endif
+         #ifdef HAVE_UVM_UVM_EXTERN_H
+         #include <uvm/uvm_extern.h>
+         #endif
+        ])
+
+# Check for types.
+AC_TYPE_MODE_T
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_PID_T
+AC_TYPE_SIGNAL
+
+# Check for structures.
+AC_STRUCT_TM
+AC_CHECK_MEMBERS([struct tm.tm_gmtoff])
+
+
+# ------------------------------------------------------------------------
+# Functions 
+# ------------------------------------------------------------------------
+
+# Checks for library functions.
+AC_FUNC_ERROR_AT_LINE
+AC_FUNC_FORK
+AC_FUNC_STAT
+AC_FUNC_STRFTIME
+AC_CHECK_FUNCS(statfs)
+AC_CHECK_FUNCS(statvfs)
+AC_CHECK_FUNCS(setlocale)
+AC_CHECK_FUNCS(getaddrinfo)
+AC_CHECK_FUNCS(syslog)
+AC_CHECK_FUNCS(vsyslog)
+AC_CHECK_FUNCS(backtrace)
+AC_CHECK_FUNCS(getloadavg)
+
+# Check for SOL_IP
+AC_MSG_CHECKING(for SOL_IP)
+AC_TRY_COMPILE([
+	#include <netdb.h>
+	#include <sys/socket.h>], 
+	[int level = SOL_IP;], 
+	[AC_MSG_RESULT(yes)
+	AC_DEFINE([HAVE_SOL_IP], [1], [Define to 1 if SOL_IP is defined.])], 
+	[AC_MSG_RESULT(no)])
+
+AC_MSG_CHECKING(for va_copy)
+AC_TRY_LINK([
+	#include <stdarg.h>
+], [
+	va_list ap;
+	va_list ap_copy;
+	va_copy(ap, ap_copy);
+], [
+	AC_MSG_RESULT(yes)
+	AC_DEFINE([HAVE_VA_COPY], [1], [Define to 1 if VA_COPY is defined.])
+], [
+	AC_MSG_RESULT(no)
+])
+
+
+# ------------------------------------------------------------------------
+# Compiler 
+# ------------------------------------------------------------------------
+
+# Compiler characteristics
+AC_C_CONST
+AC_C_BIGENDIAN
+
+# If the compiler is gcc, tune warnings and make the char type unsigned 
+# and enable C99 support
+if test "x$GCC" = "xyes"; then
+	CFLAGS="$CFLAGS -Wall -Wunused -Wno-unused-label -funsigned-char";
+        # Add C99 support
+        CFLAGS="$CFLAGS -D_GNU_SOURCE -std=c99"
+        # does this compiler support -Wno-pointer-sign ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-pointer-sign $CFLAGS"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])        
+        # does this compiler support -Wno-address ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-address $CFLAGS"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])
+fi
+
+
+# ------------------------------------------------------------------------
+# Paths 
+# ------------------------------------------------------------------------
+
+# Find the right directory to put the root-mode PID file in
+AC_MSG_CHECKING([pid file location])
+if test -d "/var/run"
+then
+	piddir="/var/run"
+elif test -d "/etc"
+then
+	piddir="/etc"
+fi
+
+AC_DEFINE_UNQUOTED([PIDDIR], "$piddir",
+	  [Define to the pid storage directory.])
+AC_MSG_RESULT([$piddir])
+
+# Test mounted filesystem description file
+if test -f "/etc/mtab"
+then
+  AC_DEFINE([HAVE_MTAB], 1, [Define to 1 if you have /etc/mtab])
+elif test -f "/etc/mnttab"; then
+  AC_DEFINE([HAVE_MNTTAB], 1, [Define to 1 if you have /etc/mnttab])
+fi
+
+# ------------------------------------------------------------------------
+# Architecture/OS detection
+# ------------------------------------------------------------------------
+
+# Backward compatibility until we get ride of arch settings
+architecture=`uname`
+if test "$architecture" = "SunOS" 
+then
+   ARCH="SOLARIS"
+   CFLAGS="$CFLAGS -D _REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -m64"
+   LDFLAGS="$LDFLAGS -m64"
+   test_kstat="true"
+   AC_DEFINE([HAVE_CPU_WAIT], [1], [Define to 1 if CPU wait information is available.])
+   if test `uname -m` = "i86pc"
+   then
+      if test "x$GCC" = "xyes"
+      then
+            CFLAGS="$CFLAGS -mtune=opteron"
+            LDFLAGS="$LDFLAGS -mtune=opteron"
+      else
+            CFLAGS="$CFLAGS -xarch=sse2"
+            LDFLAGS="$LDFLAGS -xarch=sse2"
+      fi
+   else
+      if test "x$GCC" = "xyes"
+      then
+            CFLAGS="$CFLAGS -mtune=v9"
+            LDFLAGS="$LDFLAGS -mtune=v9"
+      else
+            CFLAGS="$CFLAGS -xarch=sparc"
+            LDFLAGS="$LDFLAGS -xarch=sparc"
+      fi
+   fi
+elif test "$architecture" = "Linux" 
+then
+   ARCH="LINUX"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   LDFLAGS="$LDFLAGS -rdynamic"
+   if test `uname -r | awk -F '.' '{print$1$2}'` -ge "26"
+   then
+   	AC_DEFINE([HAVE_CPU_WAIT], [1], [Define to 1 if CPU wait information is available.])
+   fi
+elif test "$architecture" = "HP-UX"
+then
+   ARCH="HPUX"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   AC_DEFINE([HAVE_CPU_WAIT], [1], [Define to 1 if CPU wait information is available.])
+elif test "$architecture" = "OpenBSD"
+then
+   ARCH="OPENBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+   use_pam=0 # No PAM on OpenBSD (supports BSD Auth API instead of PAM)
+elif test "$architecture" = "FreeBSD"
+then
+   ARCH="FREEBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "GNU/kFreeBSD"
+then
+   ARCH="FREEBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "NetBSD"
+then
+   ARCH="NETBSD"
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   test_kvm="true"
+elif test "$architecture" = "Darwin"
+then
+   ARCH="DARWIN"
+   CFLAGS="$CFLAGS -DREENTRANT -no-cpp-precomp -DNEED_SOCKLEN_T_DEFINED"
+   test_kvm="true"
+   LIBS="$LIBS -framework System -multiply_defined suppress"
+elif test "$architecture" = "AIX"
+then
+   ARCH="AIX"
+   CFLAGS="$CFLAGS -D_THREAD_SAFE -D_REENTRANT"
+   LIBS="$LIBS -lodm"	
+   # AIX v. 5.2
+   LIBS="$LIBS -lcfg"	
+   # AIX v. 5.3
+   LIBS="$LIBS -lperfstat"	
+   AC_DEFINE([HAVE_CPU_WAIT], [1], [Define to 1 if CPU wait information is available.])
+else
+   AC_MSG_WARN([Architecture not supported: ${architecture}])
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   ARCH="UNKNOWN"
+fi
+AC_SUBST(ARCH)
+
+# ------------------------------------------------------------------------
+# Resource code
+# ------------------------------------------------------------------------
+
+# Test for kvm libs
+kvm_libs=""
+if test "$test_kvm"; then
+       	AC_CHECK_LIB([kvm],
+        	     [kvm_open],
+        	     [kvm_libs="-lkvm"])
+       	if test "$kvm_libs"
+       	then
+       	        LIBS="$LIBS $kvm_libs"
+       	fi
+fi
+kstat_libs=""
+if test "$test_kstat"; then
+       	AC_CHECK_LIB([kstat],
+        	     [kstat_open],
+        	     [kstat_libs="-lkstat"])
+       	if test "$kstat_libs"
+       	then
+       	        LIBS="$LIBS $kstat_libs"
+       	fi
+fi
+
+
+# ------------------------------------------------------------------------
+# Large files code
+# ------------------------------------------------------------------------
+
+# Check if we want to have large files support
+AC_MSG_CHECKING([for large files support])
+AC_ARG_WITH(largefiles,
+    [  --without-largefiles    disable large files support (default: enabled)],
+    [
+        dnl Check the withvalue                
+        if test "x$withval" = "xno" ; then
+            use_largefiles=0
+            AC_MSG_RESULT([disabled])
+        fi
+        if test "x$withval" = "xyes" ; then
+            use_largefiles=1
+            AC_MSG_RESULT([enabled])
+        fi
+    ],
+    [
+	if test `uname` = "AIX"
+	then
+	    use_largefiles=0
+	    AC_MSG_RESULT([disabled])
+	else
+	    use_largefiles=1
+	    AC_MSG_RESULT([enabled])
+	fi
+    ]
+)
+
+# Settings for largefiles support
+if test "$use_largefiles" = 1; then
+        AC_SYS_LARGEFILE
+fi
+
+
+# ------------------------------------------------------------------------
+# PAM Code
+# ------------------------------------------------------------------------
+
+AC_MSG_CHECKING([for PAM support])
+AC_ARG_WITH(pam,
+    [  --without-pam           disable the use of pam (default: enabled)],
+    [
+        dnl Check the withvalue                
+        if test "x$withval" = "xno" ; then
+            use_pam=0
+            AC_MSG_RESULT([disabled])
+        fi
+        if test "x$withval" = "xyes" ; then
+            use_pam=1
+            AC_MSG_RESULT([enabled])
+        fi
+    ],
+    [
+        if test "x$use_pam" = "x" ; then
+            use_pam=1
+            AC_MSG_RESULT([enabled])
+        fi
+    ]
+)
+
+if test "$use_pam" = "1"; then
+        AC_CHECK_LIB([pam], [pam_start], [], [AC_MSG_ERROR([PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam])])
+fi
+
+
+# ------------------------------------------------------------------------
+# SSL Code
+# ------------------------------------------------------------------------
+
+# Check for ssl includes
+checksslincldir() { :
+    if test -f "$1/openssl/ssl.h"; then
+        sslincldir="$1"
+        return 0
+    fi
+    return 1
+}
+
+# Check for ssl libraries 
+checkssllibdirdynamic() { :
+    CRYPTOLIB=`ls -1 $1/libcrypto.so* $1/libcrypto.dylib* 2>/dev/null | wc -l`
+    SSLLIB=`ls -1 $1/libssl.so* $1/libssl.dylib* 2>/dev/null | wc -l`
+    if test "(" $CRYPTOLIB -gt 0 -a $SSLLIB -gt 0 ")"
+    then
+        ssllibdir="$1"
+        return 0
+    fi
+    return 1
+}
+
+checkssllibdirstatic() { :
+    if test "(" -f "$1/libcrypto.a" ")"  -a \
+            "(" -f "$1/libssl.a" ")" ; then
+        ssllibdir="$1"
+        return 0
+    fi
+    return 1
+}
+
+# Check if we want to have SSL
+
+AC_MSG_CHECKING([for static SSL support])
+
+AC_ARG_WITH(ssl-static,
+    [  --with-ssl-static=DIR       location of SSL installation],
+    [
+        dnl Check the specified location only
+        for dir in "$withval" "$withval/include"; do
+            checksslincldir "$dir"
+        done
+        for dir in "$withval" "$withval/lib"; do
+            checkssllibdirstatic "$dir" && break 2
+        done
+        use_sslstatic=1
+        LDFLAGS="`echo $LDFLAGS | sed -e 's/-rdynamic/-ldl/g'`"
+        AC_MSG_RESULT([enabled])
+        AC_DEFINE([HAVE_OPENSSL], 1, [Define to 1 if you have openssl.])
+        AC_SUBST(sslincldir)
+        AC_SUBST(ssllibdir)
+        CFLAGS="$CFLAGS -I$sslincldir"
+        LIBS="$LIBS $ssllibdir/libssl.a $ssllibdir/libcrypto.a"
+    ],
+    [
+	use_sslstatic=0
+        AC_MSG_RESULT([disabled])
+    ]
+)
+
+if test "$use_sslstatic" = "0"
+then
+    AC_MSG_CHECKING([for SSL support])
+
+    AC_ARG_WITH(ssl,
+        [  --without-ssl           disable the use of ssl (default: enabled)],
+        [
+            dnl Check the withvalue                
+            if test "x$withval" = "xno" ; then
+                use_ssl=0
+                AC_MSG_RESULT([disabled])
+            fi
+            if test "x$withval" = "xyes" ; then
+                use_ssl=1
+                AC_MSG_RESULT([enabled])
+            fi
+        ],
+        [
+            use_ssl=1
+            AC_MSG_RESULT([enabled])
+        ]
+    )
+
+
+    # Check for SSL directory
+    if test "$use_ssl" = "1"; then
+
+        AC_ARG_WITH(ssl-dir,
+            [  --with-ssl-dir=DIR       location of SSL installation],
+            [
+                dnl Check the specified location only
+                for dir in "$withval" "$withval/include"; do
+                	checksslincldir "$dir"
+                done
+                for dir in "$withval" "$withval/lib"; do
+                    checkssllibdirdynamic "$dir" && break 2
+                done
+            ]
+        )
+
+        AC_MSG_CHECKING([for SSL include directory])
+        AC_ARG_WITH(ssl-incl-dir,
+            [  --with-ssl-incl-dir=DIR  location of installed SSL include files],
+            [
+                dnl Check the specified location only
+                checksslincldir "$withval"
+            ],
+            [
+                if test -z "$sslincldir"; then	
+                    dnl Search default locations of SSL includes
+                    for maindir in /usr /usr/local /usr/lib /usr/pkg /var /opt /usr/sfw /opt/csw /opt/freeware; do
+                        for dir in "$maindir/include"\
+                                   "$maindir/include/openssl"\ 
+                                   "$maindir/include/ssl"\
+                                   "$maindir/ssl/include"; do
+                            checksslincldir $dir && break 2
+                        done
+                    done
+                fi
+            ]
+        )
+        if test -z "$sslincldir"; then
+            AC_MSG_RESULT([Not found])
+            echo
+            echo "Couldn't find your SSL header files."
+            echo "Use --with-ssl-incl-dir option to fix this problem or disable"
+            echo "the SSL support with --without-ssl"
+            echo
+            exit 1
+        fi
+        AC_MSG_RESULT([$sslincldir])
+
+        AC_MSG_CHECKING([for SSL library directory])
+        AC_ARG_WITH(ssl-lib-dir,
+            [  --with-ssl-lib-dir=DIR   location of installed SSL library files],
+            [
+                dnl Check the specified location only
+                checkssllibdirdynamic "$withval"
+            ],
+            [
+                if test -z "$ssllibdir"; then	
+                    dnl Search default locations of SSL libraries
+                    for maindir in "" \
+                                   /usr \
+                                   /usr/local \
+                                   /usr/pkg \
+                                   /var \
+                                   /opt \
+                                   /usr/sfw \
+                                   /opt/csw \
+                                   /opt/freeware; do
+                        for dir in $maindir \
+                                   $maindir/openssl \
+                                   $maindir/ssl \
+                                   $maindir/lib \
+                                   $maindir/lib/openssl \
+                                   $maindir/lib/ssl \
+                                   $maindir/ssl/lib \
+                                   $maindir/lib/64 \
+                                   $maindir/lib/64/openssl \
+                                   $maindir/lib/64/ssl \
+                                   $maindir/ssl/lib/64 \
+                                   $maindir/lib64 \
+                                   $maindir/lib64/openssl \
+                                   $maindir/lib64/ssl \
+                                   $maindir/ssl/lib64 \
+                                   $maindir/lib/${build} \
+                                   $maindir/lib/${build_alias}; do
+                            checkssllibdirdynamic $dir && break 2
+                        done
+                    done
+                fi
+            ]
+        )
+        if test -z "$ssllibdir"; then
+            AC_MSG_RESULT([Not found])
+            echo
+            echo "Couldn't find your SSL library files."
+            echo "Use --with-ssl-lib-dir option to fix this problem or disable the"
+            echo "SSL support with --without-ssl"
+            echo
+            exit 1
+        fi
+        AC_MSG_RESULT([$ssllibdir])
+
+        AC_DEFINE([HAVE_OPENSSL], 1, [Define to 1 if you have openssl.])
+        AC_SUBST(sslincldir)
+        AC_SUBST(ssllibdir)
+    fi
+
+    # Add SSL includes and libraries
+    if test "$sslincldir" -a "$ssllibdir"
+    then
+        if test "x$ARCH" = "xDARWIN"; then
+         # Darwin already knows about ssldirs
+         LIBS="$LIBS -lssl -lcrypto"
+        elif test -f "/usr/kerberos/include/krb5.h"; then
+         # Redhat 9 compilation fix:
+         CFLAGS="$CFLAGS -I$sslincldir -I/usr/kerberos/include"
+         LIBS="$LIBS -L$ssllibdir -lssl -lcrypto"
+        else
+         CFLAGS="$CFLAGS -I$sslincldir"
+         LIBS="$LIBS -L$ssllibdir -lssl -lcrypto"
+        fi
+    fi
+fi
+
+# ------------------------------------------------------------------------
+# Outputs
+# ------------------------------------------------------------------------
+
+AH_BOTTOM([
+/* Mask out GCC __attribute__ extension for non-gcc compilers. */
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+])
+
+AC_CONFIG_HEADER([src/config.h])
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([contrib/monit.upstart])
+AC_CONFIG_FILES([contrib/monit.service])
+
+AC_OUTPUT
+
+echo
+echo "Monit Build Information:"
+echo
+echo "                Architecture: ${ARCH}"
+if test "$use_sslstatic" = "1" -o "$use_ssl" = "1"; then
+echo "       SSL include directory: ${sslincldir}"
+echo "       SSL library directory: ${ssllibdir}"
+fi
+echo "              Compiler flags: ${CFLAGS}"
+echo "                Linker flags: ${LIBS}"
+echo "           pid file location: ${piddir}"
+echo "           Install directory: ${prefix}"
+echo
+
+cat <<EOT
++------------------------------------------------------------+
+| License:                                                   |
+| This is Open Source Software and use is subject to the GNU |
+| AFFERO GENERAL PUBLIC LICENSE version 3, available in this |
+| distribution in the file COPYING.                          |
+|                                                            |
+| By continuing this installation process, you are bound by  | 
+| the terms of this license agreement. If you do not agree   |
+| with the terms of this license, you must abort the         |
+| installation process at this point.                        |
++------------------------------------------------------------+
+| Monit has been configured with the following options:      |
+|                                                            |
+EOT
+if test "$use_pam" = "1"; then
+echo "|   PAM support:                                  ENABLED    |"
+else
+echo "|   PAM support:                                  DISABLED   |"
+fi
+if test "$use_sslstatic" = "1" -o "$use_ssl" = "1"; then
+echo "|   SSL support:                                  ENABLED    |"
+else
+echo "|   SSL support:                                  DISABLED   |"
+fi
+if test "$use_largefiles" = "1"; then
+echo "|   Large files support:                          ENABLED    |"
+else
+echo "|   Large files support:                          DISABLED   |"
+fi
+if test "x1" = "x$OPTIMIZED"; then
+echo "|   Optimized:                                    ENABLED    |"
+else
+echo "|   Optimized:                                    DISABLED   |"
+fi
+echo "+------------------------------------------------------------+"
diff --git a/monit-5.4/contrib/monit.service b/monit-5.4/contrib/monit.service
new file mode 100644
index 0000000..17b84fd
--- /dev/null
+++ b/monit-5.4/contrib/monit.service
@@ -0,0 +1,29 @@
+# This file is a systemd template for the monit service. To
+# register monit with systemd, place this file in 
+# /lib/systemd/system/ and start monit using systemctl:
+#
+# Enable monit to start on boot: 
+#         systemctl enable monit.service
+#
+# Start monit immediately: 
+#         systemctl start monit.service
+#
+# Stop monit:
+#         systemctl stop monit.service
+#
+# Status:
+#         systemctl status monit.service
+
+[Unit]
+Description=Pro-active monitoring utility for unix systems
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/local/bin/monit -I
+ExecStop=/usr/local/bin/monit quit
+ExecReload=/usr/local/bin/monit reload
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/monit-5.4/contrib/monit.service.in b/monit-5.4/contrib/monit.service.in
new file mode 100644
index 0000000..3cbbc90
--- /dev/null
+++ b/monit-5.4/contrib/monit.service.in
@@ -0,0 +1,29 @@
+# This file is a systemd template for the monit service. To
+# register monit with systemd, place this file in 
+# /lib/systemd/system/ and start monit using systemctl:
+#
+# Enable monit to start on boot: 
+#         systemctl enable monit.service
+#
+# Start monit immediately: 
+#         systemctl start monit.service
+#
+# Stop monit:
+#         systemctl stop monit.service
+#
+# Status:
+#         systemctl status monit.service
+
+[Unit]
+Description=Pro-active monitoring utility for unix systems
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=@prefix@/bin/monit -I
+ExecStop=@prefix@/bin/monit quit
+ExecReload=@prefix@/bin/monit reload
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/monit-5.4/contrib/monit.upstart b/monit-5.4/contrib/monit.upstart
new file mode 100644
index 0000000..84cbd26
--- /dev/null
+++ b/monit-5.4/contrib/monit.upstart
@@ -0,0 +1,33 @@
+# This is an upstart script to keep monit running.
+# To install, disable the old way of doing things:
+#
+#   /etc/init.d/monit stop && update-rc.d -f monit remove
+#
+# then put this script here:
+#
+#   /etc/init/monit.conf
+#
+# and reload upstart configuration:
+#
+#   initctl reload-configuration
+#
+# You can manually start and stop monit like this:
+# 
+# start monit
+# stop monit
+#
+
+description "Monit service manager"
+
+limit core unlimited unlimited
+
+start on runlevel [2345]
+stop on runlevel [!2345]
+
+expect daemon
+respawn
+
+exec /usr/local/bin/monit -c /etc/monitrc
+
+pre-stop exec /usr/local/bin/monit -c /etc/monitrc quit
+
diff --git a/monit-5.4/contrib/monit.upstart.in b/monit-5.4/contrib/monit.upstart.in
new file mode 100644
index 0000000..0abc5cc
--- /dev/null
+++ b/monit-5.4/contrib/monit.upstart.in
@@ -0,0 +1,33 @@
+# This is an upstart script to keep monit running.
+# To install, disable the old way of doing things:
+#
+#   /etc/init.d/monit stop && update-rc.d -f monit remove
+#
+# then put this script here:
+#
+#   /etc/init/monit.conf
+#
+# and reload upstart configuration:
+#
+#   initctl reload-configuration
+#
+# You can manually start and stop monit like this:
+# 
+# start monit
+# stop monit
+#
+
+description "Monit service manager"
+
+limit core unlimited unlimited
+
+start on runlevel [2345]
+stop on runlevel [!2345]
+
+expect daemon
+respawn
+
+exec @prefix@/bin/monit -c /etc/monitrc
+
+pre-stop exec @prefix@/bin/monit -c /etc/monitrc quit
+
diff --git a/monit-5.4/contrib/monitrc-gentoo b/monit-5.4/contrib/monitrc-gentoo
new file mode 100644
index 0000000..90c8a8f
--- /dev/null
+++ b/monit-5.4/contrib/monitrc-gentoo
@@ -0,0 +1,328 @@
+###############################################################################
+## Monit control file
+###############################################################################
+##
+## Comments begin with a '#' and extend through the end of the line. Keywords
+## are case insensitive. All path's MUST BE FULLY QUALIFIED, starting with '/'.
+##
+## Bellow is the example of some frequently used statements. For information
+## about the control file, a complete list of statements and options please 
+## have a look in the monit manual.
+##
+##
+###############################################################################
+## Global section
+###############################################################################
+##
+## Start monit in background (run as daemon) and check the services at 2-minute
+## intervals.
+#
+set daemon  120
+#
+#
+## Set syslog logging with the 'daemon' facility. If the FACILITY option is
+## omited, monit will use 'user' facility by default. You can specify the
+## path to the file for monit native logging.
+#
+# set logfile syslog facility log_daemon 
+#
+#
+## Set list of mailservers for alert delivery. Multiple servers may be 
+## specified using comma separator. By default monit uses port 25 - it is 
+## possible to override it with the PORT option.
+#
+# set mailserver mail.bar.baz,               # primary mailserver
+#                backup.bar.baz port 10025,  # backup mailserver on port 10025
+#                localhost                   # fallback relay
+#
+#
+## By default monit will drop the event alert, in the case that there is no
+## mailserver available. In the case that you want to keep the events for
+## later delivery retry, you can use the EVENTQUEUE statement. The base
+## directory where undelivered events will be stored is specified by the
+## BASEDIR option. You can limit the maximal queue size using the SLOTS
+## option (if omited then the queue is limited just by the backend filesystem).
+#
+# set eventqueue
+#     basedir /var/monit  # set the base directory where events will be stored
+#     slots 100           # optionally limit the queue size
+#
+#
+## Monit by default uses the following alert mail format:
+##
+## --8<--
+## From: monit@$HOST                         # sender
+## Subject: monit alert --  $EVENT $SERVICE  # subject
+##
+## $EVENT Service $SERVICE                   #
+##                                           #
+## 	Date:        $DATE                   #
+## 	Action:      $ACTION                 #
+## 	Host:        $HOST                   # body
+## 	Description: $DESCRIPTION            #
+##                                           #
+## Your faithful employee,                   #
+## monit                                     #
+## --8<--
+##
+## You can override the alert message format or its parts such as subject
+## or sender using the MAIL-FORMAT statement. Macros such as $DATE, etc.
+## are expanded on runtime. For example to override the sender:
+#
+# set mail-format { from: monit@foo.bar }
+#
+#
+## You can set the alert recipients here, which will receive the alert for
+## each service. The event alerts may be restricted using the list.
+#
+# set alert sysadm@foo.bar                       # receive all alerts
+# set alert manager@foo.bar only on { timeout }  # receive just service-
+#                                                # timeout alert
+#
+#
+## Monit has an embedded webserver, which can be used to view the 
+## configuration, actual services parameters or manage the services using the 
+## web interface.
+#
+set httpd port 2812 and
+     use address localhost  # only accept connection from localhost
+     allow localhost        # allow localhost to connect to the server and
+#     allow admin:monit      # require user 'admin' with password 'monit'
+#
+#
+###############################################################################
+## Services
+###############################################################################
+##
+## Check the general system resources such as load average, cpu and memory
+## usage. Each rule specifies the tested resource, the limit and the action
+## which will be performed in the case that the test failed.
+#
+check system localhost
+#    if loadavg (1min) > 4 then alert
+#    if loadavg (5min) > 2 then alert
+#    if memory usage > 75% then alert
+#    if cpu usage (user) > 70% then alert
+#    if cpu usage (system) > 30% then alert
+#    if cpu usage (wait) > 20% then alert
+#
+#    
+
+# vixie cron
+check process cron with pidfile /var/run/cron.pid
+   group system
+   start program = "/etc/init.d/vixie-cron start"
+   stop  program = "/etc/init.d/vixie-cron stop"
+   if 5 restarts within 5 cycles then timeout
+   depends on cron_rc
+
+check file cron_rc with path /etc/init.d/vixie-cron
+   group system
+   if failed checksum then unmonitor
+   if failed permission 755 then unmonitor
+   if failed uid root then unmonitor
+   if failed gid root then unmonitor
+
+check process syslogd with pidfile /var/run/syslog-ng.pid
+    start program = "/etc/init.d/syslog-ng start"
+    stop program = "/etc/init.d/syslog-ng stop"
+    if 5 restarts within 5 cycles then timeout
+
+check file syslogd_file with path /var/log/messages
+    if timestamp > 65 minutes then alert # Have you seen "-- MARK --"?
+
+
+# vsftp
+check process vsftpd with pidfile /var/run/vsftpd.pid
+   start program = "/etc/init.d/vsftpd start"
+   stop program  = "/etc/init.d/vsftpd stop"
+   if failed port 21 protocol ftp then restart
+   if 5 restarts within 5 cycles then timeout
+
+check process sshd with pidfile /var/run/sshd.pid
+   start program  "/etc/init.d/sshd start"
+   stop program  "/etc/init.d/sshd stop"
+   if failed port 22 protocol ssh then restart
+   if 5 restarts within 5 cycles then timeout
+
+# apache2
+check process apache with pidfile /var/run/apache2.pid
+   group www
+   start program = "/etc/init.d/apache2 start"
+   stop  program = "/etc/init.d/apache2 stop"
+   if failed port 80 protocol http then restart
+   if 5 restarts within 5 cycles then timeout
+
+# postfix
+check process postfix with pidfile /var/spool/postfix/pid/master.pid
+   group mail
+   start program = "/etc/init.d/postfix start"
+   stop  program = "/etc/init.d/postfix stop"
+   if failed port 25 protocol smtp then restart
+   if 5 restarts within 5 cycles then timeout
+   depends on postfix_rc
+
+check file postfix_rc with path /etc/init.d/postfix
+   group mail
+   if failed checksum then unmonitor
+   if failed permission 755 then unmonitor
+   if failed uid root then unmonitor
+   if failed gid root then unmonitor
+
+# postgresql
+check process postgresql with pidfile /var/postgresql/data/postmaster.pid
+   group database
+   start program = "/etc/init.d/postgresql start"
+   stop program = "/etc/init.d/postgresql stop"
+
+# slapd
+check process slapd with pidfile /var/run/openldap/slapd.pid
+   group database
+   start program = "/etc/init.d/slapd start"
+   stop program = "/etc/init.d/slapd stop"
+#   if failed port 389 protocol ldap3 then restart
+#   if 5 restarts within 5 cycles then timeout
+
+check process smbd with pidfile /var/run/samba/smbd.pid
+   group samba
+   start program = "/etc/init.d/samba start"
+   stop  program = "/etc/init.d/samba stop"
+   if failed port 139 type TCP then restart
+   if 5 restarts within 5 cycles then timeout
+   depends on smbd_bin
+
+check file smbd_bin with path /usr/sbin/smbd
+   group samba
+   if failed checksum then unmonitor
+   if failed permission 755 then unmonitor
+   if failed uid root then unmonitor
+   if failed gid root then unmonitor
+
+check process nmbd with pidfile /var/run/samba/nmbd.pid
+    group samba
+    start program = "/etc/init.d/samba start"
+    stop  program = "/etc/init.d/samba stop"
+    if failed port 138 type UDP  then restart
+    if failed port 137 type UDP  then restart
+    if 5 restarts within 5 cycles then timeout
+    depends on nmbd_bin
+
+check file nmbd_bin with path /usr/sbin/nmbd
+    group samba
+    if failed checksum then unmonitor
+    if failed permission 755 then unmonitor
+    if failed uid root then unmonitor
+    if failed gid root then unmonitor
+
+check process ddclient with pidfile /var/run/ddclient.pid
+    group other
+    start program = "/etc/init.d/ddclient start"
+    stop  program = "/etc/init.d/ddclient stop"
+
+## Check a file for existence, checksum, permissions, uid and gid. In addition
+## to the recipients in the global section, customized alert will be send to 
+## the additional recipient. The service may be grouped using the GROUP option.
+#    
+#  check file apache_bin with path /usr/local/apache/bin/httpd
+#    if failed checksum and 
+#       expect the sum 8f7f419955cefa0b33a2ba316cba3659 then unmonitor
+#    if failed permission 755 then unmonitor
+#    if failed uid root then unmonitor
+#    if failed gid root then unmonitor
+#    alert security@foo.bar on {
+#           checksum, permission, uid, gid, unmonitor
+#        } with the mail-format { subject: Alarm! }
+#    group server
+#
+#    
+## Check that a process is running, responding on the HTTP and HTTPS request, 
+## check its resource usage such as cpu and memory, number of children. 
+## In the case that the process is not running, monit will restart it by 
+## default. In the case that the service was restarted very often and the 
+## problem remains, it is possible to disable the monitoring using the
+## TIMEOUT statement. The service depends on another service (apache_bin) which
+## is defined in the monit control file as well.
+#    
+#  check process apache with pidfile /usr/local/apache/logs/httpd.pid
+#    start program = "/etc/init.d/httpd start"
+#    stop program  = "/etc/init.d/httpd stop"
+#    if cpu > 60% for 2 cycles then alert
+#    if cpu > 80% for 5 cycles then restart
+#    if totalmem > 200.0 MB for 5 cycles then restart
+#    if children > 250 then restart
+#    if loadavg(5min) greater than 10 for 8 cycles then stop
+#    if failed host www.tildeslash.com port 80 protocol http
+#       and request "/monit/doc/next.php"
+#       then restart
+#    if failed port 443 type tcpssl protocol http
+#       with timeout 15 seconds
+#       then restart
+#    if 3 restarts within 5 cycles then timeout
+#    depends on apache_bin
+#    group server
+#    
+#    
+## Check the filesystem permissions, uid, gid, space and inode usage. Other
+## services such as databases may depend on this resource and automatical
+## graceful stop may be cascaded to them before the filesystem will become
+## full and the data will be lost.
+#
+#  check filesystem datafs with path /dev/sdb1
+#    start program  = "/bin/mount /data"
+#    stop program  = "/bin/umount /data"
+#    if failed permission 660 then unmonitor
+#    if failed uid root then unmonitor
+#    if failed gid disk then unmonitor
+#    if space usage > 80% for 5 times within 15 cycles then alert
+#    if space usage > 99% then stop
+#    if inode usage > 30000 then alert
+#    if inode usage > 99% then stop
+#    group server
+#
+#
+## Check a file's timestamp: when it becomes older then 15 minutes, the 
+## file is not updated and something is wrong. In the case that the size 
+## of the file exceeded given limit, perform the script.
+#
+#  check file database with path /data/mydatabase.db
+#    if failed permission 700 then alert
+#    if failed uid data then alert
+#    if failed gid data then alert
+#    if timestamp > 15 minutes then alert
+#    if size > 100 MB then exec "/my/cleanup/script"
+#
+#
+## Check the directory permission, uid and gid.  An event is triggered
+## if the directory does not belong to the user with the  uid 0 and 
+## the gid 0.  In the addition the permissions have to match the octal 
+## description of 755 (see chmod(1)).
+#
+#  check directory bin with path /bin
+#    if failed permission 755 then unmonitor
+#    if failed uid 0 then unmonitor
+#    if failed gid 0 then unmonitor
+#
+#
+## Check the remote host network services availability and the response
+## content.  One of three pings, a successfull connection to a port and 
+## application level network check is performed.
+#
+#  check host myserver with address 192.168.1.1
+#    if failed icmp type echo count 3 with timeout 3 seconds then alert
+#    if failed port 3306 protocol mysql with timeout 15 seconds then alert
+#    if failed url
+#       http://user:password@www.foo.bar:8080/?querystring
+#       and content == 'action="j_security_check"'
+#       then alert
+#
+#
+###############################################################################
+## Includes
+###############################################################################
+##
+## It is possible to include the configuration or its parts from other files or
+## directories.
+#
+#  include /etc/monit.d/*
+#
+#
diff --git a/monit-5.4/contrib/packages/freebsd/Makefile b/monit-5.4/contrib/packages/freebsd/Makefile
new file mode 100644
index 0000000..bfe47b6
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/Makefile
@@ -0,0 +1,72 @@
+# New ports collection makefile for:   monit
+# Date created:        11 Januar 2006
+# Whom:                Martin Pala <martinp@tildeslash.com>
+#
+# $FreeBSD$
+#
+
+PORTNAME=		monit
+PORTVERSION=		4.9
+CATEGORIES=		sysutils
+MASTER_SITES=		http://www.tildeslash.com/monit/dist/
+
+MAINTAINER=		martinp@tildeslash.com
+COMMENT=		Unix system management and monitoring
+
+MAN1=			monit.1
+
+GNU_CONFIGURE=		yes
+USE_GMAKE=		yes
+USE_BISON=		yes
+USE_RC_SUBR=		yes
+
+CONFIGURE_ENV=		CC="${CC}" CPPFLAGS="${CPPFLAGS}" \
+			CFLAGS="${CFLAGS}" \
+			LDFLAGS="${LDFLAGS}" CONFIG_SHELL="${SH}" \
+			LOCALBASE="${LOCALBASE}"
+
+OPTIONS=		SSL "Enable SSL support" on
+
+PLIST_FILES=		bin/monit \
+			etc/monitrc.sample \
+			etc/rc.d/monit.sh \
+			share/doc/monit/CHANGES.txt \
+			share/doc/monit/LICENSE \
+			share/doc/monit/README \
+			share/doc/monit/README.SSL \
+			share/doc/monit/STATUS \
+			share/doc/monit/examples.html \
+			share/doc/monit/monit.html
+PLIST_DIRS=		share/doc/monit
+
+.include <bsd.port.pre.mk>
+
+pre-install:
+	@${SED} -e 's|%%PREFIX%%|${PREFIX}|g' \
+		-e 's|%%RC_SUBR%%|${RC_SUBR}|g' \
+		${FILESDIR}/monit.sh > ${WRKDIR}/monit.sh
+
+post-install:
+	@${INSTALL_SCRIPT} -m 755 ${WRKDIR}/monit.sh ${PREFIX}/etc/rc.d/monit.sh
+	@${INSTALL_SCRIPT} -m 600 ${WRKDIR}/${DISTNAME}/monitrc ${PREFIX}/etc/monitrc.sample
+	${MKDIR} ${DOCSDIR}
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/CHANGES.txt ${PREFIX}/share/doc/monit/CHANGES.txt
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/LICENSE ${PREFIX}/share/doc/monit/LICENSE
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/README ${PREFIX}/share/doc/monit/README
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/README.SSL ${PREFIX}/share/doc/monit/README.SSL
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/STATUS ${PREFIX}/share/doc/monit/STATUS
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/doc/examples.html ${PREFIX}/share/doc/monit/examples.html
+	@${INSTALL_SCRIPT} -m 644 ${WRKDIR}/${DISTNAME}/doc/monit.html ${PREFIX}/share/doc/monit/monit.html
+	@${CAT} ${PKGMESSAGE}
+	@${ECHO_MSG} "	${PREFIX}/etc/monitrc.sample"
+	@${ECHO_MSG} "	${PREFIX}/share/doc/monit/examples.html"
+
+.if defined(WITH_SSL)
+.include "${PORTSDIR}/Mk/bsd.openssl.mk"
+CONFIGURE_ARGS+=	--enable-ssl \
+			--with-openssl="${OPENSSLBASE}"
+.else
+CONFIGURE_ARGS+=	--without-ssl
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/monit-5.4/contrib/packages/freebsd/README.porter b/monit-5.4/contrib/packages/freebsd/README.porter
new file mode 100644
index 0000000..0a3f7f8
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/README.porter
@@ -0,0 +1,35 @@
+###############################
+# To update the FreeBSD port: #
+###############################
+
+1.) prerequisites:
+
+  md5
+  sha256 (sysutils/freebsd-sha256)
+
+
+2.) modify the port:
+
+  portsnap fetch
+  portsnap update
+  cd /usr/ports/sysutils
+  cp -rp monit monit-new
+  perl -p -i -e 's/^PORTVERSION=.*/PORTVERSION=    <new_version>' monit-new/Makefile
+  make -C monit-new makesum
+  diff -ruN monit monit-new > /tmp/monit.patch
+
+
+3.) send the port upgrade (for example using 'send-pr -a' or http://www.freebsd.org/send-pr.html):
+
+
+  if you are monit port maintainer:
+    synopsis: [maintainer update] sysutils/monit <new_version>
+    class:    maintainer-update
+    category: ports
+
+  otherwise:
+    synopsis: Update port: sysutils/monit <new_version>
+    class:    change-request
+    category: ports
+
+  you can include the diff as is to the PR provided it is <20KB
diff --git a/monit-5.4/contrib/packages/freebsd/distinfo b/monit-5.4/contrib/packages/freebsd/distinfo
new file mode 100644
index 0000000..012b105
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/distinfo
@@ -0,0 +1,3 @@
+MD5 (monit-4.9.tar.gz) = bcbaab776a54d1e34e3a057c925de9ca
+SHA256 (monit-4.9.tar.gz) = 6963046fa976b682d27ac8e78cf7107d76c6907aef27b30f725f371ce64fb4bf
+SIZE (monit-4.9.tar.gz) = 573711
diff --git a/monit-5.4/contrib/packages/freebsd/files/monit.sh b/monit-5.4/contrib/packages/freebsd/files/monit.sh
new file mode 100644
index 0000000..dad880c
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/files/monit.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# PROVIDE: monit
+# REQUIRE: NETWORKING SERVERS
+# BEFORE: DAEMON
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable monit:
+# monit_enable (bool):        Set to "NO" by default.
+#                             Set it to "YES" to enable monit
+#
+. %%RC_SUBR%%
+
+name="monit"
+rcvar=`set_rcvar`
+
+restart_precmd="monit_checkconfig"
+reload_precmd="monit_checkconfig"
+
+default_config=%%PREFIX%%/etc/monitrc
+required_files=${default_config}
+command="%%PREFIX%%/bin/monit"
+command_args="-c ${default_config}"
+pidfile="/var/run/monit.pid"
+
+[ -z "$monit_enable" ] && monit_enable="NO"
+
+load_rc_config $name
+
+monit_checkconfig()
+{
+  echo "Performing sanity check on monit configuration:"
+  ${command} ${command_args} -t
+}
+
+extra_commands="reload"
+run_rc_command "$1"
diff --git a/monit-5.4/contrib/packages/freebsd/pkg-descr b/monit-5.4/contrib/packages/freebsd/pkg-descr
new file mode 100644
index 0000000..6a9396b
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/pkg-descr
@@ -0,0 +1,24 @@
+Monit is a utility for managing and monitoring processes,
+files, directories, filesystems and network services on a Unix system.
+Monit conducts automatic maintenance and repair and can execute
+meaningful causal actions in error situations.
+
+monit supports:                                        
+ * Daemon mode - poll services at a specified interval
+ * Group and manage groups of services, service dependencies
+ * Logging - syslog or own logfile
+ * Alert, start, stop and restart of services based on it's characteristics
+ * MD5 and SHA1 checksums
+ * Runtime Unix socket and TCP/IP port checking (tcp and udp)
+ * Process status, timeout, memory and cpu usage, etc.
+ * Filesystem usage monitoring (inodes and space)
+ * File monitoring (timestamp, checksum, permission, owner, etc.)
+ * Directory monitoring (timestamp, permission, owner, etc.)
+ * Remote network services monitoring (ping, response time, protocol, etc.)
+ * System load average monitoring
+ * Flexible and customizable email alert messages and notifications
+ * Protocol verification such as HTTP, FTP, SMTP, POP, IMAP, NNTP, NTP, etc.
+ * A HTTP interface with XML output option
+ and many more features :)
+
+WWW: http://www.tildeslash.com/monit/
diff --git a/monit-5.4/contrib/packages/freebsd/pkg-message b/monit-5.4/contrib/packages/freebsd/pkg-message
new file mode 100644
index 0000000..cd9986e
--- /dev/null
+++ b/monit-5.4/contrib/packages/freebsd/pkg-message
@@ -0,0 +1,5 @@
+===> USAGE:
+	To enable monit you need to add monit_enable="YES" to rc.conf file.
+	Before running monit you have to configure monitrc file. There is
+	example configuration file monitrc.sample, you can find many
+	samples for particular services in examples.html:
diff --git a/monit-5.4/contrib/packages/redhat/monit.spec b/monit-5.4/contrib/packages/redhat/monit.spec
new file mode 100644
index 0000000..f0926af
--- /dev/null
+++ b/monit-5.4/contrib/packages/redhat/monit.spec
@@ -0,0 +1,144 @@
+Name: monit
+Summary: Process monitor and restart utility
+Version: 5.4
+Release: 1
+Source: http://www.mmonit.com/monit/dist/%{name}-%{version}.tar.gz
+Group: Utilities/Console
+URL: http://www.mmonit.com/monit/
+BuildRoot: %{_tmppath}/%{name}-buildroot
+License: AGPL
+BuildRequires: flex
+BuildRequires: bison
+BuildRequires: openssl-devel
+
+%description
+Monit is a utility for managing and monitoring processes,
+files, directories and filesystems on a Unix system. Monit conducts
+automatic maintenance and repair and can execute meaningful causal
+actions in error situations.
+
+%prep
+%setup
+
+%build
+%{configure}
+make
+
+%install
+if [ -d %{buildroot} ] ; then
+  rm -rf %{buildroot}
+fi
+
+mkdir -p %{buildroot}%{_bindir}
+mkdir -p %{buildroot}%{_mandir}/man1
+mkdir -p %{buildroot}/etc/init.d
+install -m 755 monit %{buildroot}%{_bindir}/monit
+install -m 644 monit.1 %{buildroot}%{_mandir}/man1/monit.1
+install -m 600 monitrc %{buildroot}/etc/monitrc
+install -m 755 contrib/rc.monit %{buildroot}/etc/init.d/%{name}
+
+%post
+/sbin/chkconfig --add %{name}
+
+%preun
+if [ $1 = 0 ]; then
+   /etc/init.d/%{name} stop >/dev/null 2>&1
+   /sbin/chkconfig --del %{name}
+fi
+
+%clean
+if [ -d %{buildroot} ] ; then
+  rm -rf %{buildroot}
+fi
+
+%files
+%defattr(-,root,root)
+%doc CHANGES COPYING README
+%config /etc/monitrc
+%config /etc/init.d/%{name}
+%{_bindir}/%{name}
+%{_mandir}/man1/%{name}.1.gz
+
+%changelog
+* Sun May 06 2012 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.4
+
+* Sat Oct 22 2011 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.3.1
+
+* Thu Aug 25 2011 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.3
+
+* Wed Mar 28 2011 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.2.5
+
+* Wed Feb 23 2011 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.2.4
+
+* Thu Sep 16 2010 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.2
+
+* Thu Feb 18 2010 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.1.1
+
+* Sat Jan 09 2010 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.1
+
+* Thu May 28 2009 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.0.3
+
+* Thu May 7 2009 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.0.2
+
+* Wed Apr 22 2009 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.0.1
+
+* Sun Apr 13 2008 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-5.0
+
+* Mon Nov 06 2007 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.10.1
+
+* Mon Nov 05 2007 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.10
+
+* Wed Feb 19 2007 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.9
+
+* Sun Mar 05 2006 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.7
+
+* Wed Sep 19 2005 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.6
+
+* Wed Oct 19 2004 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.4
+
+* Wed Nov 04 2003 Martin Pala <martinp@tildeslash.com>
+- Fixed the bad path to monit binary in startup script. Thanks to Ben Ciceron
+  for report of the problem.
+
+* Wed Oct 27 2003 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.1
+
+* Wed Sep 23 2003 Martin Pala <martinp@tildeslash.com>
+- change the description
+
+* Wed Mar 07 2003 Martin Pala <martinp@tildeslash.com>
+- Upgraded to monit-4.0
+- Updated documentation list
+- Changed use of monit.conf file to default monitrc ( => monit could find it )
+- Use monitrc and rc.monit from default monit distribution
+
+* Wed Jul 10 2002 Rory Toma <rory@digeo.com>
+- Upgraded to monit-2.4.3
+
+* Mon Feb 05 2001 Clinton Work <work@scripty.com>
+- Upgraded to monit 1.2
+- Use chkconfig to add monit to the rc.d startup scripts
+- Use the example monitrc instead of my custom monit.conf
+- Fixed the monit homepage URL
+
+* Thu Feb 01 2001 Clinton Work <work@scripty.com>
+- Create the inital spec file
+- Created a sample config file and a rc startup script
diff --git a/monit-5.4/contrib/packages/solaris/README.solaris b/monit-5.4/contrib/packages/solaris/README.solaris
new file mode 100644
index 0000000..b34c3ec
--- /dev/null
+++ b/monit-5.4/contrib/packages/solaris/README.solaris
@@ -0,0 +1,84 @@
+Readme for Monit with Solaris
+=============================
+
+Written by Christian Hopp <chopp@iei.tu-clausthal.de>  2002/07/15
+Updated by Christian Hopp <chopp@iei.tu-clausthal.de>  2003/06/11
+
+
+Installation of the package: (e.g. for Solaris 7/Sparc)
+-------------------------------------------------------
+
+You need "gzip" for solaris in order to unpack it. You can find it at
+http://www.sunfreeware.com for your platform.
+
+Then do...
+
+gzip -d  monit-4.0-sol7-sparc-local.pkg.gz
+pkgadd -d monit-4.0-sol7-sparc-local.pkg
+
+All the stuff went to /usr/local.  The documentation is located in
+/usr/local/doc/monit.  For the installation and configuration of monit
+please look in the documents located in /usr/local/doc/monit. An
+example of an init script is there, too.
+
+In the case that you are using the 64 bit binary, the path to the ssl
+libraries has to be set. For example adding the path to the Solaris
+bundled ssl libraries:
+
+  crle -64 -l /lib/64:/usr/lib/64:/usr/sfw/lib/64
+
+
+Deinstallation of the package:
+------------------------------
+
+Simply type...
+
+pkgrm GNUmonit
+
+...and the content of the package should be gone then.
+
+
+Generation of a Solaris package:
+--------------------------------
+
+First of all you need:
+        GNU/gzip
+        openssl
+        and all other stuff you need for compilation.
+
+All that you can find at http://www.sunfreeware.com .
+
+Start the "makesolpkg.sh" script.  Beware you have to be in the
+contrib/package/solaris directory to make it work.  The pkginfo and
+the prototype files are generated.  If you wish to use different
+settings like the base directory (aka prefix) or temporary directory
+just change it in the script.
+
+Example for creating the 64-bit monit package with Sun Studio compiler
+and SSL support enabled:
+
+sparc:
+  ./makesolpkg.sh \
+     --with-ssl-incl-dir=/usr/sfw/include \
+     --with-ssl-lib-dir=/usr/sfw/lib/64 \
+     CFLAGS='-xarch=v9' \
+     LDFLAGS='-xarch=v9'
+
+amd64:
+  ./makesolpkg.sh \
+     --with-ssl-incl-dir=/usr/sfw/include \
+     --with-ssl-lib-dir=/usr/sfw/lib/64 \
+     CFLAGS='-xarch=amd64' \
+     LDFLAGS='-xarch=amd64'
+
+Make sure that the path to the GNU/make in the script is right.  The
+generated file is named for Solaris 7/Sparc:
+
+  monit-4.0-sol7-sparc-local.pkg.gz
+
+
+Bye,
+
+C.Hopp
+
+
diff --git a/monit-5.4/contrib/packages/solaris/init.monit b/monit-5.4/contrib/packages/solaris/init.monit
new file mode 100644
index 0000000..3162ac6
--- /dev/null
+++ b/monit-5.4/contrib/packages/solaris/init.monit
@@ -0,0 +1,18 @@
+#!/bin/sh
+# Start/stop the monitoring server
+
+PATH=$PATH:/usr/local/bin # Change to the right path
+CONFFILE=/root/.monitrc # This is default!
+
+case "$1" in
+'start')
+	monit -c $CONFFILE
+	;;
+'stop')
+	monit -c $CONFFILE quit
+	;;
+*)
+	echo "Usage: $0 { start | stop }"
+	;;
+esac
+exit 0
diff --git a/monit-5.4/contrib/packages/solaris/makesolpkg.sh b/monit-5.4/contrib/packages/solaris/makesolpkg.sh
new file mode 100644
index 0000000..da172b3
--- /dev/null
+++ b/monit-5.4/contrib/packages/solaris/makesolpkg.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+# 
+# This script generates a solaris package of of monit
+#
+# Author: Christian Hopp <chopp@iei.tu-clausthal.de>
+#
+# Beware: You have to run it from the contrib/packages/solaris dir!!!
+#
+
+place=`pwd | sed 's%^.*/\([a-zA-z0-9]*/[a-zA-z0-9]*/[a-zA-z0-9]*\)$%\1%'`
+
+if [ $place != "contrib/packages/solaris" ]; then
+    echo "This script has to be started from [contrib/packages/solaris]!"
+    exit 1
+fi
+
+# 0) Configuration
+# ----------------
+
+cd ../../..
+
+# set path to strip
+PATH=$PATH:/usr/ccs/bin
+export PATH
+
+name=monit
+pkgname=GNUmonit
+make=/usr/local/bin/make
+prefix=/usr/local
+vendor="http://www.tildeslash.com/monit/"
+
+version=`cat configure.ac | sed -n -e '/AC_INIT/s%.*\[.*\].*\[\(.*\)\].*\[.*\].*%\1%p'`
+pstamp=monit`hostname | cut -d "." -f 1`-`date +%Y%m%d%H%M`
+platform=`uname -p`
+release=`uname -r | sed 's/5\./sol/'`
+filename=${name}-${version}-${release}-${platform}-local.pkg
+tmpdir=/tmp/${name}-install
+docs="monitrc CHANGES.txt COPYING LICENSE \
+      PLATFORMS README README.SSL STATUS UPGRADE.txt \
+      doc/* contrib/packages/solaris/init.monit \
+      contrib/packages/solaris/README.solaris"
+
+# 1) Compilation phase
+# --------------------
+
+if [ -f Makefile ]; then
+    $make clean
+fi
+
+./configure --prefix=$prefix $*
+$make
+
+# 2) Data gathering
+# -----------------
+
+if [ -x ${tmpdir} ]; then
+    /bin/rm -Rf ${tmpdir}
+fi
+
+mkdir ${tmpdir}
+mkdir ${tmpdir}/doc
+mkdir ${tmpdir}/doc/${name}
+
+$make exec_prefix=${tmpdir} prefix=${tmpdir} install
+
+cp -r $docs ${tmpdir}/doc/${name}/
+
+chown bin:bin ${tmpdir}/*
+chown bin:bin ${tmpdir}/man/*
+
+# 3) Package generation
+# ---------------------
+
+cd contrib/packages/solaris
+
+cat > pkginfo <<EOF
+CLASSES=none
+BASEDIR=$prefix
+LC_CTYPE=iso_8859_1
+LANG=C
+TZ=MET
+PATH=/sbin:/usr/sbin:/usr/bin:/usr/sadm/install/bin
+OAMBASE=/usr/sadm/sysadm
+PKG=$pkgname
+NAME=$name
+ARCH=$platform
+VERSION=$version
+CATEGORY=application
+VENDOR=$vendor
+PSTAMP=$pstamp
+EOF
+
+(echo 'i pkginfo'; pkgproto ${tmpdir}= ) > prototype
+pkgmk -o
+pkgtrans -s /var/spool/pkg `pwd`/${filename} $pkgname
+gzip ./${filename}
+openssl dgst -md5 ${filename}.gz > ${filename}.gz.md5
+
+# 4) Cleaning up
+# --------------
+
+/bin/rm -Rf ${tmpdir}
+/bin/rm -Rf /var/spool/pkg/$pkgname
+/bin/rm prototype
+/bin/rm pkginfo
diff --git a/monit-5.4/contrib/rc.monit b/monit-5.4/contrib/rc.monit
new file mode 100644
index 0000000..887346b
--- /dev/null
+++ b/monit-5.4/contrib/rc.monit
@@ -0,0 +1,64 @@
+#! /bin/sh
+#
+# monit         Monitor Unix systems
+#
+# Author:	Clinton Work,   <work@scripty.com>
+#
+# chkconfig:    2345 98 02
+# description:  Monit is a utility for managing and monitoring processes,
+#               files, directories and filesystems on a Unix system. 
+# processname:  monit
+# pidfile:      /var/run/monit.pid
+# config:       /etc/monitrc
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+# Source networking configuration.
+. /etc/sysconfig/network
+
+MONIT=/usr/bin/monit
+
+# Source monit configuration.
+if [ -f /etc/sysconfig/monit ] ; then
+        . /etc/sysconfig/monit
+fi
+
+[ -f $MONIT ] || exit 0
+
+RETVAL=0
+
+# See how we were called.
+case "$1" in
+  start)
+        echo -n "Starting monit: "
+        daemon $NICELEVEL $MONIT
+        RETVAL=$?
+        echo
+        [ $RETVAL = 0 ] && touch /var/lock/subsys/monit
+        ;;
+  stop)
+        echo -n "Stopping monit: "
+        killproc monit
+        RETVAL=$?
+        echo
+        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/monit
+        ;;
+  restart)
+  	$0 stop
+	$0 start
+	RETVAL=$?
+	;;
+  condrestart)
+       [ -e /var/lock/subsys/monit ] && $0 restart
+       ;;
+  status)
+        status monit
+	RETVAL=$?
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart|condrestart|status}"
+	exit 1
+esac
+
+exit $RETVAL
diff --git a/monit-5.4/doc/PLATFORMS b/monit-5.4/doc/PLATFORMS
new file mode 100644
index 0000000..0d6facf
--- /dev/null
+++ b/monit-5.4/doc/PLATFORMS
@@ -0,0 +1,165 @@
+			    Platform Notes
+			    --------------
+
+This file describes platform specific notes for Monit. 
+
+Platforms overview in alphabetical order:
+
+ o AIX
+ o Darwin (Mac OS X)
+ o FreeBSD
+ o Linux
+ o NetBSD
+ o OpenBSD
+ o Solaris
+
+Following platforms are not actively maintained because of lack of testing
+machine for these OS's. They may work - its support was added and confirmed
+in particular Monit releases by contributors. Possible status reports, bug
+reports, patch contributions or access to such platforms for development is
+welcomed:
+
+ o HPUX
+
+
+Platform specific notes:
+========================
+
+
+GNU/Linux
+=========
+
+Monit compiles out of the box on Linux.  Some Linux Distributions
+might have Monit as a precompiled package (see PACKAGES).
+
+In order to be able to use resource support you have to have PROCFS
+support enabled in your kernel.  In case your kernel has fortified
+your proc filesystem, e.g. using the openwall patchset, you might need
+to start Monit as the root user. 
+
+In case a glibc replacement is used one of the following parts may
+apply.
+
+dietlibc
+--------
+
+Since version 4.0 the use of dietlibc is supported by Monit.  For SSL
+support you need to compile the ssl libraries with dietlibc; use the
+"--with-ssl-lib-dir=<path>" option to configure Monit.
+
+A configure for dietlibc might look like this:
+
+  env CC="diet gcc" CFLAGS="-Os" \
+      ./configure --with-ssl-lib-dir=/usr/lib/diet/lib-i386/
+
+
+uClibc
+------
+
+The support for uClibc has been integrated in version 4.0.  Like
+dietlibc you need to compile openssl with uClibc for SSL support.  You
+also need to have the openssl include files outside of your "standard"
+include files (e.g. use an "openssl" link in you <uClibc>/include
+tree).  Otherwise your uClibc include files are mixed up with the
+glibc includes. Finally, specify your <uClibc>/ tree in your configure
+run with "--with-ssl-dir=<path>".
+
+A configure for uClibc might look like this:
+
+  env CC="i386-uclibc-gcc" CFLAGS="-Os" \
+      ./configure --with-ssl-dir=/usr/i386-linux-uclibc
+
+
+Solaris
+=======
+
+64-bit Monit is required for Solaris support.
+
+You can use either gcc or Sun Studio for compilation.  
+
+Package prerequisites
+
+  SUNWbash
+  SUNWgmake
+  SUNWgcc
+  SUNWopenssl-include
+  SUNWopenssl-libraries
+
+Set path to the SFW utilities and libraries, for example:
+
+  PATH=$PATH:/usr/sfw/bin
+  export PATH
+
+  crle -64 -l /lib/64:/usr/lib/64:/usr/sfw/lib/64
+
+Configure Monit (examples):
+
+  gcc [sparc]:
+  ./configure
+
+  gcc [amd64]:
+  ./configure
+
+  Sun Studio 12 [sparc]:
+  ./configure --with-ssl-lib-dir=/usr/sfw/lib/64 CC=/opt/solstudio12.2/bin/cc
+
+  Sun Studio 12 [amd64]:
+  ./configure --with-ssl-lib-dir=/usr/sfw/lib/64 CC=/opt/solstudio12.2/bin/cc
+
+Compile Monit with:
+
+  gmake
+
+
+AIX
+===
+
+Configure Monit with SSL path (examples):
+
+    ./configure \
+        --with-ssl-incl-dir=/opt/freeware/include \
+        --with-ssl-lib-dir=/opt/freeware/64/lib
+
+Use GNU make to compile ('gmake')
+
+
+FreeBSD + NetBSD + OpenBSD
+==========================
+
+Use GNU make to compile ('gmake')
+
+
+Darwin (Mac OS X)
+=================
+
+Monit compiles out of the box on Mac OS X.
+
+It seems that Apple is phasing out the kvm interface and that
+it is disabled by default on Intel based Mac OS X 10.4.8 and later.
+You can get following error in such case for Monit <= 4.9:
+
+ --8<--
+ kvm_open: : /dev/mem: No such file or directory
+ system statistic error -- cannot initialize kvm interface
+ system statistic error -- cannot initialize the process tree =>
+ process resource monitoring disabled
+ --8<--
+
+You can reenable the kvm interface by adding the kmem to the boot-args
+Open Firmware variable as root - for example:
+
+ nvram boot-arg="kmem=1"
+
+and reboot the machine.
+
+Monit > 4.9 don't need this workaround.
+
+
+Any other not yet mentioned but posix compatible platform
+=========================================================
+
+Monit might be able to compile using the "UNKNOWN" architecure.  In
+case a wrong platform is detected you can enforce this behavior by
+using the "--without-resource" flag in the configure run.  Generally,
+it is advisable to stick to gcc for compiling.
+
diff --git a/monit-5.4/doc/monit.pod b/monit-5.4/doc/monit.pod
new file mode 100644
index 0000000..869dd53
--- /dev/null
+++ b/monit-5.4/doc/monit.pod
@@ -0,0 +1,4065 @@
+# The right margin in this file is 65 characters.
+
+=head1 NAME
+
+Monit - utility for monitoring services on a Unix system
+
+
+=head1 SYNOPSIS
+
+B<monit> [options] {arguments}
+
+
+=head1 DESCRIPTION
+
+B<monit> is a utility for managing and monitoring processes,
+programs, files, directories and filesystems on a Unix system.
+Monit conducts automatic maintenance and repair and can execute
+meaningful causal actions in error situations. E.g. Monit can
+start a process if it does not run, restart a process if it does
+not respond and stop a process if it uses too much resources. You
+can use Monit to monitor files, directories and filesystems for
+changes, such as timestamps changes, checksum changes or size
+changes.
+
+Monit is controlled via an easy to configure control file based
+on a free-format, token-oriented syntax. Monit logs to syslog or
+to its own log file and notifies you about error conditions via
+customizable alert messages. Monit can perform various TCP/IP
+network checks, protocol checks and can utilize SSL for such
+checks. Monit provides a http(s) interface and you may use a
+browser to access the Monit program.
+
+
+=head1 GENERAL OPERATION
+
+The behavior of Monit is controlled by command-line options
+I<and> a run control file, L<monitrc|/"THE MONIT CONTROL FILE">,
+the syntax of which we describe in a later section. Command-line
+options override F<.monitrc> declarations.
+
+The default location for F<monitrc> is F<~/.monitrc>. If this
+file does not exist, Monit will try I</etc/monitrc> and a few
+other places. See L<FILES|/"FILES"> for details. You can also
+specify the control file directly by using the I<-c> command-line
+switch to monit. For instance,
+
+ $ monit -c /var/monit/monitrc
+
+Before Monit is started the first time, you can test the control
+file for syntax errors:
+
+ $ monit -t 
+ $ Control file syntax OK
+
+If there was an error, Monit will print an error message to the
+console, including the line number in the control file from where
+the error was found.
+
+Once you have a working Monit control file you can start Monit
+from the console, like so:
+
+ $ monit 
+
+You can change some configuration directives via command-line
+switches, but for simplicity it is recommended that you put these
+in the control file.
+
+If all goes well, Monit will now detach from the terminal and run
+as a background process, i.e. as a daemon process. As a daemon,
+Monit runs in cycles; It monitor services, then goes to sleep for
+a configured period, then wakes up and start monitoring again in
+an endless loop.
+
+
+=head2 Options
+
+The following options are recognized by Monit. However, it is
+recommended that you set options (when applicable) directly in
+the I<.monitrc> control file.
+
+B<-c> I<file>
+   Use this control file
+
+B<-d> I<n>
+   Run Monit as a daemon once per I<n> seconds. Or use I<"set
+   daemon"> in monitrc.
+
+B<-g> I<name>
+   Set group name for start, stop, restart, monitor and
+   unmonitor action.
+
+B<-l> I<logfile>
+   Print log information to this file. Or use I<"set logfile">
+    in monitrc.
+
+B<-p> I<pidfile>
+   Use this lock file in daemon mode. Or use I<"set pidfile">
+    in monitrc.
+
+B<-s> I<statefile>
+   Write state information to this file. Or use I<"set
+   statefile"> in monitrc.
+
+B<-I>
+   Do not run in background (needed for run from init)
+
+B<-t>
+   Run syntax check for the control file
+
+B<-v>
+   Verbose mode, work noisy (diagnostic output)
+
+B<-vv>
+   Very verbose mode, same as -v plus log stack-trace on error
+
+B<-H> I<[filename]>
+   Print MD5 and SHA1 hashes of the file or of stdin if the 
+   filename is omitted; Monit will exit afterwards
+
+B<-V>
+   Print version number and patch level
+
+B<-h>
+   Print a help text
+
+=head2 Arguments
+
+Once you have Monit running as a daemon process, you can call
+Monit with one of the following arguments. Monit will then
+connect to the Monit daemon (on TCP port 127.0.0.1:2812 by
+default) and ask the Monit daemon to perform the requested
+action. In other words; calling monit without arguments starts
+the Monit daemon, and calling monit I<with> arguments enables you
+to communicate with the Monit daemon process.
+
+=over 4
+
+=item start all
+
+Start all services listed in the control file and enable
+monitoring for them. If the group option is set (I<-g>), only
+start and enable monitoring of services in the named group ("all"
+is not required in this case).
+
+=item start name
+
+Start the named service and enable monitoring for it. The name is
+a service entry name from the monitrc file.
+
+=item stop all
+
+Stop all services listed in the control file and disable their
+monitoring. If the group option is set, only stop and disable
+monitoring of the services in the named group (all" is not
+required in this case).
+
+=item stop name
+
+Stop the named service and disable its monitoring. The name is a
+service entry name from the monitrc file.
+
+=item restart all
+
+Stop and start I<all> services. If the group option is set, only
+restart the services in the named group ("all" is not required in
+this case).
+
+=item restart name
+
+Restart the named service. The name is a service entry name from
+the monitrc file.
+
+=item monitor all
+
+Enable monitoring of all services listed in the control file. If
+the group option is set, only start monitoring of services in the
+named group ("all" is not required in this case).
+
+=item monitor name
+
+Enable monitoring of the named service. The name is a service
+entry name from the monitrc file. Monit will also enable
+monitoring of all services this service depends on.
+
+=item unmonitor all
+
+Disable monitoring of all services listed in the control file. If
+the group option is set, only disable monitoring of services in
+the named group ("all" is not required in this case).
+
+=item unmonitor name
+
+Disable monitoring of the named service. The name is a service
+entry name from the monitrc file. Monit will also disable
+monitoring of all services that depends on this service.
+
+=item status
+
+Print status information of each service.
+
+=item summary
+
+Print a short status summary.
+
+=item reload
+
+Reinitialize a running Monit daemon, the daemon will reread its
+configuration, close and reopen log files.
+
+=item quit
+
+Kill the Monit daemon process
+
+=item validate
+
+Check all services listed in the control file. This action is
+also the default behavior when Monit runs in daemon mode.
+
+=item procmatch regex
+
+Allows for easy testing of pattern for process match check. The
+command takes regular expression as an argument and displays all
+running processes matching the pattern.
+
+=back
+
+
+=head1 WHAT TO MONITOR?
+
+You can use Monit to monitor daemon B<processes> or similar
+programs running on localhost. Monit is particular useful for
+monitoring daemon processes, such as those started at system boot
+time from /etc/init.d/. For instance sendmail, sshd, apache and
+mysql. In contrast to many other monitoring systems, Monit can act if
+an error situation should occur, e.g.; if sendmail is not
+running, monit can start sendmail again automatically or if
+apache is using too many resources (e.g. if a DoS attack is in
+progress) Monit can stop or restart apache and send you an alert
+message. Monit can also monitor process characteristics, such as
+how much memory or cpu cycles a process is using.
+
+You can also use Monit to monitor B<files>, B<directories> and
+B<filesystems> on localhost. Monit can monitor these items for
+changes, such as timestamps changes, checksum changes or size
+changes. This is also useful for security reasons - you can
+monitor the md5 or sha1 checksum of files that should not change
+and get an alert or perform an action if they should change.
+
+Monit can monitor B<network connections> to various servers,
+either on localhost or on remote hosts. TCP, UDP and Unix Domain
+Sockets are supported. Network test can be performed on a
+protocol level; Monit has built-in tests for the main Internet
+protocols, such as HTTP, SMTP etc. Even if a protocol is not
+supported you can still test the server because you can configure
+Monit to send any data and test the response from the server.
+
+Monit can be used to test B<programs> or scripts at certain
+times, much like cron, but in addition, you can test the exit
+value of a program and perform an action or send an alert if the
+exit value indicate an error. This means that you can use Monit
+to perform any type of check you can write a script for.
+
+Finally, Monit can be used to monitor general B<system> resources
+on localhost such as overall CPU usage, Memory and Load Average.
+
+
+=head1 THE MONIT CONTROL FILE
+
+Monit is configured and controlled via a control file called
+I<monitrc>. The default location for this file is ~/.monitrc. If
+this file does not exist, Monit will try /etc/monitrc, then
+@sysconfdir@/monitrc and finally ./monitrc. The value of
+@sysconfdir@ is given at configure time as ./configure
+--sysconfdir. For instance, using  I<./configure --sysconfdir
+/var/monit/etc> will make Monit search for I<monitrc> in
+I</var/monit/etc>
+
+Monit uses its own Domain Specific Language (DSL); The control
+file consists of a series of service entries and global option
+statements in a free-format, token-oriented syntax.
+
+Comments begin with a B<#> and extend through the end of the
+line. There are three kinds of tokens in the control file:
+I<keywords>, I<numbers> and I<strings>. On a semantic level, the
+control file consists of only three type of entries:
+
+=over 4
+
+=item 1. Global set-statements 
+
+A global set-statement starts with the keyword I<set> and the
+item to configure.
+
+=item 2. Global include-statement
+
+The include statement consists of the keyword I<include> and
+a glob string.
+
+=item 3. One or more service entry statements.
+
+A service entry starts with the keyword I<check> followed by the
+service type. 
+
+=back
+
+The meaning of the various statements will be explained in the
+following sections.
+
+
+=head1 LOGGING
+
+Monit will log status and error messages to a log file. Use the
+I<set logfile> statement in the monitrc control file. To setup
+Monit to log to its own logfile, use e.g. I<set logfile
+/var/log/monit.log>. If B<syslog> is given as a value for the
+I<-l> command-line switch (or the keyword I<set logfile syslog>
+is found in the control file) Monit will use the B<syslog> system
+daemon to log messages with a priority assigned to each message
+based on the context. To turn off logging, simply do not set the
+logfile in the control file (and of course, do not use the -l
+switch)
+
+
+=head1 DAEMON MODE
+
+Use 
+
+ set daemon n (where n is a number in seconds)
+
+to specify Monit's poll cycle length and run Monit in daemon
+mode. You must specify a numeric argument which is a polling
+interval in seconds. In daemon mode, Monit detaches from the
+console, puts itself in the background and runs continuously,
+monitoring each specified service and then goes to sleep for the
+given poll interval, wakes up and start monitoring again in an
+endless cycle.
+
+Alternatively, you can use the I<-d> command line switch to set
+the poll interval, but it is strongly recommended to set the poll
+interval in your I<~/.monitrc> file, by using I<set daemon>.
+
+Monit will then always start in daemon mode. If you do not use
+this statement and do not start monit with the -d option, Monit
+will just run through the service checks once and then exit. This
+may be useful in some situations, but Monit is primarily designed
+to run as a daemon process.
+
+Calling monit with a Monit daemon running in the background sends
+a wake-up signal to the daemon, forcing it to check services
+immediately. Calling monit with the quit argument will kill a
+running Monit daemon process instead of waking it up.
+
+
+=head1 INIT SUPPORT
+
+The I<set init> statement prevents Monit from transforming itself
+into a daemon process. Instead Monit will run as a foreground
+process. (You should still use set daemon to specify the poll
+cycle).
+
+This is required to run Monit from init. Using init to start
+Monit is probably the best way to run Monit if you want to be
+certain that you always have a running Monit daemon on your
+system. Another option is to run Monit from crontab. In any case,
+you should make sure that the control file does not have any
+syntax errors before you start Monit from init or crontab.
+
+To setup Monit to run from init, you can either use the set init
+statement in Monit's control file or use the -I option from the
+command line. Here is what you must add to /etc/inittab:
+
+  # Run Monit in standard run-levels
+  mo:2345:respawn:/usr/local/bin/monit -Ic /etc/monitrc
+
+After you have modified init's configuration file, you can run
+the following command to re-examine /etc/inittab and start Monit:
+
+  telinit q
+
+For systems without telinit:
+
+  kill -1 1
+
+If Monit is used to monitor services that are also started at
+boot time (e.g. services started via SYSV init rc scripts or via
+inittab) then, in some cases, a race condition could occur. That
+is; if a service is slow to start, Monit can assume that the
+service is not running and possibly try to start it and raise an
+alert, while, in fact the service is already about to start or
+already in its startup sequence. Please see the FAQ for a
+solution to this problem.
+
+
+=head1 INCLUDE FILES
+
+The Monit control file, I<monitrc>, can include additional
+configuration files. This feature helps one to maintain a certain
+structure or to place repeating settings into one file. Include
+statements can be placed at virtually any spot. The syntax is the
+following:
+
+  include globstring
+
+The globstring is any kind of string as defined in glob(7). Thus,
+you can refer to a single file or you can load several files at
+once. If you want to use whitespace in your string the globstring
+need to be embedded into quotes (') or double quotes ("). If the
+globstring matches a directory instead of a file, it is silently
+ignored.
+
+Any I<include> statements in included files are parsed as in the
+main control file.
+
+If the globstring matches several results, the files are included
+in a non sorted manner. If you need to rely on a certain order,
+you might need to use single I<include> statements.
+
+An example,
+
+ include /etc/monit.d/*.cfg
+
+This will load any file matching the globstring. That is, all
+files in I</etc/monit.d> that ends with the prefix I<.cfg>. 
+
+
+=head1 GROUP SUPPORT
+
+Service entries in the control file, I<monitrc>, can be grouped
+together by the I<group> statement. The syntax is simply (keyword
+in capital):
+
+  GROUP groupname
+
+With this statement it is possible to group similar service
+entries together and manage them as a whole. Monit provides
+functions to start, stop, restart, monitor and unmonitor a
+group of services, like so:
+
+To start a group of services from the console:
+
+  Monit -g <groupname> start
+
+To stop a group of services:
+
+  Monit -g <groupname> stop
+
+To restart a group of services:
+
+  Monit -g <groupname> restart
+
+Note:
+the I<status> and I<summary> commands don't support the -g
+option and will print the state of all services.
+
+Service can be added to multiple groups by adding group statement
+multiple times:
+
+  group www
+  group filesystem
+
+
+=head1 MONITORING MODE
+
+Monit supports three monitoring modes per service: I<active>,
+I<passive> and I<manual>. See also the example section below for
+usage of the mode statement.
+
+In I<active> mode, Monit will monitor a service and in case of
+problems Monit will act and raise alerts, start, stop or restart
+the service. Active mode is the default mode.
+
+In I<passive> mode, Monit will passively monitor a service and
+specifically B<not> try to fix a problem, but it will still raise
+alerts in case of a problem.
+
+For use in clustered environments there is also a I<manual>
+mode. In this mode, Monit will enter I<active> mode B<only> if a
+service was brought under monit's control, for example by
+executing the following command in the console:
+
+  Monit start sybase 
+  (Monit will call sybase's start method and enable monitoring)
+
+If a service was not started by Monit or was stopped or disabled
+for example by:
+
+  Monit stop sybase 
+  (Monit will call sybase's stop method and disable monitoring)
+
+Monit will then not monitor the service. This allows for having
+services configured in monitrc and start it with Monit only if it
+should run. This feature can be used to build a simple failsafe
+cluster.
+
+A service's monitoring state is persistent across Monit restart.
+This means that you probably would like to make certain that
+services in manual mode are stopped or in unmonitored mode at
+server shutdown. Do for instance the following in a server
+shutdown script:
+
+  Monit stop sybase
+
+or
+
+  Monit unmonitor sybase
+
+If you use Monit in a HA-cluster you should place the state file
+in a temporary filesystem so if the machine should crash and the
+stand-by machine take over services, any manual monitoring mode
+services that were started on the crashed machine won't be
+started on reboot. Use for example:
+
+  set statefile /tmp/monit.state
+
+
+
+=head1 ALERT MESSAGES
+
+Monit will raise an email alert in the following situations:
+
+ o A service timed out
+ o A service does not exist
+ o A service related data access problem
+ o A service related program execution problem
+ o A service is of invalid object type
+ o A program status failed
+ o A icmp problem
+ o A port connection problem
+ o A resource statement match
+ o A file checksum problem
+ o A file size problem
+ o A file/directory timestamp problem
+ o A file/directory/filesystem permission problem
+ o A file/directory/filesystem uid problem
+ o A file/directory/filesystem gid problem
+ o An action is done per administrator's request
+
+Monit will send an alert each time a monitored object changed.
+This involves:
+
+ o Monit started, stopped or reloaded
+ o A file checksum changed
+ o A file size changed
+ o A file content match
+ o A file/directory timestamp changed
+ o A filesystem mount flags changed
+ o A process PID changed
+ o A process PPID changed
+
+You use the alert statement to notify Monit that you want alert
+messages sent to an email address. If you do not specify an alert
+statement, Monit will not send alert messages.
+
+There are two forms of alert statement:
+
+ o Global - common for all services
+ o Local  - per service
+
+In both cases you can use more than one alert statement. In other
+words, you can send many different emails to many different
+addresses.
+
+Recipients in the global and in the local lists are alerted when
+a service failed, recovered or changed. If the same email address
+is in the global and in the local list, Monit will only send one
+alert. Local (per service) defined alert email addresses override
+global addresses in case of a conflict. Finally, you may choose
+to only use a global alert list (recommended), a local per
+service list or both.
+
+It is also possible to disable the global alerts locally for
+particular service(s) and recipients.
+
+=head2 Setting a global alert statement
+
+If a change occurred on a monitored services, Monit will send an
+alert to all recipients in the global list who has registered
+interest for the event type. Here is the syntax for the global
+alert statement:
+
+=over 4
+
+=item SET ALERT mail-address [ [NOT] {events}] [MAIL-FORMAT 
+          {mail-format}] [REMINDER number]
+
+=back
+
+Simply using the following in the global section of monitrc:
+
+ set alert foo@bar
+
+will send a default email to the address foo@bar whenever an
+event occurred on any service. Such an event may be that a
+service timed out, a service doesn't exist and so on. If you want
+to send alert messages to more email addresses, add a I<set alert
+'email'> statement for each address.
+
+For explanations of the I<events, MAIL-FORMAT and REMINDER>
+keywords above, please see below.
+
+You can also use the NOT option ahead of the events list which
+will reverse the meaning of the list. That is, only send alerts
+for events I<not> in the list. This can save you some
+configuration bytes if you are interested in most events except a
+few.
+
+
+=head2 Setting a local alert statement
+
+Each service can also have its own recipient list.
+
+=over 4
+
+=item ALERT mail-address [ [NOT] {events}] [MAIL-FORMAT 
+           {mail-format}] [REMINDER number]
+
+=back
+
+or
+
+=over 4
+
+=item NOALERT mail-address
+
+=back
+
+If you only want an alert message sent for certain events and for
+certain service(s), for example only for timeout events or only
+if a service died, then postfix the alert-statement with a filter
+block:
+
+ check process myproc with pidfile /var/run/my.pid
+   alert foo@bar only on { timeout, nonexist } 
+   ...
+
+(I<only> and I<on> are noise keywords, ignored by Monit. As a
+side note; Noise keywords are used in the control file grammar to
+make an entry resemble English and thus make it easier to read
+(or, so goes the philosophy). The full set of available noise
+keywords are listed below in the Control File section).
+
+You can also setup to send alerts for all events except some by
+putting the word I<not> ahead of the list. For example, if you
+want to receive alerts for all events except Monit instance
+events, you can write (note that the noise words 'but' and 'on'
+are optional):
+
+ check system myserver
+   alert foo@bar but not on { instance } 
+   ...
+
+instead of:
+
+   alert foo@bar on { action
+                      checksum
+                      connection
+                      content
+                      data
+                      exec
+                      fsflags
+                      gid
+                      icmp
+                      invalid
+                      nonexist
+                      permission
+                      pid
+                      ppid
+                      resource
+                      size
+                      status
+                      timeout
+                      timestamp
+                      uid
+                      uptime }
+
+This will send alerts for all events to foo@bar, except Monit
+instance events. An instance event BTW, is an event fired
+whenever the Monit program start or stop.
+
+Event filtering can be used to send an email to different email
+addresses depending on the events that occurred. For instance:
+
+ alert foo@bar { nonexist, timeout, resource, icmp, connection }
+ alert security@bar on { checksum, permission, uid, gid }
+ alert manager@bar
+
+This will send an alert message to foo@bar whenever a nonexist,
+timeout, resource or connection problem occurs and a message to
+security@bar if a checksum, permission, uid or gid problem
+occurs. And finally, a message to manager@bar whenever any error
+event occurs.
+
+Here is the list of events you can use in a mail-filter: I<action,
+checksum, connection, content, data, exec, fsflags, gid, icmp,
+instance, invalid, nonexist, permission, pid, ppid, resource, size, 
+status, timeout, timestamp, uid, uptime>
+
+You can also disable the alerts locally using the NOALERT
+statement. This is useful if you have lots of services monitored
+and are using the global alert statement, but don't want to
+receive alerts for some minor subset of services:
+
+ noalert appadmin@bar
+
+For example, if you stick the noalert statement in a 'check
+system' entry, you won't receive system related alerts (such as
+Monit instance started/stopped/reloaded alert, system overloaded
+alert, etc.) but will receive alerts for all other monitored
+services.
+
+The following example will alert foo@bar on all events on all
+services by default, except the service mybar which will send an
+alert only on timeout. The trick is based on the fact that local
+definition of the same recipient overrides the global setting
+(including registered events and mail format):
+
+ set alert foo@bar
+ 
+ check process myfoo with pidfile /var/run/myfoo.pid
+   ...
+ check process mybar with pidfile /var/run/mybar.pid
+   alert foo@bar only on { timeout }
+
+=head2 Alert message layout
+
+Monit provides a default mail message layout that is short and to
+the point. Here's an example of a standard alert mail sent by
+monit:
+
+ From: monit@tildeslash.com
+ Subject: Monit alert -- Does not exist apache 
+ To: hauk@tildeslash.com
+ Date: Thu, 04 Sep 2003 02:33:03 +0200
+
+ Does not exist Service apache
+
+        Date:   Thu, 04 Sep 2003 02:33:03 +0200
+        Action: restart
+        Host:   www.tildeslash.com
+
+ Your faithful employee,
+ monit
+
+
+If you want to, you can change the format of this message with
+the optional I<mail-format> statement. The syntax for this
+statement is as follows:
+
+ mail-format {
+      from: monit@localhost
+  reply-to: support@domain.com
+   subject: $SERVICE $EVENT at $DATE
+   message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
+            Yours sincerely,
+            monit
+ }
+
+Where the keyword I<from:> is the email address Monit should
+pretend it is sending from. It does not have to be a real mail
+address, but it must be a proper formatted mail address, on the
+form: name@domain. The I<reply-to:> keyword can be used to set
+the reply-to mail header. The keyword I<subject:> is for the
+email subject line. The subject must be on only I<one> line. The
+I<message:> keyword denotes the mail body. If used, this keyword
+should always be the last in a mail-format statement. The mail
+body can be as long as you want, but must B<not> contain the '}'
+character.
+
+All of these format keywords are optional, but if used, you must
+provide at least one. Thus if you only want to change the from
+address Monit is using you can do:
+
+ set alert foo@bar with mail-format { from: bofh@bar.baz }
+
+From the previous example you will notice that some special $XXX
+variables were used. If used, they will be substituted and
+expanded into the text with these values:
+
+=over 4
+
+=item * I<$EVENT>
+
+ A string describing the event that occurred. The values are
+ fixed and are:
+
+ Event:    | Failure state:           | Success state:              
+ -------------------------------------------------------------------
+ ACTION    | "Action done"            | "Action done"               
+ CHECKSUM  | "Checksum failed"        | "Checksum succeeded"        
+ CONNECTION| "Connection failed"      | "Connection succeeded"      
+ CONTENT   | "Content failed",        | "Content succeeded"
+ DATA      | "Data access error"      | "Data access succeeded"     
+ EXEC      | "Execution failed"       | "Execution succeeded"       
+ FSFLAG    | "Filesystem flags failed"| "Filesystem flags succeeded"
+ GID       | "GID failed"             | "GID succeeded"             
+ ICMP      | "ICMP failed"            | "ICMP succeeded"            
+ INSTANCE  | "Monit instance changed" | "Monit instance changed not"
+ INVALID   | "Invalid type"           | "Type succeeded"            
+ NONEXIST  | "Does not exist"         | "Exists"                    
+ PERMISSION| "Permission failed"      | "Permission succeeded"      
+ PID       | "PID failed"             | "PID succeeded"
+ PPID      | "PPID failed"            | "PPID succeeded"
+ RESOURCE  | "Resource limit matched" | "Resource limit succeeded"  
+ SIZE      | "Size failed"            | "Size succeeded"            
+ STATUS    | "Status failed"          | "Status succeeded"            
+ TIMEOUT   | "Timeout"                | "Timeout recovery"          
+ TIMESTAMP | "Timestamp failed"       | "Timestamp succeeded"       
+ UID       | "UID failed"             | "UID succeeded"             
+ UPTIME    | "Uptime failed"          | "Uptime succeeded"             
+
+=item * I<$SERVICE>
+
+ The service entry name in monitrc
+
+=item * I<$DATE> 
+
+ The current time and date (RFC 822 date style).
+
+=item * I<$HOST> 
+
+ The name of the host Monit is running on
+
+=item * I<$ACTION> 
+
+ The name of the action which was done. Action names are fixed
+ and are:
+
+ Action:  | Name:
+ --------------------
+ ALERT    | "alert"
+ EXEC     | "exec"
+ RESTART  | "restart"
+ START    | "start"
+ STOP     | "stop"
+ UNMONITOR| "unmonitor"
+
+=item * I<$DESCRIPTION> 
+
+ The description of the error condition
+
+=back 
+
+
+=head2 Setting a global mail format 
+
+It is possible to set a standard mail format with the following
+global set-statement (keywords are in capital):
+
+=over 4
+
+=item SET MAIL-FORMAT {mail-format}
+
+=back
+
+Format set with this statement will apply to every alert
+statement that does I<not> have its own specified mail-format.
+This statement is most useful for setting a default from address
+for messages sent by monit, like so:
+
+ set mail-format { from: monit@foo.bar.no }
+
+
+=head2 Setting an error reminder
+
+Monit by default sends just one error notification if a service
+failed and another when it recovered. If you want to be notified
+more then once if a service remains in a failed state, you can
+use the reminder option to the alert statement (keywords are in
+capital):
+
+=over 4
+
+=item ALERT ... [WITH] REMINDER [ON] number [CYCLES]
+
+=back
+
+For example if you want to be notified each tenth cycle if a
+service remains in a failed state, you can use:
+
+  alert foo@bar with reminder on 10 cycles
+
+Likewise if you want to be notified on each failed cycle, you can
+use:
+
+  alert foo@bar with reminder on 1 cycle
+
+
+=head2 Setting a mail server for alert messages
+
+The mail server Monit should use to send alert messages is
+defined with a global set statement (keywords are in capital and
+optional statements in [brackets]):
+
+ SET MAILSERVER {hostname|ip-address [PORT port]
+                [USERNAME username] [PASSWORD password]
+                [using SSLV2|SSLV3|TLSV1] [CERTMD5 checksum]}+ 
+                [with TIMEOUT X SECONDS]
+                [using HOSTNAME hostname]
+
+The port statement allows one to use SMTP servers other then those
+listening on port 25. If omitted, port 25 is used unless ssl or
+tls is used, in which case port 465 is used by default.
+
+Monit support plain smtp authentication - you can set a username
+and a password using the USERNAME and PASSWORD options.
+
+To use secure communication, use the SSLV2, SSLV3 or TLSV1
+options, you can also specify the server certificate checksum
+using CERTMD5 option.
+
+As you can see, it is possible to set several SMTP servers. If
+Monit cannot connect to the first server in the list it will try
+the second server and so on. Monit has a default 5 seconds
+connection timeout and if the SMTP server is slow, Monit could
+timeout when connecting or reading from the server. If this is
+the case, you can use the optional timeout statement to explicit
+set the timeout to a higher value if needed. Here is an example
+for setting several mail servers:
+
+ set mailserver mail.tildeslash.com, mail.foo.bar port 10025
+     username "Rabbi" password "Loew" using tlsv1, localhost
+     with timeout 15 seconds
+
+Here Monit will first try to connect to the server
+"mail.tildeslash.com", if this server is down Monit will try
+"mail.foo.bar" on port 10025 using the given credentials via tls
+and finally "localhost". We also set an explicit connect and read
+timeout; If Monit cannot connect to the first SMTP server in the
+list within 15 seconds it will try the next server and so on. The
+I<set mailserver ..> statement is optional and if not defined
+Monit will not send email alerts. Not setting a mail server is
+recommended only if alert notification is delegated to M/Monit.
+
+Monit, by default, use the local host name in SMTP HELO/EHLO and
+in the Message-ID header. Some mail servers check this
+information against DNS for spam protection and can reject the
+email if the DNS and the hostname used in the transaction does
+not match. If this is the case, you can override the default
+local host name by using the HOSTNAME option:
+
+ set mailserver mail.tildeslash.com using hostname
+     "myhost.example.org"
+
+
+=head2 Event queue
+
+If the MTA (mail server) for sending alerts is not available,
+Monit I<can> queue events on the local file-system until the MTA
+recover. Monit will then post queued events in order with their
+original timestamp so the events are not lost. This feature is
+most useful if Monit is used together with M/Monit and when event
+history is important.
+
+The event queue is persistent across Monit restarts and provided
+that the back-end filesystem is persistent too, across system
+restart as well.
+
+By default, the queue is disabled and if the alert handler fails,
+Monit will simply drop the alert message. To enable the event
+queue, add the following statement to the Monit control file:
+
+ SET EVENTQUEUE BASEDIR <path> [SLOTS <number>]
+
+The <path> is the path to the directory where events will be
+stored. Optionally if you want to limit the queue size, use the
+slots option to only store up to I<number> event messages. If the
+slots option is not used, Monit will store as many events as the
+backend filesystem allows.
+
+Example:
+
+  set eventqueue
+      basedir /var/monit
+      slots 5000
+
+Events are stored in a binary format, with one file per event.
+The file size is ca. 130 bytes or a bit more (depending on the
+message length). The file name is composed of the unix timestamp,
+underscore and the service name, for example:
+
+ /var/monit/1131269471_apache
+
+If you are running more then one Monit instance on the same
+machine, you B<must> use separated event queue directories to
+avoid sending wrong alerts to the wrong addresses.
+
+If you want to purge the queue by hand, that is, remove queued
+event-files, Monit should be stopped before the removal.
+
+
+=head1 SERVICE TIMEOUT
+
+B<Monit> provides a service timeout mechanism for situations
+where a service simply refuses to start or respond over a longer
+period.
+
+The timeout mechanism is based on number of service restarts and
+number of poll-cycles. For example, if a service had I<x>
+restarts within I<y> poll-cycles (where I<x> <= I<y>) then Monit
+will perform an action (for example unmonitor the service). If a
+timeout occurs, Monit will send an alert message if you have
+register interest for this event.
+
+The syntax for the timeout statement is as follows (keywords are
+in capital):
+
+=over 4
+
+=item IF <number> RESTART <number> CYCLE(S) THEN <action>
+
+=back
+
+Here is an example where Monit will unmonitor the service if it
+was restarted 2 times within 3 cycles:
+
+ if 2 restarts within 3 cycles then unmonitor
+
+To have Monit check the service again after a monitoring was
+disabled, run 'monit monitor <servicename>' from the command
+line.
+
+Example for setting custom exec on timeout:
+
+ if 5 restarts within 5 cycles then exec "/foo/bar"
+
+Example for stopping the service:
+
+ if 7 restarts within 10 cycles then stop
+
+
+=head1 SERVICE TESTS
+
+Monit provides several tests you can use in a 'check service'
+entry to test a service. There are two classes of tests:
+variable and constant tests. That is, the condition we test
+is either constant e.g. a number or it can vary.
+
+A constant test has this general format:
+
+=over 4
+
+=item  IF <TEST> [[<X>] [TIMES WITHIN] <Y> CYCLES] THEN ACTION
+       [ELSE IF SUCCEEDED [[<X>] [TIMES WITHIN] <Y> CYCLES] 
+       THEN ACTION]
+
+=back
+
+If the <TEST> condition should evaluate to true, then the
+selected action is executed each cycle the test condition remains
+true. The comparison value is constant. Recovery action is
+evaluated only once (on a failed to succeeded state change only).
+The 'ELSE IF SUCCEEDED' part is optional, if omitted, Monit will
+still send an alert on recovery. The alert is sent only once for
+each state change unless overridden by the 'reminder' alert
+option.
+
+A variable test has this general format:
+
+=over 4
+
+=item  IF CHANGED <TEST> [[<X>] [TIMES WITHIN] <Y> CYCLES] 
+       THEN ACTION
+
+=back
+
+If the <TEST> should evaluate to true, then the selected action
+is executed once. The comparison value is a variable where the
+last result becomes the new value and is used for comparisons in
+future cycles. An alert is delivered each time the condition
+becomes true.
+
+You can use this test for alerts or for some automatic action,
+for example to reload monitored process after its configuration
+file was changed. Variable tests are supported for 'checksum',
+'size', 'pid, 'ppid' and 'timestamp' tests only.
+
+=over 4
+
+=item  ... [[<X>] [TIMES WITHIN] <Y> CYCLES] ...
+
+=back
+
+If a test match, its action is executed at once. This behavior
+can optionally be changed and you can for instance require that a
+test must match over several poll cycles before the action is
+executed by using the statement above. You can use this in
+several ways. For example:
+
+ if failed port 80 for 3 times within 5 cycles then alert
+
+or
+
+ if failed port 80 for 10 cycles then unmonitor
+
+If you don't specify <X> times, it equals <Y> by default, thus
+the test match if it evaluate to true for <Y> consecutive cycles.
+
+It is possible to use this option to tune and prevent a rush of
+notifications. You can use this option for failed, succeeded,
+recovered or changed rules. Here is a more complex example:
+
+ check filesystem rootfs with path /dev/hda1
+  if space usage > 80% for 5 times within 15 cycles 
+     then alert else if succeeded for 10 cycles then alert
+  if space usage > 90% for 5 cycles then 
+     exec '/try/to/free/the/space'
+
+In each test you must select the action to be executed from this
+list:
+
+=over 4
+
+=item * 
+
+B<ALERT> sends the user an alert event on each state change (for
+constant tests) or on each change (for variable tests).
+
+=item * 
+
+B<RESTART> restarts the service I<and> sends an alert. Restart is
+conducted by first calling the service's registered stop method
+and then the service's start method.
+
+=item * 
+
+B<START> starts the service by calling the service's registered
+start method I<and> send an alert.
+
+=item * 
+
+B<STOP> stops the service by calling the service's registered
+stop method I<and> send an alert. If Monit stops a service it
+will not be checked by Monit anymore nor restarted again later.
+To reactivate monitoring of the service again you must explicitly
+enable monitoring from the web interface or from the console,
+e.g. 'monit monitor apache'.
+
+=item * 
+
+B<EXEC> can be used to execute an arbitrary program I<and> send
+an alert. If you choose this action you must state the program to
+be executed and if the program require arguments you must enclose
+the program and its arguments in a quoted string. You may
+optionally specify the uid and gid the executed program should
+switch to upon start. For instance:
+
+ exec "/usr/local/tomcat/bin/startup.sh"
+      as uid nobody and gid nobody
+
+The uid and gid switch can be useful if the program to be started
+cannot change to a lesser privileged user and group. This is
+typically needed for Java Servers. Remember, if Monit is run by
+the superuser, then all programs executed by Monit will be
+started with superuser privileges unless the uid and gid
+extension was used.
+
+=item * 
+
+B<UNMONITOR> will disable monitoring of the service I<and> send
+an alert. The service will not be checked by Monit anymore nor
+restarted again later.  To reactivate monitoring of the service
+you must explicitly enable monitoring from monit's web interface
+or from the console using the monitor argument.
+
+=back
+
+
+
+=head2 EXISTENCE TESTING
+
+Monit's default action when services does not exist (for example
+a process is not running, a file doesn't exist, etc.) is to
+perform service restart action.
+
+The default action can be overrided with following statement:
+
+=over 4
+
+=item IF [DOES] NOT EXIST [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+Example:
+
+ check file with path /cifs/mydata
+   if does not exist for 5 cycles then exec "/usr/bin/mount_cifs.sh"
+
+
+=head2 RESOURCE TESTING
+
+Monit can examine how much system resources a service is using.
+This test can only be used within a system or process service
+entry in the Monit control file.
+
+Depending on system or process characteristics, services can be
+stopped or restarted and alerts can be generated. Thus it is
+possible to utilize systems which are idle and to spare system
+under high load.
+
+The full syntax for a resource-statement used for resource
+testing is as follows (keywords are in capital and optional
+statements in [brackets]),
+
+=over 4
+
+=item IF resource operator value [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+
+I<resource> is a choice of "CPU", "TOTALCPU",
+"CPU([user|system|wait])", "MEMORY", "SWAP", "CHILDREN", "TOTALMEMORY",
+"LOADAVG([1min|5min|15min])". Some resource tests can be used
+inside a check system entry, some in a check process entry and
+some in both:
+
+System only resource tests:
+
+CPU([user|system|wait]) is the percent of time the system spend
+in user or system/kernel space. Some systems such as linux 2.6
+supports a 'wait' indicator as well.
+
+SWAP is the swap usage of the system in either percent (of the
+systems total) or as an amount (Byte, kB, MB, GB).
+
+Process only resource tests:
+
+CPU is the CPU usage of the process itself (percent).
+
+TOTALCPU is the total CPU usage of the process and its children
+in (percent). You will want to use TOTALCPU typically for
+services like Apache web server where one master process forks the
+child processes as workers.
+
+CHILDREN is the number of child processes of the process. 
+
+TOTALMEMORY is the memory usage of the process and its child
+processes in either percent or as an amount (Byte, kB, MB, GB).
+
+System and process resource tests:
+
+MEMORY is the memory usage of the system or of a process (without
+children) in either percent (of the systems total) or as an
+amount (Byte, kB, MB, GB).
+
+LOADAVG([1min|5min|15min]) refers to the system's load average.
+The load average is the number of processes in the system run
+queue, averaged over the specified time period.
+
+I<operator> is a choice of "<", ">", "!=", "==" in C notation,
+"gt", "lt", "eq", "ne" in shell sh notation and "greater",
+"less", "equal", "notequal" in human readable form (if not
+specified, default is EQUAL).
+
+I<value> is either an integer or a real number (except for
+CHILDREN). For CPU, TOTALCPU, MEMORY and TOTALMEMORY you need to
+specify a I<unit>. This could be "%" or if applicable "B" (Byte),
+"kB" (1024 Byte), "MB" (1024 KiloByte) or "GB" (1024 MegaByte).
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+To calculate the cycles, a counter is raised whenever the
+expression above is true and it is lowered whenever it is false
+(but not below 0). All counters are reset in case of a restart.
+
+The following is an example to check that the CPU usage of a
+service is not going beyond 50% during five poll cycles. If it
+does, Monit will restart the service:
+
+ if cpu is greater than 50% for 5 cycles then restart
+
+See also the example section below.
+
+
+
+=head2 FILE CHECKSUM TESTING
+
+The checksum statement may only be used in a file service
+entry. If specified in the control file, Monit will compute
+a md5 or sha1 checksum for a file.
+
+The checksum test in constant form is used to verify that a
+file does not change. Syntax (keywords are in capital):
+
+=over 4
+
+=item IF FAILED [MD5|SHA1] CHECKSUM [EXPECT checksum] 
+         [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+The checksum test in variable form is used to watch for
+file changes. Syntax (keywords are in capital):
+
+=over 4
+
+=item IF CHANGED [MD5|SHA1] CHECKSUM [[<X>] <Y> CYCLES] 
+      THEN action
+
+=back
+
+The choice of MD5 or SHA1 is optional. MD5 features a 256 bit 
+and SHA1 a 320 bit checksum. If this option is omitted Monit 
+tries to guess the method from the EXPECT string or uses MD5 as
+default.
+
+I<expect> is optional and if used it specifies a md5 or sha1
+string Monit should expect when testing a file's checksum. If
+I<expect> is used, Monit will not compute an initial checksum for
+the file, but instead use the string you submit. For example:
+
+ if failed checksum and 
+    expect the sum 8f7f419955cefa0b33a2ba316cba3659
+ then alert
+
+You can, for example, use the GNU utility I<md5sum(1)> or 
+I<sha1sum(1)> to create a checksum string for a file and 
+use this string in the expect-statement.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+The checksum statement in variable form may be used to check a
+file for changes and if changed, do a specified action. For
+instance to reload a server if its configuration file was
+changed. The following illustrates this for the apache web
+server:
+
+ check file httpd.conf path /usr/local/apache/conf/httpd.conf
+     if changed sha1 checksum 
+        then exec "/usr/local/apache/bin/apachectl graceful"
+
+If you plan to use the checksum statement for security reasons,
+(a very good idea, by the way) and to monitor a file or files
+which should not change, then please use the constant form and
+also read the DEPENDENCY TREE section below to see a detailed
+example on how to do this properly.
+
+Monit can also test the checksum for files on a remote host via
+the HTTP protocol. See the CONNECTION TESTING section below.
+
+
+
+=head2 TIMESTAMP TESTING
+
+The timestamp statement may only be used in a file, fifo or
+directory service entry.
+
+The timestamp test in constant form is used to verify various
+timestamp conditions. Syntax (keywords are in capital):
+
+=over 4
+
+=item IF TIMESTAMP [[operator] value [unit]] [[<X>] <Y> CYCLES] 
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+The timestamp statement in variable form is simply to test an
+existing file or directory for timestamp changes and if changed,
+execute an action. Syntax (keywords are in capital):
+
+=over 4
+
+=item IF CHANGED TIMESTAMP [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<operator> is a choice of "<", ">", "!=", "==" in C notation,
+"GT", "LT", "EQ", "NE" in shell sh notation and "GREATER",
+"LESS", "EQUAL", "NOTEQUAL" in human readable form (if not
+specified, default is EQUAL).
+
+I<value> is a time watermark.
+
+I<unit> is either "SECOND", "MINUTE", "HOUR" or "DAY" (it is also
+possible to use "SECONDS", "MINUTES", "HOURS", or "DAYS").
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+The variable timestamp statement is useful for checking a file
+for changes and then execute an action. This version was written
+particularly with configuration files in mind. For instance, if
+you monitor the apache web server you can use this statement to
+reload apache if the I<httpd.conf> (apache's configuration file)
+was changed. Like so:
+
+ check file httpd.conf with path /usr/local/apache/conf/httpd.conf
+   if changed timestamp
+      then exec "/usr/local/apache/bin/apachectl graceful"
+
+The constant timestamp version is useful for monitoring systems
+able to report its state by changing the timestamp of certain
+state files. For instance the I<iPlanet Messaging server stored
+process> system updates the timestamp of the following files:
+
+ o stored.ckp
+ o stored.lcu
+ o stored.per
+
+If a task should fail, the system keeps the timestamp. To report
+stored problems you can use the following statements:
+
+ check file stored.ckp with path /msg-foo/config/stored.ckp
+   if timestamp > 1 minute then alert
+
+ check file stored.lcu with path /msg-foo/config/stored.lcu
+   if timestamp > 5 minutes then alert
+
+ check file stored.per with path /msg-foo/config/stored.per
+   if timestamp > 1 hour then alert
+
+As mentioned above, you can also use the timestamp statement for
+monitoring directories for changes. If files are added or removed
+from a directory, its timestamp is changed:
+
+ check directory mydir path /foo/directory
+  if timestamp > 1 hour then alert
+
+or
+
+ check directory myotherdir path /foo/secure/directory
+  if timestamp < 1 hour then alert
+
+The following example is a hack for restarting a process after a
+certain time. Sometimes this is a necessary workaround for some
+third-party applications, until the vendor fix a problem:
+
+ check file server.pid path /var/run/server.pid
+       if timestamp > 7 days 
+          then exec "/usr/local/server/restart-server"
+
+
+
+=head2 FILE SIZE TESTING
+
+The size statement may only be used in a check file service
+entry. If specified in the control file, Monit will compute
+a size for a file.
+
+The size test in constant form is used to verify various size
+conditions. Syntax (keywords are in capital):
+
+=over 4
+
+=item IF SIZE [[operator] value [unit]] [[<X>] <Y> CYCLES] 
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+The size statement in variable form is simply to test an existing
+file for size changes and if changed, execute an action. Syntax
+(keywords are in capital):
+
+=over 4
+
+=item IF CHANGED SIZE [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<operator> is a choice of "<", ">", "!=", "==" in C notation,
+"GT", "LT", "EQ", "NE" in shell sh notation and "GREATER",
+"LESS", "EQUAL", "NOTEQUAL" in human readable form (if not
+specified, default is EQUAL).
+
+I<value> is a size watermark.
+
+I<unit> is a choice of "B","KB","MB","GB" or long alternatives
+"byte", "kilobyte", "megabyte", "gigabyte". If it is not
+specified, "byte" unit is assumed by default.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+The variable size test form is useful for checking a file for
+changes and send an alert or execute an action. Monit will
+register the size of the file at startup and monitor the file for
+changes. As soon as the value changes, Monit will perform the
+specified action, reset the registered value to the new value and
+continue monitoring and test if the size changes again.
+
+One example of use for this statement is to conduct security
+checks, for instance:
+
+ check file su with path /bin/su
+       if changed size then exec "/sbin/ifconfig eth0 down"
+
+which will "cut the cable" and stop a possible intruder from
+compromising the system further. This test is just one of many
+you may use to increase the security awareness on a system. If
+you plan to use Monit for security reasons we recommend that you
+use this test in combination with other supported tests like
+checksum, timestamp, and so on.
+
+The constant form of this test can be useful in similar or
+different contexts. It can, for instance, be used to test if a
+certain file size was exceeded and then alert you or Monit may
+execute a certain action specified by you. An example is to use
+this statement to rotate log files after they have reached a
+certain size or to check that a database file does not grow
+beyond a specified threshold.
+
+To rotate a log file:
+
+ check file myapp.log with path /var/log/myapp.log
+    if size > 50 MB then 
+       exec "/usr/local/bin/rotate /var/log/myapp.log myapp"
+
+where /usr/local/bin/rotate may be a simple script, such as:
+
+ #/bin/bash
+ /bin/mv $1 $1.`date +%y-%m-%d`
+ /usr/bin/pkill -HUP $2
+
+Or you may use this statement to trigger the logrotate(8)
+program, to do an "emergency" rotate. Or to send an alert if a
+file becomes a known bottleneck if it grows behind a certain size
+because of limits in a database engine:
+
+ check file mydb with path /data/mydatabase.db
+       if size > 1 GB then alert
+
+This is a more restrictive form of the first example where the
+size is explicitly defined (note that the real su size is system
+dependent):
+
+ check file su with path /bin/su
+       if size != 95564 then exec "/sbin/ifconfig eth0 down"
+
+
+=head2 FILE CONTENT TESTING
+
+The match statement allows you to test the content of a text file
+by using regular expressions. This is a great feature if you need
+to periodically test files, such as log files, for certain
+patterns. If a pattern match, Monit defaults to raise an alert,
+other actions are also possible.
+
+The syntax (keywords in capital) for using this test is:
+
+=over 4
+
+=item IF [NOT] MATCH {regex|path} [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<regex> is a string containing the extended regular expression.
+See also regex(7).
+
+I<path> is an absolute path to a file containing extended
+regular expression on every line. See also regex(7).
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+You can use the I<NOT> statement to invert a match.
+
+The content is only being checked every cycle. If content is
+being added and removed between two checks they are unnoticed.
+
+On startup the read position is set to the end of the file 
+and Monit continue to scan to the end of file on each cycle. 
+But if the file size should decrease or inode change the read 
+position is set to the start of the file.
+
+Only lines ending with a newline character are inspected. Thus,
+lines are being ignored until they have been completed with this
+character. Also note that only the first 511 characters of a line
+are inspected.
+
+=over 4
+
+=item IGNORE [NOT] MATCH {regex|path}
+
+=back
+
+Lines matching an I<IGNORE> are not inspected during later 
+evaluations. I<IGNORE MATCH> has always precedence over 
+I<IF MATCH>.
+
+All I<IGNORE MATCH> statements are evaluated first, in the 
+order of their appearance. Thereafter, all the I<IF MATCH> 
+statements are evaluated.
+
+A real life example might look like this:
+
+  check file syslog with path /var/log/syslog
+    ignore match 
+        "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ monit\[[0-9]+\]:"
+    ignore match /etc/monit/ignore.regex
+    if match 
+        "^\w{3} [ :0-9]{11} [._[:alnum:]-]+ mrcoffee\[[0-9]+\]:"
+    if match /etc/monit/active.regex then alert
+
+
+
+=head2 FILESYSTEM FLAGS TESTING
+
+Monit can test the flags of a filesystem for changes. This test
+is implicit and Monit will send alert in case of failure by
+default.
+
+This test is useful for detecting changes of the filesystem flags
+such as when the filesystem became read-only based on disk errors
+or the mount flags were changed (such as nosuid). Each platform
+provides different set of flags. POSIX define the RDONLY and
+NOSUID flags which should work on all platforms. Some platforms
+(such as FreeBSD) has additonal flags.
+
+The syntax for the fsflags statement is:
+
+=over 4
+
+=item IF CHANGED FSFLAGS [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+Example:
+
+ check filesystem rootfs with path /
+       if changed fsflags then exec "/my/script"
+       alert root@localhost
+
+
+
+=head2 SPACE TESTING
+
+Monit can test file systems for space usage. This test may
+only be used within a check filesystem service entry in the
+Monit control file.
+
+Monit will check a filesystem's total space usage. If you only
+want to check available space for non-superuser, you must set the
+watermark appropriately (i.e. total space minus reserved blocks
+for the superuser).
+
+You can obtain (and set) the superuser's reserved blocks size,
+for example by using the tune2fs utility on Linux. On Linux 5% of
+available blocks are reserved for the superuser by default. On
+solaris 10% of the blocks are reserved. You can also use tunefs
+on solaris to change values on a live filesystem.
+
+The full syntax for the space statement is:
+
+=over 4
+
+=item IF SPACE operator value unit [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<operator> is a choice of "<",">","!=","==" in c notation, "gt",
+"lt", "eq", "ne" in shell sh notation and "greater", "less",
+"equal", "notequal" in human readable form (if not specified,
+default is EQUAL).
+
+I<unit> is a choice of "B","KB","MB","GB", "%" or long
+alternatives "byte", "kilobyte", "megabyte", "gigabyte",
+"percent".
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+=head2 INODE TESTING
+
+If supported by the file-system, you can use Monit to test
+for inodes usage. This test may only be used within a check
+filesystem service entry in the Monit control file.
+
+If the filesystem becomes unavailable, Monit will call the
+service's registered start method, if it is defined and if Monit
+is running in active mode. If Monit runs in passive mode or the
+start methods is not defined, Monit will just send an error
+alert.
+
+The syntax for the inode statement is:
+
+=over 4
+
+=item IF INODE(S) operator value [unit] [[<X>] <Y> CYCLES] 
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<operator> is a choice of "<",">","!=","==" in c notation, "gt",
+"lt", "eq", "ne" in shell sh notation and "greater", "less",
+"equal", "notequal" in human readable form (if not specified,
+default is EQUAL).
+
+I<unit> is optional. If not specified, the value is an absolute
+count of inodes. You can use the "%" character or the longer
+alternative "percent" as a unit.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+=head2 PERMISSION TESTING
+
+Monit can monitor the permission of file objects. This test may
+only be used within a file, fifo, directory or filesystem service
+entry in the Monit control file.
+
+The syntax for the permission statement is:
+
+=over 4
+
+=item IF FAILED PERM(ISSION) octalnumber [[<X>] <Y> CYCLES] 
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+
+I<octalnumber> defines permissions for a file, a directory or a
+filesystem as four octal digits (0-7). Valid range: 0000 - 7777 (you
+can omit the leading zeros, Monit will add the zeros to the left
+thus for example "640" is valid value and matches "0640").
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+The web interface will show a permission warning if the test
+failed.
+
+We recommend that you use the UNMONITOR action in a permission
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+
+ check file monit.bin with path "/usr/local/bin/monit"
+       if failed permission 0555 then unmonitor
+
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+
+
+=head2 UID TESTING
+
+Monit can monitor the owner user id (uid) of a file object.
+This test may only be used within a check - file, fifo,
+directory or filesystem service entry in the Monit control
+file.
+
+The syntax for the uid statement is:
+
+=over 4
+
+=item IF FAILED UID user [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<user> defines a user id either in numeric or in string form.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+The web interface will show a uid warning if the test should
+fail.
+
+We recommend that you use the UNMONITOR action in a uid
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+
+ check file passwd with path /etc/passwd
+       if failed uid root then unmonitor
+
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+
+
+=head2 GID TESTING
+
+Monit can monitor the owner group id (gid) of file objects. This
+test may only be used within a file, fifo, directory or
+filesystem service entry in the Monit control file.
+
+The syntax for the gid statement is:
+
+=over 4
+
+=item IF FAILED GID user [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+
+I<user> defines a group id either in numeric or in string form.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+The web interface will show a gid warning if the test should
+fail.
+
+We recommend that you use the UNMONITOR action in a gid
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+
+ check file shadow with path /etc/shadow
+       if failed gid root then unmonitor
+
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+
+
+
+=head2 PID TESTING
+
+Monit can test the process identification number (pid) of a
+process for changes. This test is implicit and Monit will send a
+alert in the case of failure by default.
+
+The syntax for the pid statement is:
+
+=over 4
+
+=item IF CHANGED PID [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+This test is useful to detect possible process restarts which has
+occurred in the timeframe between two Monit testing cycles. In
+the case that the restart was fast and the process provides
+expected service (i.e. all tests succeeded) you will be notified
+that the process was replaced.
+
+For example sshd daemon can restart very quickly, thus if someone
+changes its configuration and do sshd restart outside of Monit's
+control you will be notified that the process was replaced by a
+new instance (or you can optionally do some other action such as
+preventively stop sshd).
+
+Another example is a MySQL Cluster which has its own watchdog
+with process restart ability. You can use Monit for redundant
+monitoring. 
+
+Example:
+
+ check process sshd with pidfile /var/run/sshd.pid
+       if changed pid then exec "/my/script"
+
+
+
+=head2 PPID TESTING
+
+Monit can test the process parent process identification number
+(ppid) of a process for changes. This test is implicit and Monit
+will send alert in the case of failure by default.
+
+The syntax for the ppid statement is:
+
+=over 4
+
+=item IF CHANGED PPID [[<X>] <Y> CYCLES] THEN action
+
+=back
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+This test is useful for detecting changes of a process parent.
+
+Example:
+
+ check process myproc with pidfile /var/run/myproc.pid
+       if changed ppid then exec "/my/script"
+
+
+
+=head2 UPTIME TESTING
+
+The uptime statement may only be used in a check process service
+entry. If specified in the control file, Monit will test the
+process uptime.
+
+Syntax (keywords are in capital):
+
+=over 4
+
+=item IF UPTIME [[operator] value [unit]] [[<X>] <Y> CYCLES] 
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<operator> is a choice of "<", ">", "!=", "==" in C notation,
+"GT", "LT", "EQ", "NE" in shell sh notation and "GREATER",
+"LESS", "EQUAL", "NOTEQUAL" in human readable form (if not
+specified, default is EQUAL).
+
+I<value> is a uptime watermark.
+
+I<unit> is either "SECOND", "MINUTE", "HOUR" or "DAY" (it is also
+possible to use "SECONDS", "MINUTES", "HOURS", or "DAYS").
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+Example of restarting the process if the uptime exceeded 3 days:
+
+ check process myapp with pidfile /var/run/myapp.pid
+    start program = "/etc/init.d/myapp start"
+    stop program = "/etc/init.d/myapp stop"
+    if uptime > 3 days then restart
+
+
+=head2 CONNECTION TESTING
+
+Monit is able to perform connection testing via networked
+ports or via Unix sockets. A connection test may only be
+used within a check process or within a check host service
+entry in the Monit control file.
+
+If a service listens on one or more sockets, Monit can connect to
+the port (using either tcp or udp) and verify that the service
+will accept a connection and that it is possible to write and
+read from the socket. If a connection is not accepted or if there
+is a problem with socket i/o, Monit will assume that something is
+wrong and execute a specified action. If Monit is compiled with
+openssl, then ssl based network services can also be tested.
+
+The full syntax for the statement used for connection testing is
+as follows (keywords are in capital and optional statements in
+[brackets]),
+
+=over 4
+
+=item IF FAILED [host] port [type] 
+	 [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> CYCLES]
+      THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+or for Unix sockets,
+
+=over 4
+
+=item  IF FAILED [unixsocket] [type] 
+          [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> CYCLES]
+       THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+B<host:HOST hostname>. Optionally specify the host to connect to.
+If the host is not given then localhost is assumed if this test
+is used inside a process entry. If this test was used inside a
+remote host entry then the entry's remote host is assumed.
+Although I<host> is intended for testing name based virtual host
+in a HTTP server running on local or remote host, it does allow
+the connection statement to be used to test a server running on
+another machine. This may be useful; For instance if you use
+Apache httpd as a front-end and an application-server as the
+back-end running on another machine, this statement may be used
+to test that the back-end server is running and if not raise an
+alert.
+
+B<port:PORT number>. The port number to connect to
+
+B<unixsocket:UNIXSOCKET PATH>. Specifies the path to a Unix
+socket. Servers based on Unix sockets always run on the local
+machine and do not use a port.
+
+B<type:TYPE {TCP|UDP|TCPSSL}>. Optionally specify the socket type
+Monit should use when trying to connect to the port. The
+different socket types are; TCP, UDP or TCPSSL, where TCP is a
+regular stream based socket, UDP is a datagram socket and TCPSSL
+specifies that Monit should use a TCP socket with SSL when
+connecting to a port. The default socket type is TCP. If TCPSSL
+is used you may optionally specify the SSL/TLS protocol to be
+used and the md5 sum of the server's certificate. The TCPSSL
+options are:
+
+ TCPSSL [SSLAUTO|SSLV2|SSLV3|TLSV1] [CERTMD5 md5sum]
+
+B<proto(col):PROTO {protocols}>. Optionally specify the protocol
+Monit should speak when a connection is established. At the
+moment Monit knows how to speak:
+ I<APACHE-STATUS>
+ I<DNS>
+ I<DWP>
+ I<FTP>
+ I<GPS>
+ I<HTTP>
+ I<IMAP>
+ I<CLAMAV>
+ I<LDAP2>
+ I<LDAP3>
+ I<LMTP>
+ I<MEMCACHE>
+ I<MYSQL>
+ I<NNTP>
+ I<NTP3>
+ I<POP>
+ I<POSTFIX-POLICY>
+ I<RADIUS>
+ I<RDATE>
+ I<RSYNC>
+ I<SIP>
+ I<SMTP>
+ I<SSH>
+ I<TNS>
+ I<PGSQL>
+If you have compiled Monit with ssl support, Monit can also speak
+the SSL variants such as:
+ I<HTTPS>
+ I<FTPS>
+ I<POPS>
+ I<IMAPS>
+To use the SSL protocol support you need to define the socket as
+SSL and use the general protocol name (for example in the case of
+HTTPS) :
+ TYPE TCPSSL PROTOCOL HTTP
+If the server's protocol is not found in this list, simply do not
+specify the protocol and Monit will utilize a default test,
+including test if it is possible to read and write to the
+port. This default test is in most cases more than good enough to
+deduce if the server behind the port is up or not.
+
+The protocol statement is:
+
+ PROTO(COL) {name}
+
+The HTTP protocol supports in addition:
+
+=over 4
+
+=item * REQUEST
+
+=item * HOSTHEADER
+
+=item * CHECKSUM
+
+=back
+
+ PROTO(COL) HTTP [REQUEST {"/path"} [with CHECKSUM checksum] [with HOSTHEADER "string"]
+
+The Host header option can be used to explicit specify the HTTP
+host header in the request. If not used, Monit will use the
+hostname or IP-address of the host as specified in the statement.
+Specifying a host header is useful if you want to connect to the
+host using an IP-address, and the web-server handle name based
+virtual hosts. Examples:
+
+  if failed host 192.168.1.100 port 8080 protocol http 
+     and request '/testing' hostheader 'example.com' 
+     with timeout 20 seconds for 2 cycles 
+  then alert
+
+In addition to the standard protocols, the I<APACHE-STATUS>
+protocol is a test of a specific server type, rather than a
+generic protocol. Server performance is examined using the status
+page generated by Apache's mod_status, which is expected to be at
+its default address of http://www.example.com/server-status.
+Currently the I<APACHE-STATUS> protocol examines the percentage
+of Apache child processes which are
+
+ o logging (loglimit)
+ o closing connections (closelimit)
+ o performing DNS lookups (dnslimit)
+ o in keepalive with a client (keepalivelimit)
+ o replying to a client (replylimit)
+ o receiving a request (requestlimit)
+ o initialising (startlimit)
+ o waiting for incoming connections (waitlimit)
+ o gracefully closing down (gracefullimit)
+ o performing cleanup procedures (cleanuplimit)
+
+Each of these quantities can be compared against a value relative
+to the total number of active Apache child processes. If the
+comparison expression is true the chosen action is performed.
+
+The apache-status protocol statement is formally defined as
+(keywords in uppercase):
+
+ PROTO(COL) {limit} OP PERCENT [OR {limit} OP PERCENT]*
+
+where {limit} is one or more of: loglimit, closelimit, dnslimit,
+keepalivelimit, replylimit, requestlimit, startlimit, waitlimit
+gracefullimit or cleanuplimit. The operator OP is one of:
+[<|=|>].
+
+You can combine all of these test into one expression or you can
+choose to test a certain limit. If you combine the limits you
+must or' them together using the OR keyword.
+
+Here's an example were we test for a loglimit more than 10
+percent, a dnslimit over 25 percent and a wait limit less than 20
+percent of processes. See also more examples below in the example
+section.
+
+ protocol apache-status 
+		loglimit > 10% or
+		dnslimit > 50% or
+		waitlimit < 20%
+ then alert
+
+Obviously, do not use this test unless the httpd server you are
+testing is Apache Httpd and mod_status is activated on the
+server.
+
+
+B<send/expect: {SEND|EXPECT} "string" ...>. If Monit does not
+support the protocol spoken by the server, you can write your own
+protocol-test using I<send> and I<expect> strings. The I<SEND>
+statement sends a string to the server port and the I<EXPECT>
+statement compares a string read from the server with the string
+given in the expect statement. If your system supports POSIX
+regular expressions, you can use regular expressions in the
+expect string, see regex(7) to learn more about the types of
+regular expressions you can use in an expect string. Otherwise
+the string is used as it is. The send/expect statement is:
+
+ [{SEND|EXPECT} "string"]+
+
+Note that Monit will send a string as it is, and you B<must>
+remember to include CR and LF in the string sent to the server if
+the protocol expect such characters to terminate a string (most
+text based protocols used over Internet does). Likewise monit
+will read up to 256 bytes from the server and use this string
+when comparing the expect string. If the server sends strings
+terminated by CRLF, (i.e. "\r\n") you I<may> remember to add the
+same terminating characters to the string you expect from the
+server.
+
+As mentioned above, Monit limits the expect input to 255 bytes.
+You can override the default value by using this set statement at
+the top of the Monit configuration file:
+
+ SET EXPECTBUFFER <number> ["b"|"kb"|"mb"]
+
+For example, to set the expect buffer to read 10 kilobytes:
+
+ set expectbuffer 10 kb
+
+Note, if you want to test the number of bytes returned from the
+server you need to work around a bound check limit in POSIX
+regex. You cannot use something like expect ".{5000}" as the max
+number in a boundary check usually is {255}. However this should
+work, expect "(.{250}){20}"
+
+You can use non-printable characters in a send string if needed.
+Use the hex notation, \0xHEXHEX to send any char in the range
+\0x00-\0xFF, that is, 0-255 in decimal. This may be useful when
+testing some network protocols, particularly those over UDP. For
+example, to test a quake 3 server you can use the following,
+
+      send "\0xFF\0xFF\0xFF\0xFFgetstatus"
+      expect "sv_floodProtect|sv_maxPing"
+
+Finally, send/expect can be used with any socket type, such as
+TCP sockets, UNIX sockets and UDP sockets.
+
+B<timeout:with TIMEOUT x SECONDS>. Optionally specifies the
+connect and read timeout for the connection. If Monit cannot
+connect to the server within this time it will assume that the
+connection failed and execute the specified action. The default
+connect timeout is 5 seconds.
+
+B<retry:RETRY x>. Optionally specifies the number of consecutive
+retries within the same testing cycle in the case that the
+connection failed. The default is fail on first error.
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+=head4 Connection testing using the URL notation
+
+You can test a HTTP server using the compact URL syntax. This
+test also allow you to use POSIX regular expressions to test the
+content returned by the HTTP server.
+
+The full syntax for the URL statement is as follows (keywords are
+in capital and optional statements in [brackets]):
+
+  IF FAILED URL URL-spec
+     [CONTENT {==|!=} "regular-expression"]
+     [TIMEOUT number SECONDS] [[<X>] <Y> CYCLES] 
+     THEN action
+     [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+Where URL-spec is an URL on the standard form as specified in RFC
+2396:
+
+ <protocol>://<authority><path>?<query>
+
+Here is an example of an URL where all components are used:
+
+ http://user:password@www.foo.bar:8080/document/?querystring#ref
+
+If a username and password is included in the URL Monit will
+attempt to login at the server using B<Basic Authentication>.
+
+Testing the content returned by the server is optional. If used,
+you can test if the content B<match> or does B<not match> a
+regular expression. Here's an example on how the URL statement
+can be used in a I<check service>:
+
+ check host FOO with address www.foo.bar
+      if failed (url http://user:password@www.foo.bar:8080/login?querystring
+         and content == 'up')
+      then ...
+
+Note that the content option extends the URL by the expected data
+and does not act as standalone failure specification. The syntax is
+"if failed (<URL> and <content>)".
+
+Monit will look at the content-length header returned by the
+server and download this amount before testing the content. That
+is, if the content-length is more than 1Mb or this header is not
+set by the server Monit will default to download up to 1 Mb and
+not more.
+
+Only the http(s) protocol is supported in an URL statement. If
+the protocol is B<https> Monit will use SSL when connecting to
+the server.
+
+
+=head4 Remote host ping test
+
+In addition Monit can perform ICMP Echo tests in remote host
+checks. The icmp test may only be used in a check host entry and
+Monit must run with super user privileges, that is, the root user
+must run monit. The reason is that the icmp test utilize a raw
+socket to send the icmp packet and only the super user is allowed
+to create a raw socket.
+
+The full syntax for the ICMP Echo statement used for ping testing
+is as follows (keywords are in capital and optional statements in
+[brackets]):
+
+  IF FAILED ICMP TYPE ECHO
+     [COUNT number] [WITH] [TIMEOUT number SECONDS] 
+       [[<X>] <Y> CYCLES]
+     THEN action
+     [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+The rules for action and timeout are the same as those mentioned
+above in the CONNECTION TESTING section. The count parameter
+specifies how many consecutive echo requests will be send to the
+host in one cycle. In the case that no reply came within timeout
+frame, Monit reports error. When at least one reply was received,
+the test will pass. Monit sends by default three echo requests in
+one cycle to prevent the random packet loss from generating false
+alarm (i.e. up to 66% packet loss is tolerated). You can set the
+count option to a value between 1 and 20, which can serve as an 
+error ratio. For example if you require 100% ping success, set 
+the count to 1 (i.e. just one request will be sent, and if the
+packet was lost an error will be reported). 
+
+An icmp ping test is useful for testing if a host is up, before
+testing ports at the host. If an icmp ping test is used in a
+check host entry, this test is run first and if the ping test
+should fail we assume that the connection to the host is down and
+Monit does I<not> continue to test any ports. Here's an example:
+
+ check host xyzzy with address xyzzy.org
+       if failed icmp type echo count 5 with timeout 15 seconds 
+          then alert
+       if failed port 80 proto http then alert
+       if failed port 443 type TCPSSL proto http then alert
+       alert foo@bar
+
+In this case, if the icmp test should fail you will get I<one>
+alert and only one alert as long as the host is down, and equally
+important, Monit will I<not> test port 80 and port 443. Likewise
+if the icmp ping test should succeed (again) Monit will continue
+to test both port 80 and 443.
+
+Keep in mind though that some firewalls can block icmp packages
+and thus render the test useless.
+
+
+=head4 Examples
+
+To check a port connection and receive an alert if Monit cannot
+connect to the port, use the following statement:
+
+  if failed port 80 then alert
+
+In this case the machine in question is assumed to be the default
+host. For a process entry it's I<localhost> and for a remote host
+entry it's the I<address> of the remote host. Monit will conduct
+a tcp connection to the host at port 80 and use tcp by default.
+If you want to connect with udp, you can specify this after the
+port-statement;
+
+ if failed port 53 type udp protocol dns then alert
+
+Monit will stop trying to connect to the port after 5 seconds and
+assume that the server behind the port is down. You may increase
+or decrease the connect timeout by explicit add a connection
+timeout. In the following example the timeout is increased to 15
+seconds and if Monit cannot connect to the server within 15
+seconds the test will fail and an alert message is sent.
+
+  if failed port 80 with timeout 15 seconds then alert
+
+If a server is listening to a Unix socket the following statement
+can be used:
+
+ if failed unixsocket /var/run/sophie then alert
+
+A Unix socket is used by some servers for fast (interprocess)
+communication on localhost only. A Unix socket is specified by a
+path and in the example above the path, /var/run/sophie,
+specifies a Unix socket.
+
+If your machine answers for several virtual hosts you can prefix
+the port statement with a host-statement like so:
+
+ if failed host www.sol.no port 80 then alert
+ if failed host 80.69.226.133 port 443 then alert
+ if failed host kvasir.sol.no port 80 then alert
+
+And as mentioned above, if you do not specify a host-statement,
+I<localhost> or I<address> is assumed.
+
+Monit also knows how to speak some of the more popular Internet
+protocols. So, besides testing for connections, Monit can also
+speak with the server in question to verify that the server
+works. For example, the following is used to test a http server:
+
+ if failed host www.tildeslash.com port 80 proto http 
+    then restart
+
+Some protocols also support a request statement. This statement
+can be used to ask the server for a special document entity. 
+
+Currently B<only> the I<HTTP> protocol module supports the
+request statement, such as:
+
+ if failed host www.myhost.com port 80 protocol http 
+    and request "/data/show.php?a=b&c=d"
+ then restart
+
+The request must contain an URI string specifying a document from
+the http server. The string will be URL encoded by Monit before
+it sends the request to the http server, so it's okay to use URL
+unsafe characters in the request. If the request statement isn't
+specified, the default web server page will be requested.
+
+You can override default Host header in HTTP request:
+
+ if failed host 192.168.1.100 port 80 protocol http 
+    hostheader "example.com"
+ then alert
+
+You can also test the checksum for documents returned by a http
+server.  You can use either MD5 sums:
+
+ if failed port 80 protocol http 
+    and request "/page.html"
+        with checksum 8f7f419955cefa0b33a2ba316cba3659 
+ then alert
+
+Or you can use SHA1 sums:
+
+ if failed port 80 protocol http 
+    and request "/page.html"
+        with checksum e428302e260e0832007d82de853aa8edf19cd872 
+ then alert
+
+Monit will compute a checksum (either MD5 or SHA1 is used,
+depending on length of the hash) for the document (in the above
+case, /page.html) and compare the computed checksum with the
+expected checksum. If the sums does not match then the if-tests
+action is performed, in this case alert. Note that Monit will
+B<not> test the checksum for a document if the server does not
+set the HTTP I<Content-Length> header. A HTTP server should set
+this header when it server a static document (i.e. a file). A
+server will often use chunked transfer encoding instead when
+serving dynamic content (e.g. a document created by a CGI-script
+or a Servlet), but to test the checksum for dynamic content is
+not very useful. There are no limitation on the document size,
+but keep in mind that Monit will use time to download the
+document over the network so it's probably smart not to ask monit
+to compute a checksum for documents larger than 1Mb or so,
+depending on you network connection of course. Tip; If you get a
+checksum error even if the document has the correct sum, the
+reason may be that the download timed out. In this case, explicit
+set a longer timeout than the default 5 seconds.
+
+As mentioned above, if the server protocol is not supported by
+Monit you can write your own protocol test using send/expect
+strings. Here we show a protocol test using send/expect for an
+imaginary "Ali Baba and the Forty Thieves" protocol:
+
+ if failed host cave.persia.ir port 4040
+    send "Open, Sesame!\r\n"
+    expect "Please enter the cave\r\n"
+    send "Shut, Sesame!\r\n"
+    expect "See you later [A-Za-z ]+\r\n"
+ then restart
+
+The I<TCPSSL> statement can optionally test the md5 sum of the
+server's certificate. You must state the md5 certificate string
+you expect the server to deliver and upon a connect to the
+server, the server's actual md5 sum certificate string is tested.
+Any other symbol but [A-Fa-f0-9] is being ignored in that sting.
+Thus it is possible to copy and paste the output of e.g. openssl.
+If they do not match, the connection test fails. If the ssl
+version handshake does not work properly you can also force a
+specific ssl version, as we demonstrate in this example:
+
+ if failed host shop.sol.no port 443 
+    type TCPSSL SSLV3 # Force Monit to use ssl version 3
+    # We expect the server to return this  md5 certificate sum
+    # as either 12-34-56-78-90-AB-CD-EF-12-34-56-78-90-AB-CD-EF
+    # or e.g.   1234567890ABCDEF1234567890ABCDEF
+    # or e.g.   1234567890abcdef1234567890abcdef
+    # what ever come in more handy (see text above)
+    CERTMD5 12-34-56-78-90-AB-CD-EF-12-34-56-78-90-AB-CD-EF
+    protocol http 
+ then restart
+
+Here's an example where a connection test is used inside a
+process entry:
+
+ check process apache with pidfile /var/run/apache.pid
+       start program = "/etc/init.d/httpd start"
+       stop program = "/etc/init.d/httpd stop"
+       if failed host www.tildeslash.com port 80 then restart
+
+Here, a connection test is used in a remote host entry:
+
+ check host up2date with address ftp.redhat.com
+       if failed port 21 and protocol ftp then alert
+
+Since we did not explicit specify a host in the above test, monit
+will connect to port 21 at ftp.redhat.com. Apropos, the host
+address can be specified as a dotted IP address string or as
+hostname in the DNS. The following is exactly[*] the same test,
+but here an ip address is used instead:
+
+ check host up2date with address 66.187.232.30
+       if failed port 21 and protocol ftp then alert
+
+[*] Well, not quite, since we specify an ip-address directly we
+will bypass any DNS round-robin setup, but that's another story.
+
+=head4 Testing the SIP protocol 
+
+The SIP protocol is used by communication platform servers such
+as Asterisk and FreeSWITCH.
+
+The SIP test is similar to the other protocol tests, but in
+addition allows extra optional parameters. 
+
+=over 4
+
+=item  IF FAILED [host] [port] [type] PROTOCOL sip 
+        [AND] [TARGET valid@uri] [AND] [MAXFORWARD n]
+       THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+TARGET : 
+you may specify an alternative recipient for the message,
+by adding a valid sip uri after this keyword.
+
+MAXFORWARD :
+Limit the number of proxies or gateways that can forward the
+request to the next server. It's value is an integer in the range
+0-255, set by default to 70. If max-forward = 0, the next server
+may respond 200 OK (test succeeded) or send a 483 Too Many Hops
+(test failed)
+
+SIP examples:
+
+ check host openser_all with address 127.0.0.1
+   if failed port 5060 type udp protocol sip 
+      with target "localhost:5060" and maxforward 6
+   then alert
+  
+If sips is supported, that is, sip over ssl, specify tcpssl as
+the connection type. 
+
+ check host fwd.pulver.com with address fwd.pulver.com
+   if failed port 5060 type tcpssl protocol SIP 
+      and target 613@fwd.pulver.com maxforward 10 
+   then alert
+
+For more examples, see the example section below.
+
+
+=head4 Testing the RADIUS protocol
+
+The RADIUS test is similar to the other protocol tests, but in
+addition allows extra optional parameters.
+
+=over 4
+
+=item  IF FAILED [host] [port] [type] PROTOCOL radius [SECRET string] THEN action
+       [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+SECRET:
+you may specify an alternative secret, default is "testing123".
+
+RADIUS example:
+
+ check process radiusd with pidfile /var/run/radiusd.pid
+       start program = "/etc/init.d/freeradius start"
+       stop program = "/etc/init.d/freeradius stop"
+       if failed host 127.0.0.1 port 1812 type udp protocol radius 
+           secret testing123 
+       then alert
+       if 5 restarts within 5 cycles then timeout
+
+
+=head2 PROGRAM STATUS TESTING
+
+You can check the exit status of a program or a script. This test
+may only be used within a check program service entry in the Monit
+control file.
+
+An example:
+
+ check program myscript with path "/usr/local/bin/myscript.sh"
+       if status != 0 then alert
+
+Monit will execute the program periodically and if the exit
+status of the program does not match the expected result, Monit
+can perform an action. In the example above, Monit will raise an
+alert if the exit value of I<myscript> is different from 0. By
+convention, 0 means the program exited normally.
+
+Program checks are asynchronous. Meaning that Monit will not wait
+for the program to exit, but instead, Monit will start the
+program in the background and immediately continue checking the
+next service entry in I<monitrc>. At the next cycle, Monit will
+check if the program has finished and if so, collect the programs
+exit status - if the status indicate a failure, Monit will raise
+an alert message containing the program's error (stderr) output,
+if any. If the program has not exited after the first cycle,
+Monit will wait another cycle and so on. If the program is still
+running after 5 minutes, Monit will kill it and generate a
+program timeout event. It is possible to override the default
+timeout (see the syntax below).
+
+The asynchronous nature of the program check allows for
+non-blocking behavior in the current Monit design, but it comes
+with a side-effect: when the program has finished executing and
+is waiting for Monit to collect the result, it becomes a
+so-called "zombie" process. A zombie process does not consume
+any system resources (only the PID remains in use) and it is
+under Monit's control; The zombie process is removed from the
+system as soon as Monit collects the exit status. This means that
+every "check program" will be associated with either a running
+process or a temporary zombie. This unwanted zombie side-effect
+will be removed in a later release of Monit.
+
+The syntax of the program status statement is:
+
+=over 4
+
+=item IF STATUS operator value [TIMEOUT <N> SECONDS] [[<X>] <Y> CYCLES] THEN action
+      [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+
+=back
+
+I<operator> is a choice of "<",">","!=","==" in c notation, "gt",
+"lt", "eq", "ne" in shell sh notation and "greater", "less",
+"equal", "notequal" in human readable form (if not specified,
+default is EQUAL).
+
+I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
+"EXEC" or "UNMONITOR".
+
+
+=head1 SERVICE POLL TIME
+
+Services are checked in regular intervals given by the I<set
+daemon n> statement. Checks are performed in the same order as
+they are written in the I<.monitrc> file, except if dependencies
+are setup between services, in which case the services hierarchy
+may alternate the order of the checks.
+
+It is possible to modify the check schedule using the I<every>
+statement.
+
+There are three variants:
+
+=over 4
+
+=item 1. custom interval based on poll cycle length multiple
+
+      EVERY [number] CYCLES
+
+=item 2. test schedule based on cron-style string
+
+      EVERY [cron]
+
+=item 3. do-not-test schedule based on cron-style string
+
+      NOT EVERY [cron]
+
+=back
+
+A cron-style string, consist of 5 fields separated with
+white-space. All fields are required:
+
+ Name:        | Allowed values:            | Special characters:              
+ ---------------------------------------------------------------
+ Minutes      | 0-59                       | * - ,
+ Hours        | 0-23                       | * - ,
+ Day of month | 1-31                       | * - ,
+ Month        | 1-12 (1=jan, 12=dec)       | * - ,
+ Day of week  | 0-6 (0=sunday, 6=saturday) | * - ,
+
+The special characters:
+
+ Character:   | Description:
+ ---------------------------------------------------------------
+ * (asterisk) | The asterisk indicates that the expression will
+              | match for all values of the field; e.g., using
+              | an asterisk in the 4th field (month) would
+              | indicate every month.
+ - (hyphen)   | Hyphens are used to define ranges. For example,
+              | 8-9 in the hour field indicate between 8AM and
+              | 9AM. Note that range is from time1 until and
+              | including time2. That is, from 8AM and until
+              | 10AM unless minutes are set. Another example,
+              | 1-5 in the weekday field, specify from monday to
+              | friday (including friday).
+ , (comma)    | Comma are used to specify a sequence. For example
+              | 17,18 in the day field indicate the 17th and 18th
+              | day of the month. A sequence can also include
+              | ranges. For example, using 1-5,0 in the weekday
+              | field indicate monday to friday and sunday.
+
+Example 1: Check once per two cycles
+
+ check process nginx with pidfile /var/run/nginx.pid
+   every 2 cycles
+
+Example 2: Check every workday 8AM-7PM
+
+ check program checkOracleDatabase with
+       path /var/monit/programs/checkoracle.pl
+   every "* 8-19 * * 1-5"
+
+Example 3: Do not run the check in the backup window on 
+Sunday 0AM-3AM
+
+ check process mysqld with pidfile /var/run/mysqld.pid
+   not every "* 0-3 * * 0"
+
+Limitations:
+
+The current test scheduler is poll cycle based. When Monit starts
+testing and the service test is constraint with the I<every cron>
+statement, it checks whether the current time match the
+cron-string pattern. If it does, the test is done, otherwise it
+is skipped. The cron specification thus does not guarantee when
+exactly the test will run - that depends on the default poll time
+and the length of the testing cycle. In other words, we cannot
+guarantee that Monit will run on a specific time. Therefor we
+B<strongly> recommend to use an asterix in the minute field or at
+minimum a range, e..g. 0-15. B<Never> use a specific minute as
+Monit may not run on that minute.
+
+We will address this limitation in a future release and convert
+the test scheduler from serial polling into a parallel
+non-blocking scheduler where checks are guaranteed to run on time
+and with seconds resolution.
+
+
+=head1 MONIT HTTPD
+
+If specified in the control file, Monit will start a Monit daemon
+with http support. From a Browser you can then start and stop
+services, disable or enable service monitoring as well as view
+the status of each service. Also, if Monit logs to its own file,
+you can view the content of this logfile in a Browser.
+
+The control file statement for starting a Monit daemon with http
+support is a global set-statement:
+
+=over 4
+
+=item  set httpd port 2812
+
+=back
+
+And you can use this URL, I<http://localhost:2812/>, to access
+the daemon from a browser. The port number, in this case 2812,
+can be any number that you are allowed to bind to.
+
+If you have compiled Monit with openssl, you can also start the
+httpd server with ssl support, using the following expression:
+
+ set httpd port 2812
+     ssl enable
+     pemfile /etc/certs/monit.pem
+
+And you can use this URL, I<https://localhost:2812/>, to access
+the Monit web server over an ssl encrypted connection.
+
+The pemfile, in the example above, holds both the server's
+private key and certificate. This file should be stored in a safe
+place on the filesystem and should have strict permissions, that
+is, no more than 0700.
+
+In addition, if you want to check for client certificates you can
+use the CLIENTPEMFILE statement. In this case, a connecting
+client has to provided a certificate known by Monit in order to
+connect. This file also needs to have all necessary CA
+certificates. A configuration could look like:
+
+ set httpd port 2812
+     ssl enable
+     pemfile /etc/certs/monit.pem
+     clientpemfile /etc/certs/monit-client.pem
+
+By default self signed client certificates are not allowed. If
+you want to use a self signed certificate from a client it has to
+be allowed explicitly with the ALLOWSELFCERTIFICATION statement.
+
+For more information on how to use Monit with SSL and for more
+information about certificates and generating pem files, please
+consult the README.SSL file accompanying the software.
+
+If you only want the http server to accept connect requests to
+one host addresses you can specify the bind address either as an
+IP number string or as a hostname. In the following example we
+bind the http server to the loopback device. In other words the
+http server will only be reachable from localhost:
+
+  set httpd port 2812 and use the address 127.0.0.1
+
+or
+
+  set httpd port 2812 and use the address localhost
+
+If you do not use the ADDRESS statement the http server will
+accept connections on any/all local addresses.
+
+It is possible to hide monit's httpd server version, which 
+usually is available in httpd header responses and in error 
+pages. 
+
+  set httpd port 2812
+    ...
+    signature {enable|disable}
+
+Use I<disable> to hide the server signature - Monit will only
+report its name (e.g. 'monit' instead of for example 'monit
+4.2'). By default the version signature is enabled. It is worth
+to stress that this option provides no security advantage and 
+falls into the "security through obscurity" category.
+
+If you remove the httpd statement from the config file, monit
+will stop the httpd server on configuration reload. Likewise if
+you change the port number, Monit will restart the http server
+using the new specified port number.
+
+The status page displayed by the Monit web server is
+automatically refreshed with the same poll time set for the monit
+daemon.
+
+
+B<Note:>
+
+We strongly recommend that you start Monit with http support (and
+bind the server to localhost, only, unless you are behind a
+firewall). The built-in web-server is small and does not use much
+resources, and more I<importantly>, Monit can use the http server
+for interprocess communication between a Monit client and a monit
+daemon.
+
+For instance, you I<must> start a Monit daemon with http support
+if you want to be able to use most of the available console
+commands. I.e. 'Monit stop all', 'Monit start all' etc.
+
+If a Monit daemon is running in the background we will ask the
+daemon (via the HTTP protocol) to execute the above commands.
+That is, the daemon is requested to start and stop the services.
+This ensures that a daemon will not restart a service that you
+requested to stop and that (any) timeout lock will be removed
+from a service when you start it.
+
+=head2 FIPS support
+
+Monit built-in web-server supports the OpenSSL FIPS module. 
+To enable this mode, your OpenSSL library must first be built
+with FIPS support. Then in the Monit control file, simply
+add this I<set> statement at the top;
+
+ set fips
+
+Note that the FIPS module may not be supported in the latest
+version of OpenSSL. So make sure that your version of OpenSSL
+support the FIPS object module before attempting to enable this
+in Monit.
+
+=head2 Monit HTTPD Authentication
+
+Monit supports two types of authentication schema's for
+connecting to the httpd server, (three, if you count SSL client
+certificate validation). Both schema's can be used together or by
+itself. You B<must> choose at least one.
+
+=head4 Host and network allow list
+
+The http server maintains an access-control list of hosts and
+networks allowed to connect to the server. You can add as many
+hosts as you want to, but only hosts with a valid domain name or
+its IP address are allowed. Networks require a network IP and a
+netmask to be accepted.
+
+The http server will query a name server to check any hosts
+connecting to the server. If a host (client) is trying to connect
+to the server, but cannot be found in the access list or cannot
+be resolved, the server will shutdown the connection to the
+client promptly.
+
+Control file example:
+
+  set httpd port 2812
+      allow localhost
+      allow my.other.work.machine.com
+      allow 10.1.1.1
+      allow 192.168.1.0/255.255.255.0
+      allow 10.0.0.0/8
+
+Clients, not mentioned in the allow list, trying to connect to
+the server are logged with their ip-address.
+
+
+=head4 Basic Authentication
+
+This authentication schema is HTTP specific and described in more
+detail in RFC 2617.
+
+In short; a server challenge a client (e.g. a Browser) to send
+authentication information (username and password) and if
+accepted, the server will allow the client access to the
+requested document.
+
+The biggest weakness with Basic Authentication is that the
+username and password is sent in clear-text (i.e. base64 encoded)
+over the network. It is therefor recommended that you do not use
+this authentication method unless you run the Monit http server
+with I<ssl> support. With ssl support it is completely safe to
+use Basic Authentication since B<all> http data, including Basic
+Authentication headers will be encrypted.
+
+Monit will use Basic Authentication if an allow statement
+contains a username and a password separated with a single ':'
+character, like so: I<allow username:password>. The username and
+password must be written in clear-text. Special characters
+can be used but the password has to be quoted.
+
+PAM is supported as well on platforms which provide PAM (such
+as Linux, Mac OS X, FreeBSD, NetBSD). The syntax is:
+I<allow @mygroup> which provides access to the user of group
+called I<mygroup>. Monit uses PAM service called I<monit> for
+PAM authentication, see PAM manual page for detailed instructions
+how to set the PAM service and PAM authentication plugins.
+Example Monit PAM for Mac OS X - /etc/pam.d/monit:
+
+  # monit: auth account password session
+  auth       sufficient     pam_securityserver.so
+  auth       sufficient     pam_unix.so
+  auth       required       pam_deny.so
+  account    required       pam_permit.so
+
+And configuration part for monitrc which allows only group admins
+authenticated using via PAM to access the http interface:
+
+  set httpd port 2812 allow @admin
+
+
+Alternatively you can use files in "htpasswd" format (one
+user:passwd entry per line), like so: I<allow
+[cleartext|crypt|md5] /path [users]>. By default cleartext
+passwords are read. In case the passwords are digested it is
+necessary to specify the cryptographic method. If you do not want
+all users in the password file to have access to Monit you can
+specify only those users that should have access, in the allow
+statement. Otherwise all users are added.
+
+Example1:
+
+  set httpd port 2812
+      allow hauk:password
+      allow md5 /etc/httpd/htpasswd john paul ringo george
+
+If you use this method together with a host list, then only
+clients from the listed hosts will be allowed to connect to the
+Monit http server and each client will be asked to provide a
+username and a password.
+
+Example2:
+
+  set httpd port 2812
+      allow localhost
+      allow 10.1.1.1
+      allow hauk:"password"
+
+If you only want to use Basic Authentication, then just provide
+allow entries with username and password or password files as in
+example 1 above.
+
+Finally it is possible to define some users as read-only. A
+read-only user can read the Monit web pages but will I<not> get
+access to push-buttons and cannot change a service from the web
+interface.
+
+  set httpd port 2812
+      allow admin:password
+      allow hauk:password read-only
+      allow @admins
+      allow @users read-only
+
+A user is set to read-only by using the I<read-only> keyword
+B<after> username:password. In the above example the user I<hauk>
+is defined as a read-only user, while the I<admin> user has all
+access rights.
+
+If you use Basic Authentication it is a good idea to set the
+access permission for the control file (~/.monitrc) to only
+readable and writable for the user running monit, because the
+password is written in clear-text. (Use this command, /bin/chmod
+600 ~/.monitrc). In fact, since Monit B<version 3.0>, Monit will
+complain and exit if the control file is readable by others.
+
+Clients trying to connect to the server but supply the wrong
+username and/or password are logged with their ip-address.
+
+If the Monit command line interface is being used, at least one
+cleartext password is necessary. Otherwise, the Monit command
+line interface will not be able to connect to the Monit daemon
+server.
+
+
+=head1 DEPENDENCIES
+
+If specified in the control file, Monit can do dependency
+checking before start, stop, monitoring or unmonitoring of
+services. The dependency statement may be used within any service
+entries in the Monit control file.
+
+The syntax for the depend statement is simply:
+
+=over 4
+
+=item  DEPENDS on service[, service [,...]]
+
+=back
+
+Where B<service> is a service entry name, for instance B<apache>
+or B<datafs>.
+
+You may add more than one service name of any type or use more
+than one depend statement in an entry.
+
+Services specified in a I<depend> statement will be checked
+during stop/start/monitor/unmonitor operations. If a service is
+stopped or unmonitored it will stop/unmonitor any services that
+depends on itself. Likewise, if a service is started, it will
+first stop any services that depends on itself and after it is
+started, start all depending services again. If the service is to
+be monitored (enable monitoring), all services which this service
+depends on will be monitored before enabling monitoring of this
+service.
+
+Here is an example where we set up an apache service entry to
+depend on the underlying apache binary. If the binary should
+change an alert is sent and apache is not monitored anymore. The
+rationale is security and that Monit should not execute a
+possibly cracked apache binary.
+
+ (1) check process apache 
+ (2)    with pidfile "/usr/local/apache/logs/httpd.pid"
+ (3)    ...
+ (4)    depends on httpd
+ (5)
+ (6) check file httpd with path /usr/local/apache/bin/httpd
+ (7)    if failed checksum then unmonitor
+
+The first entry is the process entry for apache shown before
+(abbreviated for clarity). The fourth line sets up a dependency
+between this entry and the service entry named httpd in line 6. A
+depend tree works as follows, if an action is conducted in a
+lower branch it will propagate upward in the tree and for every
+dependent entry execute the same action. In this case, if the
+checksum should fail in line 7 then an unmonitor action is
+executed and the apache binary is not checked anymore. But since
+the apache process entry depends on the httpd entry this entry
+will also execute the unmonitor action. In short, if the checksum
+test for the httpd binary file should fail, both the check file
+httpd entry and the check process apache entry is set in
+un-monitoring mode.
+
+A dependency tree is a general construct and can be used between
+all types of service entries and span many levels and propagate
+any supported action (except the exec action which will not
+propagate upward in a dependency tree for obvious reasons).
+
+Here is another different example. Consider the following common
+server setup:
+
+  WEB-SERVER -> APPLICATION-SERVER -> DATABASE -> FILESYSTEM
+      (a)               (b)             (c)          (d)
+
+You can set dependencies so that the web-server depends on the
+application server to run before the web-server starts and the
+application server depends on the database server and the
+database depends on the file-system to be mounted before it
+starts. See also the example section below for examples using the
+depend statement.
+
+Here we describe how Monit will function with the above
+dependencies:
+
+=over 4
+
+=item If no servers are running 
+
+Monit will start the servers in the following order: I<d>, I<c>,
+I<b>, I<a>
+
+=item If all servers are running 
+
+When you run 'Monit stop all' this is the stop order: I<a>, I<b>,
+I<c>, I<d>. If you run 'Monit stop d' then I<a>, I<b> and I<c>
+are also stopped because they depend on I<d> and finally I<d> is
+stopped.
+
+=item If I<a> does not run 
+
+When Monit runs it will start I<a>
+
+=item If I<b> does not run
+
+When Monit runs it will first stop I<a> then start I<b> and
+finally start I<a> again.
+
+=item If I<c> does not run
+
+When Monit runs it will first stop I<a> and I<b> then start I<c>
+and finally start I<b> then I<a>.
+
+=item If I<d> does not run
+
+When Monit runs it will first stop I<a>, I<b> and I<c> then start
+I<d> and finally start I<c>, I<b> then I<a>.
+
+=item If the control file contains a depend loop. 
+
+A depend loop is for example; a->b and b->a or a->b->c->a.
+
+When Monit starts it will check for such loops and complain and
+exit if a loop was found. It will also exit with a complaint if a
+depend statement was used that does not point to a service in the
+control file.
+
+=back
+
+
+
+=head1 THE RUN CONTROL FILE
+
+The preferred way to set up Monit is to write a I<.monitrc> file
+in your home directory. When there is a conflict between the
+command-line arguments and the arguments in this file, the
+command-line arguments take precedence. To protect the security
+of your control file and passwords the control file must have
+permissions I<no more than 0700> (u=xrw,g=,o=); Monit will
+complain and exit otherwise.
+
+=head2 Run Control Syntax
+
+Comments begin with a '#' and extend through the end of the line.
+Otherwise the file consists of a series of service entries or
+global option statements in a free-format, token-oriented syntax.
+
+There are three kinds of tokens: grammar  , numbers (i.e.
+decimal digit sequences) and strings. Strings can be either
+quoted or unquoted. A quoted string is bounded by double quotes
+and may contain whitespace (and quoted digits are treated as a
+string). An unquoted string is any whitespace-delimited token,
+containing characters and/or numbers.
+
+On a semantic level, the control file consists of two types of
+entries:
+
+=over 4
+
+=item 1. Global set-statements
+
+A global set-statement starts with the keyword I<set> and the
+item to configure.
+
+=item 2. One or more service entry statements.
+
+Each service entry consists of the keywords `check', followed by
+the service type. Each entry requires a <unique> descriptive
+name, which may be freely chosen. This name is used by monit
+to refer to the service internally and in all interactions
+with the user.
+
+=back
+
+Currently, eight types of check statements are supported:
+
+=over 4
+
+=item 1. CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>
+
+<path> is the absolute path to the program's pidfile. If the
+pidfile does not exist or does not contain the pid number of a
+running process, Monit will call the entry's start method if
+defined.
+<regex> is alternative process specification using pattern matching
+to process name (command line) from process table instead of pidfile.
+The first match is used so this form of check is useful for unique
+pattern matching - the pidfile should be used where possible as it
+defines expected pid exactly (pattern matching won't be useful for
+Apache in most cases for example).
+The pattern can be obtained using I<monit procmatch ".*"> CLI command
+which lists all processes visible to Monit or using the I<ps> utility.
+The "procmatch" CLI command can be used to test your pattern as well.
+If Monit runs in passive mode or the start methods is not defined,
+Monit will just send alerts on errors.
+
+=item 2. CHECK FILE <unique name> PATH <path>
+
+<path> is the absolute path to the file. If the file does not
+exist or disappeared, Monit will call the entry's start method if
+defined, if <path> does not point to a regular file type (for
+instance a directory), Monit will disable monitoring of this
+entry. If Monit runs in passive mode or the start methods is not
+defined, Monit will just send alerts on errors.
+
+=item 3. CHECK FIFO <unique name> PATH <path>
+
+<path> is the absolute path to the fifo. If the fifo does not
+exist or disappeared, Monit will call the entry's start method if
+defined, if <path> does not point to a fifo type (for
+instance a directory), Monit will disable monitoring of this
+entry. If Monit runs in passive mode or the start methods is not
+defined, Monit will just send alerts on errors.
+
+=item 4. CHECK FILESYSTEM <unique name> PATH <path>
+
+<path> is the path to the filesystem block special device, mount point,
+file or a directory which is part of a filesystem. It is
+recommended to use a block special file directly (for example
+/dev/hda1 on Linux or /dev/dsk/c0t0d0s1 on Solaris, etc.) If you
+use a mount point (for example /data), be careful, because if the
+filesystem is unmounted the test will still be true because the mount
+point exist.
+
+If the filesystem becomes unavailable, Monit will call the entry's
+start method if defined. if <path> does not point to a filesystem,
+Monit will disable monitoring of this entry. If Monit runs in
+passive mode or the start methods is not defined, Monit will just
+send alerts on errors.
+
+=item 5. CHECK DIRECTORY <unique name> PATH <path>
+
+<path> is the absolute path to the directory. If the directory
+does not exist or disappeared, Monit will call the entry's start
+method if defined, if <path> does not point to a directory, monit
+will disable monitoring of this entry. If Monit runs in passive
+mode or the start methods is not defined, Monit will just send
+alerts on errors.
+
+=item 6. CHECK HOST <unique name> ADDRESS <host address> 
+
+The host address can be specified as a hostname string or as an
+ip-address string on a dotted decimal format. Such as,
+tildeslash.com or "64.87.72.95".
+
+=item 7. CHECK SYSTEM <unique name>
+
+The system name is usually hostname, but any descriptive name can be
+used. This test allows one to check general system resources such as
+CPU usage (percent of time spent in user, system and wait), total
+memory usage or load average.
+
+=item 8. CHECK PROGRAM <unique name> PATH <executable file>
+
+<path> is the absolute path to the executable program or script.
+The I<status> test allows to check the program's exit status.
+
+=back
+
+
+You can use noise keywords like 'if', `and', `with(in)', `has',
+`using', 'use', 'on(ly)', `usage' and `program(s)' anywhere in an
+entry to make it resemble English. They're ignored, but can make
+entries much easier to read at a glance. The punctuation
+characters ';' ',' and '=' are also ignored. Keywords are case
+insensitive.
+
+ Here are the legal global keywords:
+
+ Keyword         Function
+ ----------------------------------------------------------------
+ set daemon      Set a background poll interval in seconds.
+ set init        Set Monit to run from init. Monit will not
+                 transform itself into a daemon process.
+ set logfile     Name of a file to dump error- and status-
+                 messages to. If syslog is specified as the 
+                 file, Monit will utilize the syslog daemon
+                 to log messages. This can optionally be 
+                 followed by 'facility <facility>' where 
+                 facility is 'log_local0' - 'log_local7' or 
+                 'log_daemon'. If no facility is specified, 
+                 LOG_USER is used.
+ set mailserver  The mailserver used for sending alert
+                 notifications. If the mailserver is not 
+                 defined, Monit will try to use 'localhost' 
+                 as the smtp-server for sending mail. You 
+                 can add more mail servers, if Monit cannot
+                 connect to the first server it will try the
+                 next server and so on.
+ set mail-format Set a global mail format for all alert
+                 messages emitted by monit.
+ set idfile      Explicit set the location of the Monit id
+                 file. E.g. set idfile /var/monit/id.
+ set pidfile     Explicit set the location of the Monit lock
+                 file. E.g. set pidfile /var/run/xyzmonit.pid.
+ set statefile   Explicit set the location of the file Monit 
+                 will write state data to. If not set, the
+                 default is $HOME/.monit.state. 
+ set httpd port  Activates Monit http server at the given 
+                 port number.
+ ssl enable      Enables ssl support for the httpd server.
+                 Requires the use of the pemfile statement.
+ ssl disable     Disables ssl support for the httpd server.
+                 It is equal to omitting any ssl statement.
+ pemfile         Set the pemfile to be used with ssl.
+ clientpemfile   Set the pemfile to be used when client
+                 certificates should be checked by monit.
+ address         If specified, the http server will only 
+                 accept connect requests to this addresses
+                 This statement is an optional part of the
+                 set httpd statement.
+ allow           Specifies a host or IP address allowed to
+                 connect to the http server. Can also specify
+                 a username and password allowed to connect
+                 to the server. More than one allow statement
+                 are allowed. This statement is also an 
+                 optional part of the set httpd statement.
+ read-only       Set the user defined in username:password
+                 to read only. A read-only user cannot change
+                 a service from the Monit web interface.
+ include         include a file or files matching the globstring
+
+ Here are the legal service entry keywords:
+
+ Keyword         Function
+ ----------------------------------------------------------------
+ check           Starts an entry and must be followed by the type
+                 of monitored service {filesystem|directory|file|host
+                 process|system|program} and a descriptive name for
+                 the service.
+ pidfile         Specify the  process pidfile. Every
+                 process must create a pidfile with its
+                 current process id. This statement should only
+                 be used in a process service entry.
+ path            Must be followed by a path to the block
+                 special file for filesystem, regular
+                 file, directory or a process's pidfile.
+ group           Specify a groupname for a service entry.
+ start           The program used to start the specified 
+                 service. Full path is required. This 
+                 statement is optional, but recommended.
+ stop            The program used to stop the specified
+                 service. Full path is required. This 
+                 statement is optional, but recommended.
+ pid and ppid    These keywords may be used as standalone
+                 statements in a process service entry to
+                 override the alert action for change of
+                 process pid and ppid.
+ uid and gid     These keywords are either 1) an optional part of
+                 a start, stop or exec statement. They may be
+                 used to specify a user id and a group id the
+                 program (process) should switch to upon start.
+                 This feature can only be used if the superuser
+                 is running monit. 2) uid and gid may also be
+                 used as standalone statements in a file service
+                 entry to test a file's uid and gid attributes.
+ host            The hostname or IP address to test the port
+                 at. This keyword can only be used together
+                 with a port statement or in the check host
+                 statement.
+ port            Specify a TCP/IP service port number which 
+                 a process is listening on. This statement
+                 is also optional. If this statement is not
+                 prefixed with a host-statement, localhost is
+                 used as the hostname to test the port at.
+ type            Specifies the socket type Monit should use when
+                 testing a connection to a port. If the type
+                 keyword is omitted, tcp is used. This keyword
+                 must be followed by either tcp, udp or tcpssl.
+ tcp             Specifies that Monit should use a TCP 
+                 socket type (stream) when testing a port.
+ tcpssl          Specifies that Monit should use a TCP socket
+                 type (stream) and the secure socket layer (ssl)
+                 when testing a port connection.
+ udp             Specifies that Monit should use a UDP socket
+                 type (datagram) when testing a port.
+ certmd5         The md5 sum of a certificate a ssl forged 
+                 server has to deliver.
+ proto(col)      This keyword specifies the type of service 
+                 found at the port. See CONNECTION TESTING
+                 for list of supported protocols.
+                 You're welcome to write new protocol test
+                 modules. If no protocol is specified Monit will
+                 use a default test which in most cases are good
+                 enough.
+ request         Specifies a server request and must come
+                 after the protocol keyword mentioned above.
+                  - for http it can contain an URL and an
+                    optional query string.
+                  - other protocols does not support this
+                    statement yet
+ send/expect     These keywords specify a generic protocol. 
+                 Both require a string whether to be sent or
+                 to be matched against (as extended regex if 
+                 supported).  Send/expect can not be used 
+                 together with the proto(col) statement.
+ unix(socket)    Specifies a Unix socket file and used like 
+                 the port statement above to test a Unix 
+                 domain network socket connection.
+ URL             Specify an URL string which Monit will use for
+                 connection testing.
+ content         Optional sub-statement for the URL statement.
+                 Specifies that Monit should test the content
+                 returned by the server against a regular 
+                 expression.
+ timeout x sec.  Define a network port connection timeout. Must
+                 be followed by a number in seconds and the 
+                 keyword, seconds.
+ timeout         Define a service timeout. Must be followed by
+                 two digits. The first digit is max number of
+                 restarts for the service. The second digit
+                 is the cycle interval to test restarts. 
+                 This statement is optional.
+ alert           Specifies an email address for notification
+                 if a service event occurs. Alert can also
+                 be postfixed, to only send a message for
+                 certain events. See the examples above. More
+                 than one alert statement is allowed in an
+                 entry. This statement is also optional.
+ noalert         Specifies an email address which don't want
+                 to receive alerts. This statement is also
+                 optional.
+ restart, stop   These keywords may be used as actions for 
+ unmonitor,      various test statements. The exec statement is
+ start and       special in that it requires a following string
+ exec            specifying the program to be execute. You may
+                 also specify an UID and GID for the exec 
+                 statement. The program executed will then run
+                 using the specified user id and group id.
+ mail-format     Specifies a mail format for an alert message 
+                 This statement is an optional part of the
+                 alert statement.
+ checksum        Specify that Monit should compute and monitor a
+                 file's md5/sha1 checksum. May only be used in a 
+                 check file entry.
+ expect          Specifies a md5/sha1 checksum string Monit 
+                 should expect when testing the checksum. This 
+                 statement is an optional part of the checksum 
+                 statement.
+ timestamp       Specifies an expected timestamp for a file
+                 or directory. More than one timestamp statement
+                 are allowed. May only be used in a check file or
+                 check directory entry.
+ changed         Part of a timestamp statement and used as an
+                 operator to simply test for a timestamp change.
+ every           Validate this entry only at every n poll cycle
+                 or per cron specification. Useful in daemon mode
+                 when the cycle is short and a service takes some
+                 time to start or to suppress monitoring during
+                 backup windows.
+ mode            Must be followed either by the keyword active,
+                 passive or manual. If active, Monit will restart
+                 the service if it is not running (this is the
+                 default behavior). If passive, Monit will not
+                 (re)start the service if it is not running - it
+                 will only monitor and send alerts (resource
+                 related restart and stop options are ignored
+                 in this mode also). If manual, Monit will enter
+                 active mode only if a service was started under
+                 monit's control otherwise the service isn't
+                 monitored.
+ cpu             Must be followed by a compare operator, a number 
+                 with "%" and an action. This statement is used
+                 to check the cpu usage in percent of a process
+                 with its children over a number of cycles. If
+                 the compare expression matches then the 
+                 specified action is executed.
+ mem             The equivalent to the cpu token for memory of a 
+                 process (w/o children!).  This token must be 
+                 followed by a compare operator a number with 
+                 unit {B|KB|MB|GB|%|byte|kilobyte|megabyte|
+                 gigabyte|percent} and an action.
+ swap            Token for system swap usage monitoring. This token
+                 must be followed by a compare operator a number with 
+                 unit {B|KB|MB|GB|%|byte|kilobyte|megabyte|gigabyte|percent}
+                 and an action.
+ loadavg         Must be followed by [1min,5min,15min] in (), a 
+                 compare operator, a number and an action. This
+                 statement is used to check the system load 
+                 average over a number of cycles. If the compare 
+                 expression matches then the specified action is 
+                 executed.
+ children        This is the number of child processes spawn by a
+                 process. The syntax is the same as above.
+ totalmem        The equivalent of mem, except totalmem is an
+                 aggregation of memory, not only used by a
+                 process but also by all its child
+                 processes. The syntax is the same as above.
+ space           Must be followed by a compare operator, a
+                 number, unit {B|KB|MB|GB|%|byte|kilobyte|
+                 megabyte|gigabyte|percent} and an action.
+ inode(s)        Must be followed by a compare operator, integer
+                 number, optionally by percent sign (if not, the
+                 limit is absolute) and an action.
+ perm(ission)    Must be followed by an octal number describing
+                 the permissions.
+ size            Must be followed by a compare operator, a
+                 number, unit {B|KB|MB|GB|byte|kilobyte|
+                 megabyte|gigabyte} and an action.
+ uptime          Must be followed by a compare operator, a
+                 number, unit {second(s)|minute(s)|hour(s)|day(s)}
+                 and an action.
+ depends (on)    Must be followed by the name of a service this
+                 service depends on.
+
+
+Here's the complete list of reserved B<keywords> used by monit:
+
+I<if>, I<then>, I<else>, I<set>, I<daemon>, I<logfile>,
+I<syslog>, I<address>, I<httpd>, I<ssl>, I<enable>, I<disable>,
+I<pemfile>, I<allow>, I<read-only>, I<check>, I<init>, I<count>,
+I<pidfile>, I<statefile>, I<group>, I<start>, I<stop>, I<uid>,
+I<gid>, I<connection>, I<port(number)>, I<unix(socket)>, I<type>,
+I<proto(col)>, I<tcp>, I<tcpssl>, I<udp>, I<alert>, I<noalert>,
+I<mail-format>, I<restart>, I<timeout>, I<checksum>, I<resource>,
+I<expect>, I<send>, I<mailserver>, I<every>, I<mode>, I<active>,
+I<passive>, I<manual>, I<depends>, I<host>, I<default>, I<http>,
+I<ftp>, I<smtp>, I<pop>, I<ntp3>, I<nntp>, I<imap>, I<clamav>, 
+I<ssh>, I<dwp>, I<ldap2>, I<ldap3>, I<tns>, I<request>, I<cpu>, 
+I<mem>, I<totalmem>, I<swap>, I<children>, I<loadavg>, I<timestamp>, 
+I<changed>, I<second(s)>, I<minute(s)>, I<hour(s)>, I<day(s)>, 
+I<space>, I<inode>, I<pid>, I<ppid>, I<perm(ission)>, I<icmp>,
+I<process>, I<file>, I<directory>, I<filesystem>, I<size>, I<action>,
+I<unmonitor>, I<rdate>, I<rsync>, I<data>, I<invalid>, I<exec>,
+I<nonexist>, I<policy>, I<reminder>, I<instance>, I<eventqueue>,
+I<basedir>, I<slot(s)>, I<system>, I<idfile>, I<gps>, I<radius>,
+I<secret>, I<target>, I<maxforward>, I<hostheader>, I<register>,
+I<credentials>, I<fips>, I<status>, I<uptime> and I<failed>
+
+And here is a complete list of B<noise keywords> ignored by
+monit:
+
+I<is>, I<as>, I<are>, I<on(ly)>, I<with(in|out)>, I<and>, I<has>,
+I<using>, I<use>, I<the>, I<sum>, I<program(s)>, I<than>, I<for>,
+I<usage>, I<was>, I<but>, I<of>.
+
+B<Note:> If the I<start> or I<stop> programs are shell scripts,
+then the script must begin with C<#!> and the remainder of the
+first line must specify an interpreter for the program. E.g.
+C<#!/bin/sh>
+
+It's possible to write scripts directly into the I<start> and
+I<stop> entries by using a string of shell-commands. Like so:
+
+ start="/bin/bash -c 'echo $$ > pidfile; exec program'"
+ stop="/bin/bash -c 'kill -s SIGTERM `cat pidfile`'"
+
+
+=head2 CONFIGURATION EXAMPLES
+
+The simplest form is just the check statement. In this example we
+check to see if the server is running and log a message if not:
+
+ check process resin with pidfile /usr/local/resin/srun.pid
+
+Checking process without pidfile:
+
+ check process pager matching "/sbin/dynamic_pager -F /private/var/vm/swapfile"
+
+To have Monit start the server if it's not running, add a start
+statement:
+
+ check process resin with pidfile /usr/local/resin/srun.pid
+       start program = "/usr/local/resin/bin/srun.sh start"
+       stop program = "/usr/local/resin/bin/srun.sh stop"
+
+Here's a more advanced example for monitoring an apache
+web-server listening on the default port number for HTTP and
+HTTPS. In this example Monit will restart apache if it's not
+accepting connections at the port numbers. The method Monit use
+for a process restart is to first execute the stop-program, wait
+up to 30s for the process to stop and then execute the start-program
+and wait up to 30s for it to start. The length of start or stop
+timeout can be overridden using the 'timeout' option. If Monit was
+unable to stop or start the service a failed alert message will
+be sent if you have requested alert messages to be sent.
+
+ check process apache with pidfile /var/run/httpd.pid
+       start program = "/etc/init.d/httpd start" with timeout 60 seconds
+       stop program  = "/etc/init.d/httpd stop"
+       if failed port 80 then restart
+       if failed port 443 with timeout 15 seconds then restart
+
+This example demonstrate how you can run a program as a specified
+user (uid) and with a specified group (gid). Many daemon programs
+will do the uid and gid switch by them self, but for those
+programs that does not (e.g. Java programs), monit's ability to
+start a program as a certain user can be very useful. In this
+example we start the Tomcat Java Servlet Engine as the standard
+I<nobody> user and group. Please note that Monit will only switch
+uid and gid for a program if the super-user is running monit,
+otherwise Monit will simply ignore the request to change uid and
+gid.
+
+ check process tomcat with pidfile /var/run/tomcat.pid
+       start program = "/etc/init.d/tomcat start" 
+             as uid nobody and gid nobody
+       stop program  = "/etc/init.d/tomcat stop"
+             # You can also use id numbers instead and write:
+             as uid 99 and with gid 99
+       if failed port 8080 then alert
+
+In this example we use udp for connection testing to check if the
+name-server is running and also use timeout and alert:
+
+ check process named with pidfile /var/run/named.pid
+       start program = "/etc/init.d/named start"
+       stop program  = "/etc/init.d/named stop"
+       if failed port 53 use type udp protocol dns then restart
+       if 3 restarts within 5 cycles then timeout
+
+The following example illustrates how to check if the service
+'sophie' is answering connections on its Unix domain socket:
+
+ check process sophie with pidfile /var/run/sophie.pid
+       start program = "/etc/init.d/sophie start"
+       stop  program = "/etc/init.d/sophie stop"
+       if failed unix /var/run/sophie then restart
+
+In this example we check an apache web-server running on
+localhost that answers for several IP-based virtual hosts or
+vhosts, hence the host statement before port:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start "/etc/init.d/httpd start"
+       stop  "/etc/init.d/httpd stop"
+       if failed host www.sol.no port 80 then alert
+       if failed host shop.sol.no port 443 then alert
+       if failed host chat.sol.no port 80 then alert
+       if failed host www.tildeslash.com port 80 then alert
+
+To make sure that Monit is communicating with a http server a
+protocol test can be added:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start "/etc/init.d/httpd start"
+       stop  "/etc/init.d/httpd stop"
+       if failed host www.sol.no port 80 
+          protocol HTTP
+          then alert 
+
+This example shows a different way to check a webserver using
+the send/expect mechanism:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start "/etc/init.d/httpd start"
+       stop  "/etc/init.d/httpd stop"
+       if failed host www.sol.no port 80 
+          send "GET / HTTP/1.0\r\nHost: www.sol.no\r\n\r\n"
+          expect "HTTP/[0-9\.]{3} 200 .*\r\n"
+          then alert 
+
+To make sure that Apache is logging successfully (i.e. no more 
+than 60 percent of child servers are logging), use its mod_status
+page at www.sol.no/server-status with this special protocol test:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start "/etc/init.d/httpd start"
+       stop  "/etc/init.d/httpd stop"
+       if failed host www.sol.no port 80
+       protocol apache-status loglimit > 60% then restart
+
+This configuration can be used to alert you if 25 percent or more
+of Apache child processes are stuck performing DNS lookups:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start "/etc/init.d/httpd start"
+       stop  "/etc/init.d/httpd stop"
+       if failed host www.sol.no port 80
+       protocol apache-status dnslimit > 25% then alert
+
+Here we use an icmp ping test to check if a remote host is up and
+if not send an alert:
+
+ check host www.tildeslash.com with address www.tildeslash.com
+       if failed icmp type echo count 5 with timeout 15 seconds
+          then alert
+
+In the following example we ask Monit to compute and verify the
+checksum for the underlying apache binary used by the start and
+stop programs. If the the checksum test should fail, monitoring
+will be disabled to prevent possibly starting a compromised
+binary:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start program = "/etc/init.d/httpd start"
+       stop program  = "/etc/init.d/httpd stop"
+       if failed host www.tildeslash.com port 80 then restart
+       depends on apache_bin
+
+ check file apache_bin with path /usr/local/apache/bin/httpd
+       if failed checksum then unmonitor
+
+In this example we ask Monit to test the checksum for a document
+on a remote server. If the checksum was changed we send an alert:
+
+ check host tildeslash with address www.tildeslash.com
+       if failed port 80 protocol http 
+          and request "/monit/dist/monit-4.0.tar.gz"
+              with checksum f9d26b8393736b5dfad837bb13780786
+       then alert
+
+Here are a couple of tests for some popular communication
+servers, using the SIP protocol. First we test a FreeSWITCH
+server and then an Asterisk server
+
+ check process freeswitch 
+    with pidfile /usr/local/freeswitch/log/freeswitch.pid
+  start program = “/usr/local/freeswitch/bin/freeswitch -nc -hp”
+  stop program = “/usr/local/freeswitch/bin/freeswitch -stop”
+  if totalmem > 1000.0 MB for 5 cycles then alert
+  if totalmem > 1500.0 MB for 5 cycles then alert
+  if totalmem > 2000.0 MB for 5 cycles then restart
+  if cpu > 60% for 5 cycles then alert
+  if failed port 5060 type udp protocol SIP 
+     target me@foo.bar and maxforward 10 
+  then restart
+  if 5 restarts within 5 cycles then timeout
+
+ check process asterisk 
+   with pidfile /var/run/asterisk/asterisk.pid
+   start program = “/usr/sbin/asterisk”
+   stop program = “/usr/sbin/asterisk -r -x ’shutdown now’”
+   if totalmem > 1000.0 MB for 5 cycles then alert
+   if totalmem > 1500.0 MB for 5 cycles then alert
+   if totalmem > 2000.0 MB for 5 cycles then restart
+   if cpu > 60% for 5 cycles then alert
+   if failed port 5060 type udp protocol SIP 
+     and target me@foo.bar maxforward 10 
+   then restart
+   if 5 restarts within 5 cycles then timeout
+
+Some servers are slow starters, like for example Java based
+Application Servers. So if we want to keep the poll-cycle low
+(i.e. < 60 seconds) but allow some services to take its time to
+start, the B<every> statement is handy:
+
+ check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
+       start program = "/etc/init.d/dynamo start"
+       stop program  = "/etc/init.d/dynamo stop"
+       if failed port 8840 then alert
+
+Here is an example where we group together two database entries
+so you can manage them together, e.g.; 'Monit -g database start
+all'. The mode statement is also illustrated in the first entry
+and have the effect that Monit will not try to (re)start this
+service if it is not running:
+
+ check process sybase with pidfile /var/run/sybase.pid
+       start = "/etc/init.d/sybase start"
+       stop  = "/etc/init.d/sybase stop"
+       mode passive
+       group database
+
+ check process oracle with pidfile /var/run/oracle.pid
+       start program = "/etc/init.d/oracle start"
+       stop program  = "/etc/init.d/oracle stop"
+       mode active # Not necessary really, since it's the default
+       if failed port 9001 then restart
+       group database
+
+Here is an example to show the usage of the resource checks. It
+will send an alert when the CPU usage of the http daemon and its
+child processes raises beyond 60% for over two cycles. Apache is
+restarted if the CPU usage is over 80% for five cycles or the
+memory usage over 100Mb for five cycles or if the machines load
+average is more than 10 for 8 cycles:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start program = "/etc/init.d/httpd start"
+       stop program  = "/etc/init.d/httpd stop"
+       if cpu > 40% for 2 cycles then alert
+       if totalcpu > 60% for 2 cycles then alert
+       if totalcpu > 80% for 5 cycles then restart
+       if mem > 100 MB for 5 cycles then stop
+       if loadavg(5min) greater than 10.0 for 8 cycles then stop
+
+This examples demonstrate the timestamp statement with exec and
+how you may restart apache if its configuration file was
+changed.
+
+ check file httpd.conf with path /etc/httpd/httpd.conf
+       if changed timestamp
+          then exec "/etc/init.d/httpd graceful"
+
+In this example we demonstrate usage of the extended alert
+statement and a file check dependency:
+
+ check process apache with pidfile /var/run/httpd.pid
+      start = "/etc/init.d/httpd start"
+      stop  = "/etc/init.d/httpd stop"
+      alert admin@bar on {nonexist, timeout} 
+        with mail-format { 
+              from:     bofh@$HOST
+              subject:  apache $EVENT - $ACTION
+              message:  This event occurred on $HOST at $DATE. 
+              Your faithful employee,
+              monit
+      }
+      if failed host www.tildeslash.com  port 80 then restart
+      if 3 restarts within 5 cycles then timeout
+      depend httpd_bin
+      group apache
+
+ check file httpd_bin with path /usr/local/apache/bin/httpd
+       alert security@bar on {checksum, timestamp, 
+                  permission, uid, gid}
+             with mail-format {subject: Alaaarrm! on $HOST}
+       if failed checksum 
+          and expect 8f7f419955cefa0b33a2ba316cba3659
+              then unmonitor
+       if failed permission 755 then unmonitor
+       if failed uid root then unmonitor
+       if failed gid root then unmonitor
+       if changed timestamp then alert
+       group apache
+
+
+In this example, we demonstrate usage of the depend statement. In
+this case, we want to start oracle and apache. However, we've set
+up apache to use oracle as a back end, and if oracle is
+restarted, apache must be restarted as well.
+
+ check process apache with pidfile /var/run/httpd.pid
+       start = "/etc/init.d/httpd start"
+       stop  = "/etc/init.d/httpd stop"
+       depends on oracle
+
+ check process oracle with pidfile /var/run/oracle.pid
+       start = "/etc/init.d/oracle start"
+       stop  = "/etc/init.d/oracle stop"
+       if failed port 9001 then restart
+
+Next, we have 2 services, oracle-import and oracle-export that
+need to be restarted if oracle is restarted, but are independent
+of each other.
+
+ check process oracle with pidfile /var/run/oracle.pid
+       start = "/etc/init.d/oracle start"
+       stop  = "/etc/init.d/oracle stop"
+       if failed port 9001 then restart
+
+ check process oracle-import 
+      with pidfile /var/run/oracle-import.pid
+       start = "/etc/init.d/oracle-import start"
+       stop  = "/etc/init.d/oracle-import stop"
+       depends on oracle
+
+ check process oracle-export 
+      with pidfile /var/run/oracle-export.pid
+       start = "/etc/init.d/oracle-export start"
+       stop  = "/etc/init.d/oracle-export stop"
+       depends on oracle
+
+
+Finally an example with all statements:
+
+ check process apache with pidfile /var/run/httpd.pid
+       start program = "/etc/init.d/httpd start"
+       stop program  = "/etc/init.d/httpd stop"
+       if 3 restarts within 5 cycles then timeout
+       if failed host www.sol.no  port 80 protocol http
+          and use the request "/login.cgi"
+              then alert
+       if failed host shop.sol.no port 443 type tcpssl 
+          protocol http and with timeout 15 seconds 
+              then restart
+       if cpu is greater than 60% for 2 cycles then alert
+       if cpu > 80% for 5 cycles then restart
+       if totalmem > 100 MB then stop
+       if children > 200 then alert
+       alert bofh@bar with mail-format {from: monit@foo.bar.no}
+       every 2 cycles
+       mode active
+       depends on weblogic
+       depends on httpd.pid
+       depends on httpd.conf
+       depends on httpd_bin
+       depends on datafs
+       group server
+
+ check file httpd.pid with path /usr/local/apache/logs/httpd.pid
+       group server
+       if timestamp > 7 days then restart
+       every 2 cycles
+       alert bofh@bar with mail-format {from: monit@foo.bar.no}
+       depends on datafs
+
+ check file httpd.conf with path /etc/httpd/httpd.conf
+       group server
+       if timestamp was changed 
+          then exec "/usr/local/apache/bin/apachectl graceful"
+       every 2 cycles
+       alert bofh@bar with mail-format {from: monit@foo.bar.no}
+       depends on datafs
+
+ check file httpd_bin with path /usr/local/apache/bin/httpd
+       group server
+       if failed checksum and expect the sum
+          8f7f419955cefa0b33a2ba316cba3659 then unmonitor
+       if failed permission 755 then unmonitor
+       if failed uid root then unmonitor
+       if failed gid root then unmonitor
+       if changed size then alert
+       if changed timestamp then alert
+       every 2 cycles
+       alert bofh@bar with mail-format {from: monit@foo.bar.no}
+       alert foo@bar on { checksum, size, timestamp, uid, gid } 
+       depends on datafs
+
+ check filesystem datafs with path /dev/sdb1
+       group server
+       start program  = "/bin/mount /data"
+       stop program  =  "/bin/umount /data"
+       if failed permission 660 then unmonitor
+       if failed uid root then unmonitor
+       if failed gid disk then unmonitor
+       if space usage > 80 % then alert
+       if space usage > 94 % then stop
+       if inode usage > 80 % then alert
+       if inode usage > 94 % then stop
+       alert root@localhost
+
+ check host ftp.redhat.com with address ftp.redhat.com
+       if failed icmp type echo with timeout 15 seconds
+          then alert 
+       if failed port 21 protocol ftp
+          then exec "/usr/X11R6/bin/xmessage -display
+                     :0 ftp connection failed"
+       alert foo@bar.com
+ 
+ check host www.gnu.org with address www.gnu.org
+       if failed port 80 protocol http 
+          and request "/pub/gnu/bash/bash-2.05b.tar.gz"
+              with checksum 8f7f419955cefa0b33a2ba316cba3659
+       then alert
+       alert rms@gnu.org with mail-format {
+            subject: The gnu server may be hacked again! }
+
+Note: only the B<check statement> is mandatory, the other
+statements are optional and the order of the optional statements
+is not important.
+
+
+=head1 FILES
+
+F<~/.monitrc>  
+   Default run control file
+
+F</etc/monitrc>
+   If the control file is not found in the default 
+   location and /etc contains a F<monitrc> file, this
+   file will be used instead.
+
+F<./monitrc>  
+   If the control file is not found in either of the
+   previous two locations, and the current working 
+   directory contains a F<monitrc> file, this file is 
+   used instead.
+
+
+F<~/.monit.pid>
+   Lock file to help prevent concurrent runs (non-root
+   mode).
+
+F</var/run/monit.pid>
+   Lock file to help prevent concurrent runs (root mode,
+   Linux systems).
+
+F</etc/monit.pid>
+   Lock file to help prevent concurrent runs (root mode,
+   systems without /var/run).
+
+F<~/.monit.state>  
+   Monit saves its state to this file and utilizes
+   information found in this file to recover from 
+   a crash. This is a binary file and its content is 
+   only of interest to monit. You may set the location
+   of this file in the Monit control file or by using 
+   the -s switch when Monit is started.
+
+F<~/.monit.id>  
+    Monit save its unique id to this file.
+
+
+=head1 ENVIRONMENT
+
+No environment variables are used by Monit. However, when Monit
+execute a script or a program Monit will set several environment
+variables which can be utilized by the executable. The following
+and I<only> the following environment variables are available:
+
+=over 4
+
+=item MONIT_EVENT
+
+The event that occurred on the service
+
+=item MONIT_DESCRIPTION
+
+A description of the error condition 
+
+=item MONIT_SERVICE
+
+The name of the service (from monitrc) on which the event
+occurred.
+
+=item MONIT_DATE
+
+The time and date (rfc 822 style) the event occurred
+
+=item MONIT_HOST
+
+The host the event occurred on
+
+=back 
+
+The following environment variables are only available for
+process service entries:
+
+=over 4
+
+=item MONIT_PROCESS_PID 
+
+The process pid. This may be 0 if the process was (re)started,
+
+=item MONIT_PROCESS_MEMORY 
+
+Process memory. This may be 0 if the process was (re)started,
+
+=item MONIT_PROCESS_CHILDREN 
+
+Process children. This may be 0 if the process was (re)started,
+
+=item MONIT_PROCESS_CPU_PERCENT 
+
+Process cpu%. This may be 0 if the process was (re)started,
+
+=back 
+
+In addition the following spartan PATH environment variable is
+available:
+
+=over 4
+
+=item PATH=/bin:/usr/bin:/sbin:/usr/sbin
+
+=back 
+
+Scripts or programs that depends on other environment variables
+or on a more verbose PATH must provide means to set these
+variables by them self.
+
+
+=head1 SIGNALS
+
+If a Monit daemon is running, SIGUSR1 wakes it up from its sleep
+phase and forces a poll of all services. SIGTERM and SIGINT will
+gracefully terminate a Monit daemon. The SIGTERM signal is sent
+to a Monit daemon if Monit is started with the I<quit> action
+argument.
+
+Sending a SIGHUP signal to a running Monit daemon will force
+the daemon to reinitialize itself, specifically it will reread
+configuration, close and reopen log files.
+
+Running Monit in foreground while a background Monit daemon is
+running will wake up the daemon.
+
+
+=head1 NOTES
+
+This is a very silent program. Use the -v switch if you want to
+see what Monit is doing, and tail -f the logfile. Optionally for
+testing purposes; you can start Monit with the -Iv switch. Monit
+will then print debug information to the console, to stop monit
+in this mode, simply press CTRL^C (i.e. SIGINT) in the same
+console.
+
+The syntax (and parser) of the control file was inspired by Eric
+S. Raymond et al. excellent fetchmail program. Some portions of
+this man page also receive inspiration from the same authors.
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2001-2012 by Tildeslash Ltd. All Rights Reserved.
+This product 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.
+
+
+=head1 SEE ALSO
+
+GNU text utilities; md5sum(1); sha1sum(1); openssl(1); glob(7);
+regex(7); I<http://www.mmonit.com/>
+
+
+=cut
+
diff --git a/monit-5.4/libmonit/COPYING b/monit-5.4/libmonit/COPYING
new file mode 100644
index 0000000..3b05126
--- /dev/null
+++ b/monit-5.4/libmonit/COPYING
@@ -0,0 +1,672 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, 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
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state 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 program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
+
+
+                        License Exception
+
+In addition, as special exceptions, The copyright holders give permission
+to link the code of portions of this program with the OpenSSL library under
+certain conditions as described in each individual source file, and
+distribute linked combinations including the two.
+
+You must obey the GNU General Public License in all respects for all of the
+code used other than OpenSSL.
diff --git a/monit-5.4/libmonit/Makefile b/monit-5.4/libmonit/Makefile
new file mode 100644
index 0000000..56f501f
--- /dev/null
+++ b/monit-5.4/libmonit/Makefile
@@ -0,0 +1,896 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+
+pkgdatadir = $(datadir)/libmonit
+pkgincludedir = $(includedir)/libmonit
+pkglibdir = $(libdir)/libmonit
+pkglibexecdir = $(libexecdir)/libmonit
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure \
+	$(top_srcdir)/src/xconfig.h.in COPYING config/config.guess \
+	config/config.sub config/install-sh config/ltmain.sh \
+	config/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/xconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libmonit_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libmonit_la_OBJECTS = src/Bootstrap.lo src/exceptions/assert.lo \
+	src/exceptions/Exception.lo src/io/Dir.lo src/io/File.lo \
+	src/io/InputStream.lo src/io/OutputStream.lo src/system/Mem.lo \
+	src/system/Net.lo src/system/Time.lo src/system/Command.lo \
+	src/system/System.lo src/util/List.lo src/util/Str.lo \
+	src/util/StringBuffer.lo src/thread/Thread.lo
+libmonit_la_OBJECTS = $(am_libmonit_la_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)/src
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libmonit_la_SOURCES)
+DIST_SOURCES = $(libmonit_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run aclocal-1.11
+AMTAR = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run tar
+AR = ar
+AUTOCONF = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run automake-1.11
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=none
+CFLAGS = -Wno-address -Wno-pointer-sign -g -O2 -D _REENTRANT -Wall -Wunused -Wno-unused-label -funsigned-char -D_GNU_SOURCE -std=c99
+CPP = gcc -E
+CPPFLAGS = 
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DSYMUTIL = 
+DUMPBIN = 
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /bin/grep -E
+EXEEXT = 
+FGREP = /bin/grep -F
+GREP = /bin/grep
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS = 
+LIBOBJS = 
+LIBS = -lpthread 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIPO = 
+LN_S = ln -s
+LTLIBOBJS = 
+MAKEINFO = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run makeinfo
+MKDIR_P = /bin/mkdir -p
+NM = /usr/bin/nm -B
+NMEDIT = 
+OBJDUMP = objdump
+OBJEXT = o
+OTOOL = 
+OTOOL64 = 
+PACKAGE = libmonit
+PACKAGE_BUGREPORT = monit-dev@tildeslash.com
+PACKAGE_NAME = libmonit
+PACKAGE_STRING = libmonit 1.0
+PACKAGE_TARNAME = libmonit
+PACKAGE_URL = 
+PACKAGE_VERSION = 1.0
+PATH_SEPARATOR = :
+RANLIB = ranlib
+SED = /bin/sed
+SET_MAKE = 
+SHELL = /bin/bash
+STRIP = strip
+VERSION = 1.0
+abs_builddir = /home/martinp/svn/monit/libmonit
+abs_srcdir = /home/martinp/svn/monit/libmonit
+abs_top_builddir = /home/martinp/svn/monit/libmonit
+abs_top_srcdir = /home/martinp/svn/monit/libmonit
+ac_ct_CC = gcc
+ac_ct_DUMPBIN = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias = 
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias = 
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/martinp/svn/monit/libmonit/config/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+lt_ECHO = echo
+mandir = ${datarootdir}/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target_alias = 
+top_build_prefix = 
+top_builddir = .
+top_srcdir = .
+AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = . test
+EXTRA_DIST = README COPYING bootstrap test src config
+AM_CPPFLAGS = $(CPPFLAGS) $(DBCPPFLAGS)
+INCLUDES = -I./src -I./src/exceptions -I./src/io -I./src/net -I./src/util -I./src/thread
+
+# libmonit is built static
+noinst_LTLIBRARIES = libmonit.la
+libmonit_la_SOURCES = \
+		  src/Bootstrap.c \
+                  src/exceptions/assert.c \
+                  src/exceptions/Exception.c \
+                  src/io/Dir.c \
+                  src/io/File.c \
+                  src/io/InputStream.c \
+                  src/io/OutputStream.c \
+                  src/system/Mem.c \
+                  src/system/Net.c \
+                  src/system/Time.c \
+                  src/system/Command.c \
+                  src/system/System.c \
+                  src/util/List.c \
+                  src/util/Str.c \
+                  src/util/StringBuffer.c \
+                  src/thread/Thread.c
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+src/xconfig.h: src/stamp-h1
+	@if test ! -f $@; then \
+	  rm -f src/stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; \
+	else :; fi
+
+src/stamp-h1: $(top_srcdir)/src/xconfig.h.in $(top_builddir)/config.status
+	@rm -f src/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/xconfig.h
+$(top_srcdir)/src/xconfig.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f src/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f src/xconfig.h src/stamp-h1
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/Bootstrap.lo: src/$(am__dirstamp)
+src/exceptions/$(am__dirstamp):
+	@$(MKDIR_P) src/exceptions
+	@: > src/exceptions/$(am__dirstamp)
+src/exceptions/assert.lo: src/exceptions/$(am__dirstamp)
+src/exceptions/Exception.lo: src/exceptions/$(am__dirstamp)
+src/io/$(am__dirstamp):
+	@$(MKDIR_P) src/io
+	@: > src/io/$(am__dirstamp)
+src/io/Dir.lo: src/io/$(am__dirstamp)
+src/io/File.lo: src/io/$(am__dirstamp)
+src/io/InputStream.lo: src/io/$(am__dirstamp)
+src/io/OutputStream.lo: src/io/$(am__dirstamp)
+src/system/$(am__dirstamp):
+	@$(MKDIR_P) src/system
+	@: > src/system/$(am__dirstamp)
+src/system/Mem.lo: src/system/$(am__dirstamp)
+src/system/Net.lo: src/system/$(am__dirstamp)
+src/system/Time.lo: src/system/$(am__dirstamp)
+src/system/Command.lo: src/system/$(am__dirstamp)
+src/system/System.lo: src/system/$(am__dirstamp)
+src/util/$(am__dirstamp):
+	@$(MKDIR_P) src/util
+	@: > src/util/$(am__dirstamp)
+src/util/List.lo: src/util/$(am__dirstamp)
+src/util/Str.lo: src/util/$(am__dirstamp)
+src/util/StringBuffer.lo: src/util/$(am__dirstamp)
+src/thread/$(am__dirstamp):
+	@$(MKDIR_P) src/thread
+	@: > src/thread/$(am__dirstamp)
+src/thread/Thread.lo: src/thread/$(am__dirstamp)
+libmonit.la: $(libmonit_la_OBJECTS) $(libmonit_la_DEPENDENCIES) 
+	$(LINK)  $(libmonit_la_OBJECTS) $(libmonit_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f src/Bootstrap.$(OBJEXT)
+	-rm -f src/Bootstrap.lo
+	-rm -f src/exceptions/Exception.$(OBJEXT)
+	-rm -f src/exceptions/Exception.lo
+	-rm -f src/exceptions/assert.$(OBJEXT)
+	-rm -f src/exceptions/assert.lo
+	-rm -f src/io/Dir.$(OBJEXT)
+	-rm -f src/io/Dir.lo
+	-rm -f src/io/File.$(OBJEXT)
+	-rm -f src/io/File.lo
+	-rm -f src/io/InputStream.$(OBJEXT)
+	-rm -f src/io/InputStream.lo
+	-rm -f src/io/OutputStream.$(OBJEXT)
+	-rm -f src/io/OutputStream.lo
+	-rm -f src/system/Command.$(OBJEXT)
+	-rm -f src/system/Command.lo
+	-rm -f src/system/Mem.$(OBJEXT)
+	-rm -f src/system/Mem.lo
+	-rm -f src/system/Net.$(OBJEXT)
+	-rm -f src/system/Net.lo
+	-rm -f src/system/System.$(OBJEXT)
+	-rm -f src/system/System.lo
+	-rm -f src/system/Time.$(OBJEXT)
+	-rm -f src/system/Time.lo
+	-rm -f src/thread/Thread.$(OBJEXT)
+	-rm -f src/thread/Thread.lo
+	-rm -f src/util/List.$(OBJEXT)
+	-rm -f src/util/List.lo
+	-rm -f src/util/Str.$(OBJEXT)
+	-rm -f src/util/Str.lo
+	-rm -f src/util/StringBuffer.$(OBJEXT)
+	-rm -f src/util/StringBuffer.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf src/.libs src/_libs
+	-rm -rf src/exceptions/.libs src/exceptions/_libs
+	-rm -rf src/io/.libs src/io/_libs
+	-rm -rf src/system/.libs src/system/_libs
+	-rm -rf src/thread/.libs src/thread/_libs
+	-rm -rf src/util/.libs src/util/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f src/$(am__dirstamp)
+	-rm -f src/exceptions/$(am__dirstamp)
+	-rm -f src/io/$(am__dirstamp)
+	-rm -f src/system/$(am__dirstamp)
+	-rm -f src/thread/$(am__dirstamp)
+	-rm -f src/util/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-local \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool clean-local clean-noinstLTLIBRARIES ctags \
+	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
+	dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \
+	distclean distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-local distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am
+
+
+dist-hook::
+	-rm -rf `find $(distdir) -name "._*"`
+	-rm -rf `find $(distdir) -name ".DS_Store"`
+	-rm -rf `find $(distdir) -name ".libs"`
+	-rm -rf `find $(distdir) -name ".svn"`
+	-rm -f $(distdir)/src/xconfig.h $(distdir)/src/stamp-* 
+
+clean-local:
+	-rm -f `find . -name "*.o" -o -name "*.lo" -o -name "*.loT" -o -name "*~"`
+
+distclean-local: 
+	-rm -rf autom4te.cache/ 
+
+cleanall: clean distclean
+	-rm -f Makefile.in test/Makefile.in src/Makefile.in configure aclocal.m4 src/xconfig.h.in  config/config.*
+	-rm -rf m4
+
+verify: libmonit.la
+	cd $(srcdir)/test && $(MAKE) verify	
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/monit-5.4/libmonit/Makefile.am b/monit-5.4/libmonit/Makefile.am
new file mode 100644
index 0000000..3da17a2
--- /dev/null
+++ b/monit-5.4/libmonit/Makefile.am
@@ -0,0 +1,53 @@
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
+ACLOCAL_AMFLAGS  = -I m4
+
+SUBDIRS         = . test
+
+EXTRA_DIST      = README COPYING bootstrap test src config
+
+AM_CPPFLAGS     = $(CPPFLAGS) $(DBCPPFLAGS)
+
+INCLUDES        = -I./src -I./src/exceptions -I./src/io -I./src/net -I./src/util -I./src/thread
+
+# libmonit is built static
+noinst_LTLIBRARIES = libmonit.la
+
+libmonit_la_SOURCES = \
+		  src/Bootstrap.c \
+                  src/exceptions/assert.c \
+                  src/exceptions/Exception.c \
+                  src/io/Dir.c \
+                  src/io/File.c \
+                  src/io/InputStream.c \
+                  src/io/OutputStream.c \
+                  src/system/Mem.c \
+                  src/system/Net.c \
+                  src/system/Time.c \
+                  src/system/Command.c \
+                  src/system/System.c \
+                  src/util/List.c \
+                  src/util/Str.c \
+                  src/util/StringBuffer.c \
+                  src/thread/Thread.c
+
+dist-hook::
+	-rm -rf `find $(distdir) -name "._*"`
+	-rm -rf `find $(distdir) -name ".DS_Store"`
+	-rm -rf `find $(distdir) -name ".libs"`
+	-rm -rf `find $(distdir) -name ".svn"`
+	-rm -f $(distdir)/src/xconfig.h $(distdir)/src/stamp-* 
+
+clean-local:
+	-rm -f `find . -name "*.o" -o -name "*.lo" -o -name "*.loT" -o -name "*~"`
+
+distclean-local: 
+	-rm -rf autom4te.cache/ 
+
+cleanall: clean distclean
+	-rm -f Makefile.in test/Makefile.in src/Makefile.in configure aclocal.m4 src/xconfig.h.in  config/config.*
+	-rm -rf m4
+
+verify: libmonit.la
+	cd $(srcdir)/test && $(MAKE) verify	
diff --git a/monit-5.4/libmonit/Makefile.in b/monit-5.4/libmonit/Makefile.in
new file mode 100644
index 0000000..6b585ea
--- /dev/null
+++ b/monit-5.4/libmonit/Makefile.in
@@ -0,0 +1,896 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure \
+	$(top_srcdir)/src/xconfig.h.in COPYING config/config.guess \
+	config/config.sub config/install-sh config/ltmain.sh \
+	config/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/xconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libmonit_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libmonit_la_OBJECTS = src/Bootstrap.lo src/exceptions/assert.lo \
+	src/exceptions/Exception.lo src/io/Dir.lo src/io/File.lo \
+	src/io/InputStream.lo src/io/OutputStream.lo src/system/Mem.lo \
+	src/system/Net.lo src/system/Time.lo src/system/Command.lo \
+	src/system/System.lo src/util/List.lo src/util/Str.lo \
+	src/util/StringBuffer.lo src/thread/Thread.lo
+libmonit_la_OBJECTS = $(am_libmonit_la_OBJECTS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libmonit_la_SOURCES)
+DIST_SOURCES = $(libmonit_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = . test
+EXTRA_DIST = README COPYING bootstrap test src config
+AM_CPPFLAGS = $(CPPFLAGS) $(DBCPPFLAGS)
+INCLUDES = -I./src -I./src/exceptions -I./src/io -I./src/net -I./src/util -I./src/thread
+
+# libmonit is built static
+noinst_LTLIBRARIES = libmonit.la
+libmonit_la_SOURCES = \
+		  src/Bootstrap.c \
+                  src/exceptions/assert.c \
+                  src/exceptions/Exception.c \
+                  src/io/Dir.c \
+                  src/io/File.c \
+                  src/io/InputStream.c \
+                  src/io/OutputStream.c \
+                  src/system/Mem.c \
+                  src/system/Net.c \
+                  src/system/Time.c \
+                  src/system/Command.c \
+                  src/system/System.c \
+                  src/util/List.c \
+                  src/util/Str.c \
+                  src/util/StringBuffer.c \
+                  src/thread/Thread.c
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+src/xconfig.h: src/stamp-h1
+	@if test ! -f $@; then \
+	  rm -f src/stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; \
+	else :; fi
+
+src/stamp-h1: $(top_srcdir)/src/xconfig.h.in $(top_builddir)/config.status
+	@rm -f src/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/xconfig.h
+$(top_srcdir)/src/xconfig.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f src/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f src/xconfig.h src/stamp-h1
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/Bootstrap.lo: src/$(am__dirstamp)
+src/exceptions/$(am__dirstamp):
+	@$(MKDIR_P) src/exceptions
+	@: > src/exceptions/$(am__dirstamp)
+src/exceptions/assert.lo: src/exceptions/$(am__dirstamp)
+src/exceptions/Exception.lo: src/exceptions/$(am__dirstamp)
+src/io/$(am__dirstamp):
+	@$(MKDIR_P) src/io
+	@: > src/io/$(am__dirstamp)
+src/io/Dir.lo: src/io/$(am__dirstamp)
+src/io/File.lo: src/io/$(am__dirstamp)
+src/io/InputStream.lo: src/io/$(am__dirstamp)
+src/io/OutputStream.lo: src/io/$(am__dirstamp)
+src/system/$(am__dirstamp):
+	@$(MKDIR_P) src/system
+	@: > src/system/$(am__dirstamp)
+src/system/Mem.lo: src/system/$(am__dirstamp)
+src/system/Net.lo: src/system/$(am__dirstamp)
+src/system/Time.lo: src/system/$(am__dirstamp)
+src/system/Command.lo: src/system/$(am__dirstamp)
+src/system/System.lo: src/system/$(am__dirstamp)
+src/util/$(am__dirstamp):
+	@$(MKDIR_P) src/util
+	@: > src/util/$(am__dirstamp)
+src/util/List.lo: src/util/$(am__dirstamp)
+src/util/Str.lo: src/util/$(am__dirstamp)
+src/util/StringBuffer.lo: src/util/$(am__dirstamp)
+src/thread/$(am__dirstamp):
+	@$(MKDIR_P) src/thread
+	@: > src/thread/$(am__dirstamp)
+src/thread/Thread.lo: src/thread/$(am__dirstamp)
+libmonit.la: $(libmonit_la_OBJECTS) $(libmonit_la_DEPENDENCIES) 
+	$(LINK)  $(libmonit_la_OBJECTS) $(libmonit_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f src/Bootstrap.$(OBJEXT)
+	-rm -f src/Bootstrap.lo
+	-rm -f src/exceptions/Exception.$(OBJEXT)
+	-rm -f src/exceptions/Exception.lo
+	-rm -f src/exceptions/assert.$(OBJEXT)
+	-rm -f src/exceptions/assert.lo
+	-rm -f src/io/Dir.$(OBJEXT)
+	-rm -f src/io/Dir.lo
+	-rm -f src/io/File.$(OBJEXT)
+	-rm -f src/io/File.lo
+	-rm -f src/io/InputStream.$(OBJEXT)
+	-rm -f src/io/InputStream.lo
+	-rm -f src/io/OutputStream.$(OBJEXT)
+	-rm -f src/io/OutputStream.lo
+	-rm -f src/system/Command.$(OBJEXT)
+	-rm -f src/system/Command.lo
+	-rm -f src/system/Mem.$(OBJEXT)
+	-rm -f src/system/Mem.lo
+	-rm -f src/system/Net.$(OBJEXT)
+	-rm -f src/system/Net.lo
+	-rm -f src/system/System.$(OBJEXT)
+	-rm -f src/system/System.lo
+	-rm -f src/system/Time.$(OBJEXT)
+	-rm -f src/system/Time.lo
+	-rm -f src/thread/Thread.$(OBJEXT)
+	-rm -f src/thread/Thread.lo
+	-rm -f src/util/List.$(OBJEXT)
+	-rm -f src/util/List.lo
+	-rm -f src/util/Str.$(OBJEXT)
+	-rm -f src/util/Str.lo
+	-rm -f src/util/StringBuffer.$(OBJEXT)
+	-rm -f src/util/StringBuffer.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf src/.libs src/_libs
+	-rm -rf src/exceptions/.libs src/exceptions/_libs
+	-rm -rf src/io/.libs src/io/_libs
+	-rm -rf src/system/.libs src/system/_libs
+	-rm -rf src/thread/.libs src/thread/_libs
+	-rm -rf src/util/.libs src/util/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f src/$(am__dirstamp)
+	-rm -f src/exceptions/$(am__dirstamp)
+	-rm -f src/io/$(am__dirstamp)
+	-rm -f src/system/$(am__dirstamp)
+	-rm -f src/thread/$(am__dirstamp)
+	-rm -f src/util/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-local \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool clean-local clean-noinstLTLIBRARIES ctags \
+	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
+	dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \
+	distclean distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-local distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am
+
+
+dist-hook::
+	-rm -rf `find $(distdir) -name "._*"`
+	-rm -rf `find $(distdir) -name ".DS_Store"`
+	-rm -rf `find $(distdir) -name ".libs"`
+	-rm -rf `find $(distdir) -name ".svn"`
+	-rm -f $(distdir)/src/xconfig.h $(distdir)/src/stamp-* 
+
+clean-local:
+	-rm -f `find . -name "*.o" -o -name "*.lo" -o -name "*.loT" -o -name "*~"`
+
+distclean-local: 
+	-rm -rf autom4te.cache/ 
+
+cleanall: clean distclean
+	-rm -f Makefile.in test/Makefile.in src/Makefile.in configure aclocal.m4 src/xconfig.h.in  config/config.*
+	-rm -rf m4
+
+verify: libmonit.la
+	cd $(srcdir)/test && $(MAKE) verify	
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/monit-5.4/libmonit/README b/monit-5.4/libmonit/README
new file mode 100644
index 0000000..6923903
--- /dev/null
+++ b/monit-5.4/libmonit/README
@@ -0,0 +1,19 @@
+
+libmonit:
+
+
+This library synthesis modules used by Monit into a static library. This
+factoring of functionality into a separate library represent the first step in
+our process of refactoring and improving Monit.
+
+What you see here now is only a small subset of the actual library and just
+the bare minimum for what is necessary to implement 'check program'.
+
+The long-term goal is to reduce the source code of Monit to basically a parser
+for the configuration language and a validator which will run the different
+checks. The rest of the code will be replaced with new libmonit code.
+
+Libmonit is built as part of Monit and is not meant to be installed nor
+distributed. The build system will link libmonit into the monit binary as a
+static library. PLEASE DO NOT USE OR DISTRIBUTE LIBMONIT AS A SEPARATE
+LIBRARY.
diff --git a/monit-5.4/libmonit/aclocal.m4 b/monit-5.4/libmonit/aclocal.m4
new file mode 100644
index 0000000..d411536
--- /dev/null
+++ b/monit-5.4/libmonit/aclocal.m4
@@ -0,0 +1,8929 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
+[m4_warning([this file was generated for autoconf 2.65.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
+
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
+
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
+
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# Generated from ltversion.in.
+
+# serial 3017 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6b])
+m4_define([LT_PACKAGE_REVISION], [1.3017])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6b'
+macro_revision='1.3017'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/monit-5.4/libmonit/bootstrap b/monit-5.4/libmonit/bootstrap
new file mode 100755
index 0000000..78bb055
--- /dev/null
+++ b/monit-5.4/libmonit/bootstrap
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Use this script to re-create configure. Requires the following auto-tools,
+# autoconf        >= 2.59
+# automake        >= 1.10
+# libtool         >= 1.4
+#!/bin/bash
+if (glibtoolize -f -c 2>/dev/null || libtoolize -f -c) && aclocal -I config && autoheader && automake --foreign --add-missing --copy && autoconf 
+then
+        echo "Success bootstrapping libmonit"
+else
+        echo "Failed bootstrapping libmonit"
+        exit 1;
+fi
+exit 0;
diff --git a/monit-5.4/libmonit/config/config.guess b/monit-5.4/libmonit/config/config.guess
new file mode 100755
index 0000000..e3a2116
--- /dev/null
+++ b/monit-5.4/libmonit/config/config.guess
@@ -0,0 +1,1533 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-06-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/monit-5.4/libmonit/config/config.sub b/monit-5.4/libmonit/config/config.sub
new file mode 100755
index 0000000..eb0389a
--- /dev/null
+++ b/monit-5.4/libmonit/config/config.sub
@@ -0,0 +1,1693 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-06-11'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+        -bluegene*)
+	        os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/monit-5.4/libmonit/config/install-sh b/monit-5.4/libmonit/config/install-sh
new file mode 100755
index 0000000..6781b98
--- /dev/null
+++ b/monit-5.4/libmonit/config/install-sh
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/monit-5.4/libmonit/config/ltmain.sh b/monit-5.4/libmonit/config/ltmain.sh
new file mode 100755
index 0000000..7ed280b
--- /dev/null
+++ b/monit-5.4/libmonit/config/ltmain.sh
@@ -0,0 +1,8413 @@
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6b
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#     --config             show all configuration variables
+#     --debug              enable verbose shell tracing
+# -n, --dry-run            display commands without modifying any files
+#     --features           display basic configuration information and exit
+#     --mode=MODE          use operation mode MODE
+#     --preserve-dup-deps  don't remove duplicate dependency libraries
+#     --quiet, --silent    don't print informational messages
+#     --tag=TAG            use configuration variables from tag TAG
+# -v, --verbose            print informational messages (default)
+#     --version            print version information
+# -h, --help               print short or long help message
+#
+# MODE must be one of the following:
+#
+#       clean              remove files from the build directory
+#       compile            compile a source file into a libtool object
+#       execute            automatically set library path, then run a program
+#       finish             complete the installation of libtool libraries
+#       install            install libraries or executables
+#       link               create a library or an executable
+#       uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#       host-triplet:	$host
+#       shell:		$SHELL
+#       compiler:		$LTCC
+#       compiler flags:		$LTCFLAGS
+#       linker:		$LD (gnu? $with_gnu_ld)
+#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1
+#       automake:		$automake_version
+#       autoconf:		$autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="2.2.6b Debian-2.2.6b-2ubuntu1"
+TIMESTAMP=""
+package_revision=1.3017
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/bin/sed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+  -*) progname=./$progname ;;
+esac
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "X$my_tmpdir" | $Xsed
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "X$1" | $Xsed \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/# -h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    $ECHO
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell, and then maybe $ECHO will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    $ECHO "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $ECHO "enable shared libraries"
+    else
+      $ECHO "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $ECHO "enable static libraries"
+    else
+      $ECHO "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
+
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
+    ;;
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
+    ;;
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
+    ;;
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
+    ;;
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
+    ;;
+  esac
+
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+      --config)		func_config					;;
+
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
+
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
+
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
+
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
+  fi
+
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval std_shrext=\"$shrext_cmds\"
+
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
+
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
+
+    $ECHO
+    $ECHO "Try \`$progname --help' for more information about other modes."
+
+    exit $?
+}
+
+  # Now that we've collected a possible --mode arg, show help if necessary
+  $opt_help && func_mode_help
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	$ECHO "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    $ECHO "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    $ECHO
+    $ECHO "If you ever happen to want to link against installed libraries"
+    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
+    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $ECHO "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $ECHO "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $ECHO "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $ECHO
+
+    $ECHO "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	$ECHO "pages."
+	;;
+      *)
+        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+}
+
+test "$mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    eval '$ECHO ": $name " >> "$nlist"'
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+	func_emit_wrapper_part1_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part1_arg1=$1
+	fi
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    ECHO=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$ECHO works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$ECHO will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$ECHO "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+"
+}
+# end: func_emit_wrapper_part1
+
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
+
+	$ECHO "\
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
+	fi
+
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
+
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
+
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
+
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
+	  return 0;
+	}
+    }
+
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
+
+  p = strchr (arg, (int)'=');
+
+  if (!p)
+    return 1;
+
+  *value = xstrdup (++p);
+
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
+
+  return 0;
+}
+
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
+
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		$ECHO
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
+		$ECHO "*** that it is just a static archive that I should not use here."
+	      else
+		$ECHO
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_duplicate_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+		esac
+	      fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    $ECHO
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  $ECHO
+			  $ECHO "*** And there doesn't seem to be a static archive available"
+			  $ECHO "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $ECHO
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** I have the capability to make that library automatically link in when"
+	    $ECHO "*** you link to this library.  But I can only do this if you have a"
+	    $ECHO "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $ECHO "*** But as you try to build a module library, libtool will still create "
+	      $ECHO "*** a static module, that should work as long as the dlopening application"
+	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$ECHO
+		$ECHO "*** However, this would only work if libtool was able to extract symbol"
+		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$ECHO "*** not find such a program.  So, this module is probably useless."
+		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  $ECHO
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $ECHO
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    $ECHO "*** I have the capability to make that library automatically link in when"
+		    $ECHO "*** you link to this library.  But I can only do this if you have a"
+		    $ECHO "*** shared version of the library, which I believe you do not have"
+		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $ECHO
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      $ECHO "*** I have the capability to make that library automatically link in when"
+		      $ECHO "*** you link to this library.  But I can only do this if you have a"
+		      $ECHO "*** shared version of the library, which you do not appear to have"
+		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
+		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $ECHO
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $ECHO "*** make it link in!  You will probably need to install it or some"
+		  $ECHO "*** library that it depends on before this library will be fully"
+		  $ECHO "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+	    done
+	  fi
+	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
+	     $GREP . >/dev/null; then
+	    $ECHO
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $ECHO "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $ECHO
+	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $ECHO "*** a static module, that should work as long as the dlopening"
+	    $ECHO "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $ECHO
+	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
+	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $ECHO "*** not find such a program.  So, this module is probably useless."
+	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
+	    $ECHO "*** automatically added whenever a program is linked with this library"
+	    $ECHO "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $ECHO
+	      $ECHO "*** Since this library must not contain undefined symbols,"
+	      $ECHO "*** because either the platform does not support them or"
+	      $ECHO "*** it was explicitly requested with -no-undefined,"
+	      $ECHO "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    $ECHO 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    $ECHO ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=$obj
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles="$delfiles $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $ECHO for shipping.
+      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $ECHO "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/monit-5.4/libmonit/config/missing b/monit-5.4/libmonit/config/missing
new file mode 100644
index 0000000..28055d2
--- /dev/null
+++ b/monit-5.4/libmonit/config/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/monit-5.4/libmonit/configure b/monit-5.4/libmonit/configure
new file mode 100755
index 0000000..21b3e34
--- /dev/null
+++ b/monit-5.4/libmonit/configure
@@ -0,0 +1,13723 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.65 for libmonit 1.0.
+#
+# Report bugs to <monit-dev@tildeslash.com>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: monit-dev@tildeslash.com about your system, including
+$0: any error possibly output before this message. Then
+$0: install a modern shell, or manually run the script
+$0: under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+$*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "$0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='libmonit'
+PACKAGE_TARNAME='libmonit'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='libmonit 1.0'
+PACKAGE_BUGREPORT='monit-dev@tildeslash.com'
+PACKAGE_URL=''
+
+ac_unique_file="src"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+lt_ECHO
+RANLIB
+AR
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+enable_optimized
+enable_profiling
+enable_openssl
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information."
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures libmonit 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/libmonit]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of libmonit 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-optimized      Build software optimized
+  --enable-profiling      Build with debug and profiling options
+  --enable-openssl(=<path>)
+                          Link Monit with openssl. An optional path argument
+                          may be given to specify the top-level directory to
+                          search for openssl to link with
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <monit-dev@tildeslash.com>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+libmonit configure 1.0
+generated by GNU Autoconf 2.65
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( cat <<\_ASBOX
+## --------------------------------------- ##
+## Report this to monit-dev@tildeslash.com ##
+## --------------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_mongrel
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by libmonit $as_me 1.0, which was
+generated by GNU Autoconf 2.65.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_aux_dir=
+for ac_dir in config "$srcdir"/config; do
+  for ac_t in install-sh install.sh shtool; do
+    if test -f "$ac_dir/$ac_t"; then
+      ac_aux_dir=$ac_dir
+      ac_install_sh="$ac_aux_dir/$ac_t -c"
+      break 2
+    fi
+  done
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='libmonit'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# Programs
+# ---------------------------------------------------------------------------
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "no acceptable C compiler found in \$PATH
+See \`config.log' for more details." "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "C compiler cannot create executables
+See \`config.log' for more details." "$LINENO" 5; }; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+# ---------------------------------------------------------------------------
+# Libtool
+# ---------------------------------------------------------------------------
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.2.6b'
+macro_revision='1.3017'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if test "${ac_cv_path_SED+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test "${lt_cv_path_NM+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:4485: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:4488: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:4491: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 5697 "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if test "${lt_cv_objdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7223: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7227: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+
+
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7562: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7566: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7667: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:7671: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7722: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:7726: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  whole_archive_flag_spec=''
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo(void) {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
+$as_echo "$archive_cmds_need_lc" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 10106 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 10202 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# ---------------------------------------------------------------------------
+# Build options
+# ---------------------------------------------------------------------------
+
+# Check whether --enable-optimized was given.
+if test "${enable_optimized+set}" = set; then :
+  enableval=$enable_optimized;
+        CFLAGS=`echo $CFLAGS|sed 's/-O.//'`
+        if test "x$enableval" = "xyes" ; then
+   	    	CFLAGS=`echo $CFLAGS|sed 's/-g//'`
+		CFLAGS="$CFLAGS -O3"
+		OPTIMIZED=1
+	else
+		OPTIMIZED=0
+        fi
+
+else
+
+	OPTIMIZED=0
+
+
+fi
+
+
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then :
+  enableval=$enable_profiling;
+        if test "x$enableval" = "xyes" ; then
+                CFLAGS="$CFLAGS -g -pg"
+                profile="true"
+        fi
+
+else
+
+        profile="false"
+
+
+fi
+
+
+# Check whether --enable-openssl was given.
+if test "${enable_openssl+set}" = set; then :
+  enableval=$enable_openssl;
+        openssl="true"
+        if test "x$enableval" = "xyes"; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_library_init in -lssl" >&5
+$as_echo_n "checking for SSL_library_init in -lssl... " >&6; }
+if test "${ac_cv_lib_ssl_SSL_library_init+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lssl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SSL_library_init ();
+int
+main ()
+{
+return SSL_library_init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ssl_SSL_library_init=yes
+else
+  ac_cv_lib_ssl_SSL_library_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_library_init" >&5
+$as_echo "$ac_cv_lib_ssl_SSL_library_init" >&6; }
+if test "x$ac_cv_lib_ssl_SSL_library_init" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSSL 1
+_ACEOF
+
+  LIBS="-lssl $LIBS"
+
+else
+  as_fn_error "libssl not found" "$LINENO" 5
+fi
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHA1_Init in -lcrypto" >&5
+$as_echo_n "checking for SHA1_Init in -lcrypto... " >&6; }
+if test "${ac_cv_lib_crypto_SHA1_Init+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SHA1_Init ();
+int
+main ()
+{
+return SHA1_Init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_crypto_SHA1_Init=yes
+else
+  ac_cv_lib_crypto_SHA1_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SHA1_Init" >&5
+$as_echo "$ac_cv_lib_crypto_SHA1_Init" >&6; }
+if test "x$ac_cv_lib_crypto_SHA1_Init" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPTO 1
+_ACEOF
+
+  LIBS="-lcrypto $LIBS"
+
+else
+  as_fn_error "libcrypto not found" "$LINENO" 5
+fi
+
+	else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl in $enableval" >&5
+$as_echo_n "checking for openssl in $enableval... " >&6; }
+                LDFLAGS="-L$enableval/lib -lssl -lcrypto $LDFLAGS "
+                CPPFLAGS="-I$enableval/include $CPPFLAGS"
+                if test -r "$enableval/lib/libssl.a" -a -r "$enableval/lib/libcrypto.a"; then
+                        { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+                else
+                       as_fn_error "openssl not found in $enableval" "$LINENO" 5
+                fi
+        fi
+
+else
+  openssl="false"
+fi
+
+
+# ---------------------------------------------------------------------------
+# Libraries
+# ---------------------------------------------------------------------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
+if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_create ();
+int
+main ()
+{
+return pthread_create ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pthread_pthread_create=yes
+else
+  ac_cv_lib_pthread_pthread_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+else
+  as_fn_error "POSIX thread library is required" "$LINENO" 5
+fi
+
+
+# ---------------------------------------------------------------------------
+# Header files
+# ---------------------------------------------------------------------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+for ac_header in ctype.h errno.h fcntl.h limits.h pthread.h setjmp.h \
+                  signal.h stdarg.h stdio.h string.h string.h strings.h \
+                  sys/socket.h sys/time.h sys/types.h unistd.h execinfo.h \
+                  sys/sendfile.h sys/dirent.h poll.h sys/poll.h sys/event.h \
+                  stropts.h sys/ioctl.h sys/filio.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# ------------------------------------------------------------------------
+# Functions
+# ------------------------------------------------------------------------
+
+# Require a working setjmp
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking setjmp is available" >&5
+$as_echo_n "checking setjmp is available... " >&6; }
+if test "${libmonit_cv_setjmp_available+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  as_fn_error "cross-compiling: please set 'libmonit_cv_setjmp_available=yes|no'" "$LINENO" 5
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <setjmp.h>
+int
+main ()
+{
+jmp_buf env; setjmp(env);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "setjmp is required
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libmonit_cv_setjmp_available" >&5
+$as_echo "$libmonit_cv_setjmp_available" >&6; }
+
+# Require that we have vsnprintf that conforms to c99. I.e. does bounds check
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking vsnprintf is c99 conformant" >&5
+$as_echo_n "checking vsnprintf is c99 conformant... " >&6; }
+if test "${libmonit_cv_vsnprintf_c99_conformant+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  as_fn_error "cross-compiling: please set 'libmonit_cv_vsnprintf_c99_conformant=yes|no'" "$LINENO" 5
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+                          #include <stdio.h>
+int
+main ()
+{
+char t[1]; va_list ap; int n = vsnprintf(t, 1, "hello", ap); if(n == 5) return 0;return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "vsnprintf does not conform to c99
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libmonit_cv_vsnprintf_c99_conformant" >&5
+$as_echo "$libmonit_cv_vsnprintf_c99_conformant" >&6; }
+
+
+# ------------------------------------------------------------------------
+# Architecture/OS
+# ------------------------------------------------------------------------
+
+architecture=`uname`
+if test "$architecture" = "Linux"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+
+$as_echo "#define LINUX 1" >>confdefs.h
+
+elif test "$architecture" = "FreeBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+
+$as_echo "#define FREEBSD 1" >>confdefs.h
+
+elif test "$architecture" = "GNU/kFreeBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+
+$as_echo "#define FREEBSD 1" >>confdefs.h
+
+elif test "$architecture" = "OpenBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+
+$as_echo "#define OPENBSD 1" >>confdefs.h
+
+elif test "$architecture" = "Darwin"
+then
+   CFLAGS="$CFLAGS -DREENTRANT"
+
+$as_echo "#define DARWIN 1" >>confdefs.h
+
+elif test "$architecture" = "SunOS"
+then
+   LIBS="$LIBS -lsocket -lnsl"
+   CFLAGS="$CFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -m64"
+   LDFLAGS="$LDFLAGS -m64"
+   if test `uname -m` != "i86pc"
+   then
+       CFLAGS="$CFLAGS -mtune=v9"
+       LDFLAGS="$LDFLAGS -mtune=v9"
+   fi
+
+$as_echo "#define SOLARIS 1" >>confdefs.h
+
+elif test "$architecture" = "HP-UX"
+then
+   CFLAGS="$CFLAGS -D_REENTRANT"
+
+$as_echo "#define HPUX 1" >>confdefs.h
+
+elif test "$architecture" = "NetBSD"
+then
+   CFLAGS="$CFLAGS -D_REENTRANT"
+
+$as_echo "#define NETBSD 1" >>confdefs.h
+
+elif test "$architecture" = "AIX"
+then
+   CFLAGS="$CFLAGS -D_THREAD_SAFE -D_REENTRANT"
+
+$as_echo "#define AIX 1" >>confdefs.h
+
+else
+   as_fn_error "Architecture not supported: ${architecture}" "$LINENO" 5
+fi
+
+# ---------------------------------------------------------------------------
+# Compiler
+# ---------------------------------------------------------------------------
+
+# Compiler characteristics
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if test "${ac_cv_c_const+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if test "${ac_cv_c_bigendian+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+# If the compiler is gcc, tune warnings and make the char type unsigned
+# and enable C99 support
+if test "x$GCC" = "xyes"; then
+	CFLAGS="$CFLAGS -Wall -Wunused -Wno-unused-label -funsigned-char";
+        # Add C99 support
+        CFLAGS="$CFLAGS -D_GNU_SOURCE -std=c99"
+        # does this compiler support -Wno-pointer-sign ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-pointer-sign $CFLAGS"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$svd_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        # does this compiler support -Wno-address ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-address $CFLAGS"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$svd_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+# ------------------------------------------------------------------------
+# Atomic support
+# ------------------------------------------------------------------------
+# AC_MSG_CHECKING(for Atomic support)
+# if test `uname` = "Darwin" -o `uname` = "FreeBSD"
+# then
+#         AC_MSG_RESULT(yes)
+# elif test `uname` = "SunOS"
+# then
+#         AC_CHECK_HEADER([atomic.h],
+#         [AC_MSG_RESULT(yes)],
+#         [AC_MSG_ERROR([atomic.h is required for atomic support])])
+# else
+#         AC_RUN_IFELSE([AC_LANG_PROGRAM([],[
+#              #if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)))
+#              return 0;
+#              #else
+#              return 1;
+#              #endif
+# 	])],
+# 	[AC_MSG_RESULT(yes)],
+# 	[AC_MSG_FAILURE([GCC version > 4.1 is required for atomic support])])
+# fi
+
+
+# ------------------------------------------------------------------------
+# IPv6 Support
+# ------------------------------------------------------------------------
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 support" >&5
+$as_echo_n "checking for IPv6 support... " >&6; }
+if test "${ac_cv_ipv6+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_ipv6=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include <sys/types.h>
+	#include <sys/socket.h>
+	#include <netinet/in.h>
+	/* Make sure the definitions for AF_INET6 and struct sockaddr_in6
+	 * are defined, and that we can actually create an IPv6 TCP socket.*/
+	main()
+	{
+		int fd;
+		struct sockaddr_in6 foo;
+		fd = socket(AF_INET6, SOCK_STREAM, 0);
+		exit(fd >= 0 ? 0 : 1);
+	}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_ipv6=yes
+else
+  ac_cv_ipv6=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ipv6" >&5
+$as_echo "$ac_cv_ipv6" >&6; }
+if test $ac_cv_ipv6 = yes ; then
+
+$as_echo "#define IPV6 1" >>confdefs.h
+
+fi
+
+# ---------------------------------------------------------------------------
+# Functions
+# ---------------------------------------------------------------------------
+
+
+# ---------------------------------------------------------------------------
+# Outputs
+# ---------------------------------------------------------------------------
+
+ac_config_headers="$ac_config_headers src/xconfig.h"
+
+ac_config_files="$ac_config_files Makefile test/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by libmonit $as_me 1.0, which was
+generated by GNU Autoconf 2.65.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <monit-dev@tildeslash.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+libmonit config.status 1.0
+configured by $0, generated by GNU Autoconf 2.65,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
+enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
+host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
+host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
+host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
+build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
+build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
+build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
+SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
+Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
+GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
+EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
+FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
+LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
+NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
+LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
+exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
+AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
+compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
+GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
+SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
+ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
+need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
+LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
+libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
+need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
+version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
+striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+SHELL \
+ECHO \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
+  ;;
+esac
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "src/xconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS src/xconfig.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+
+  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+	|| as_fn_error "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that does not interpret backslashes.
+ECHO=$lt_ECHO
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
+    ;;
+  esac
+
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit $?
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+cat <<EOT
++------------------------------------------------------------+
+| License:                                                   |
+| This is Open Source Software and use is subject to the GNU |
+| AFFERO GENERAL PUBLIC LICENSE version 3, available in this |
+| distribution in the file COPYING.                          |
+|                                                            |
+| By continuing this installation process, you are bound by  |
+| the terms of this license agreement. If you do not agree   |
+| with the terms of this license, you must abort the         |
+| installation process at this point.                        |
++------------------------------------------------------------+
+| Libmonit is configured as follows:                         |
+|                                                            |
+EOT
+
+if test "x1" = "x$OPTIMIZED"; then
+echo "|   Optimized:                                    ENABLED    |"
+else
+echo "|   Optimized:                                    DISABLED   |"
+fi
+if test "xfalse" = "x$profile"; then
+echo "|   Profiling:                                    DISABLED   |"
+else
+echo "|   Profiling:                                    ENABLED    |"
+fi
+if test "xtrue" = "x$openssl"; then
+echo "|   Openssl:                                      ENABLED    |"
+fi
+echo "+------------------------------------------------------------+"
+
+
diff --git a/monit-5.4/libmonit/configure.ac b/monit-5.4/libmonit/configure.ac
new file mode 100644
index 0000000..6da0206
--- /dev/null
+++ b/monit-5.4/libmonit/configure.ac
@@ -0,0 +1,297 @@
+# Copyright (C) Tildeslash Ltd. All rights reserved.
+
+AC_PREREQ([2.53])
+
+AC_INIT([libmonit], [1.0], [monit-dev@tildeslash.com])
+AC_CONFIG_AUX_DIR(config)
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE
+AC_CONFIG_SRCDIR([src])
+
+# ---------------------------------------------------------------------------
+# Programs 
+# ---------------------------------------------------------------------------
+
+AC_PROG_CC
+
+# ---------------------------------------------------------------------------
+# Libtool 
+# ---------------------------------------------------------------------------
+
+AC_PROG_LIBTOOL
+
+# ---------------------------------------------------------------------------
+# Build options
+# ---------------------------------------------------------------------------
+
+AC_ARG_ENABLE(optimized,
+	AS_HELP_STRING([--enable-optimized], 
+        	[Build software optimized]),
+    [
+        CFLAGS=`echo $CFLAGS|sed 's/-O.//'`
+        if test "x$enableval" = "xyes" ; then
+   	    	CFLAGS=`echo $CFLAGS|sed 's/-g//'`
+		CFLAGS="$CFLAGS -O3"
+		OPTIMIZED=1
+	else
+		OPTIMIZED=0
+        fi
+    ],
+    [
+	OPTIMIZED=0
+    ]
+)
+
+AC_ARG_ENABLE(profiling,
+        AS_HELP_STRING([--enable-profiling],
+                [Build with debug and profiling options]),
+    [
+        if test "x$enableval" = "xyes" ; then
+                CFLAGS="$CFLAGS -g -pg"
+                profile="true"
+        fi
+    ],
+    [
+        profile="false"
+    ]
+)
+
+AC_ARG_ENABLE([openssl],
+        AS_HELP_STRING([--enable-openssl(=<path>)], 
+                [Link Monit with openssl. An optional path argument may
+                be given to specify the top-level directory to search for
+                openssl to link with]),
+     [
+        openssl="true"
+        if test "x$enableval" = "xyes"; then
+		AC_CHECK_LIB([ssl], [SSL_library_init], [], [AC_MSG_ERROR([libssl not found])])
+		AC_CHECK_LIB([crypto], [SHA1_Init], [], [AC_MSG_ERROR([libcrypto not found])])
+	else
+                AC_MSG_CHECKING([for openssl in $enableval])
+                LDFLAGS="-L$enableval/lib -lssl -lcrypto $LDFLAGS "
+                CPPFLAGS="-I$enableval/include $CPPFLAGS"
+                if test -r "$enableval/lib/libssl.a" -a -r "$enableval/lib/libcrypto.a"; then
+                        AC_MSG_RESULT([ok])
+                else
+                       AC_MSG_ERROR([openssl not found in $enableval])
+                fi
+        fi
+     ],[openssl="false"])
+
+# ---------------------------------------------------------------------------
+# Libraries 
+# ---------------------------------------------------------------------------
+
+AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([POSIX thread library is required])])
+
+# ---------------------------------------------------------------------------
+# Header files 
+# ---------------------------------------------------------------------------
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS([ctype.h errno.h fcntl.h limits.h pthread.h setjmp.h \
+                  signal.h stdarg.h stdio.h string.h string.h strings.h \
+                  sys/socket.h sys/time.h sys/types.h unistd.h execinfo.h \
+                  sys/sendfile.h sys/dirent.h poll.h sys/poll.h sys/event.h \
+                  stropts.h sys/ioctl.h sys/filio.h])
+
+# ------------------------------------------------------------------------
+# Functions 
+# ------------------------------------------------------------------------
+
+# Require a working setjmp
+AC_CACHE_CHECK([setjmp is available],
+               [libmonit_cv_setjmp_available],
+               [AC_RUN_IFELSE([AC_LANG_PROGRAM(
+                       [[#include <setjmp.h>]],
+                       [[jmp_buf env; setjmp(env);]])],
+                       [AC_MSG_RESULT(yes)],
+                       [AC_MSG_FAILURE([setjmp is required])],
+                       [AC_MSG_ERROR(cross-compiling: please set 'libmonit_cv_setjmp_available=[yes|no]')])])
+
+# Require that we have vsnprintf that conforms to c99. I.e. does bounds check
+AC_CACHE_CHECK([vsnprintf is c99 conformant],
+               [libmonit_cv_vsnprintf_c99_conformant],
+               [AC_RUN_IFELSE([AC_LANG_PROGRAM(
+                        [[#include <stdarg.h>
+                          #include <stdio.h>]],
+                        [[char t[1]; va_list ap; int n = vsnprintf(t, 1, "hello", ap); if(n == 5) return 0;return 1;]])],
+                        [AC_MSG_RESULT(yes)],
+                        [AC_MSG_FAILURE([vsnprintf does not conform to c99])],
+                        [AC_MSG_ERROR(cross-compiling: please set 'libmonit_cv_vsnprintf_c99_conformant=[yes|no]')])])
+
+
+# ------------------------------------------------------------------------
+# Architecture/OS
+# ------------------------------------------------------------------------
+
+architecture=`uname`
+if test "$architecture" = "Linux"  
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   AC_DEFINE([LINUX], 1, [Define to 1 if the system is Linux])
+elif test "$architecture" = "FreeBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   AC_DEFINE([FREEBSD], 1, [Define to 1 if the system is FreeBSD])
+elif test "$architecture" = "GNU/kFreeBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   AC_DEFINE([FREEBSD], 1, [Define to 1 if the system is FreeBSD])
+elif test "$architecture" = "OpenBSD"
+then
+   CFLAGS="$CFLAGS -D _REENTRANT"
+   AC_DEFINE([OPENBSD], 1, [Define to 1 if the system is OpenBSD])
+elif test "$architecture" = "Darwin"
+then
+   CFLAGS="$CFLAGS -DREENTRANT"
+   AC_DEFINE([DARWIN], 1, [Define to 1 if the system is OSX])
+elif test "$architecture" = "SunOS"
+then
+   LIBS="$LIBS -lsocket -lnsl"
+   CFLAGS="$CFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -m64"
+   LDFLAGS="$LDFLAGS -m64"
+   if test `uname -m` != "i86pc"
+   then
+       CFLAGS="$CFLAGS -mtune=v9"
+       LDFLAGS="$LDFLAGS -mtune=v9"
+   fi
+   AC_DEFINE([SOLARIS], 1, [Define to 1 if the system is SOLARIS])
+elif test "$architecture" = "HP-UX"
+then
+   CFLAGS="$CFLAGS -D_REENTRANT"
+   AC_DEFINE([HPUX], 1, [Define to 1 if the system is HPUX])
+elif test "$architecture" = "NetBSD"
+then
+   CFLAGS="$CFLAGS -D_REENTRANT"
+   AC_DEFINE([NETBSD], 1, [Define to 1 if the system is NETBSD])
+elif test "$architecture" = "AIX"
+then
+   CFLAGS="$CFLAGS -D_THREAD_SAFE -D_REENTRANT"
+   AC_DEFINE([AIX], 1, [Define to 1 if the system is AIX])
+else
+   AC_MSG_ERROR([Architecture not supported: ${architecture}])
+fi
+
+# ---------------------------------------------------------------------------
+# Compiler 
+# ---------------------------------------------------------------------------
+
+# Compiler characteristics
+AC_C_CONST
+AC_C_BIGENDIAN
+
+# If the compiler is gcc, tune warnings and make the char type unsigned 
+# and enable C99 support
+if test "x$GCC" = "xyes"; then
+	CFLAGS="$CFLAGS -Wall -Wunused -Wno-unused-label -funsigned-char";
+        # Add C99 support
+        CFLAGS="$CFLAGS -D_GNU_SOURCE -std=c99"
+        # does this compiler support -Wno-pointer-sign ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-pointer-sign $CFLAGS"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])        
+        # does this compiler support -Wno-address ?
+        svd_CFLAGS="$CFLAGS"
+        CFLAGS="-Wno-address $CFLAGS"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [], [CFLAGS="$svd_CFLAGS"])
+fi
+
+
+# ------------------------------------------------------------------------
+# Atomic support
+# ------------------------------------------------------------------------
+# AC_MSG_CHECKING(for Atomic support)
+# if test `uname` = "Darwin" -o `uname` = "FreeBSD" 
+# then
+#         AC_MSG_RESULT(yes)
+# elif test `uname` = "SunOS"
+# then
+#         AC_CHECK_HEADER([atomic.h], 
+#         [AC_MSG_RESULT(yes)],
+#         [AC_MSG_ERROR([atomic.h is required for atomic support])])
+# else
+#         AC_RUN_IFELSE([AC_LANG_PROGRAM([],[
+#              #if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)))
+#              return 0;
+#              #else
+#              return 1;
+#              #endif
+# 	])],
+# 	[AC_MSG_RESULT(yes)],
+# 	[AC_MSG_FAILURE([GCC version > 4.1 is required for atomic support])])
+# fi
+
+
+# ------------------------------------------------------------------------
+# IPv6 Support
+# ------------------------------------------------------------------------
+
+AC_MSG_CHECKING(for IPv6 support)
+AC_CACHE_VAL(ac_cv_ipv6,
+	AC_TRY_RUN([
+	#include <sys/types.h>
+	#include <sys/socket.h>
+	#include <netinet/in.h>
+	/* Make sure the definitions for AF_INET6 and struct sockaddr_in6
+	 * are defined, and that we can actually create an IPv6 TCP socket.*/
+	main()
+	{
+		int fd;
+		struct sockaddr_in6 foo;
+		fd = socket(AF_INET6, SOCK_STREAM, 0);
+		exit(fd >= 0 ? 0 : 1);
+	}],
+	ac_cv_ipv6=yes,
+	ac_cv_ipv6=no,
+	ac_cv_ipv6=no))
+AC_MSG_RESULT($ac_cv_ipv6)
+if test $ac_cv_ipv6 = yes ; then
+	AC_DEFINE([IPV6], 1, [Define to 1 if the system supports IPv6])
+fi
+
+# ---------------------------------------------------------------------------
+# Functions 
+# ---------------------------------------------------------------------------
+
+
+# ---------------------------------------------------------------------------
+# Outputs
+# ---------------------------------------------------------------------------
+
+AM_CONFIG_HEADER(src/xconfig.h)
+AC_CONFIG_FILES([Makefile test/Makefile])
+AC_OUTPUT
+
+cat <<EOT
++------------------------------------------------------------+
+| License:                                                   |
+| This is Open Source Software and use is subject to the GNU |
+| AFFERO GENERAL PUBLIC LICENSE version 3, available in this |
+| distribution in the file COPYING.                          |
+|                                                            |
+| By continuing this installation process, you are bound by  | 
+| the terms of this license agreement. If you do not agree   |
+| with the terms of this license, you must abort the         |
+| installation process at this point.                        |
++------------------------------------------------------------+
+| Libmonit is configured as follows:                         |
+|                                                            |
+EOT
+
+if test "x1" = "x$OPTIMIZED"; then
+echo "|   Optimized:                                    ENABLED    |"
+else
+echo "|   Optimized:                                    DISABLED   |"
+fi
+if test "xfalse" = "x$profile"; then
+echo "|   Profiling:                                    DISABLED   |"
+else
+echo "|   Profiling:                                    ENABLED    |"
+fi
+if test "xtrue" = "x$openssl"; then
+echo "|   Openssl:                                      ENABLED    |"
+fi
+echo "+------------------------------------------------------------+"
+
+
diff --git a/monit-5.4/libmonit/libtool b/monit-5.4/libmonit/libtool
new file mode 100755
index 0000000..510927d
--- /dev/null
+++ b/monit-5.4/libmonit/libtool
@@ -0,0 +1,8900 @@
+#! /bin/bash
+
+# libtool - Provide generalized library-building support services.
+# Generated automatically by config.status (libmonit) 1.0
+# Libtool was configured on host tildeslash2:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=2.2.6b
+macro_revision=1.3017
+
+# Whether or not to build shared libraries.
+build_libtool_libs=yes
+
+# Whether or not to build static libraries.
+build_old_libs=yes
+
+# What type of objects to build.
+pic_mode=default
+
+# Whether or not to optimize for fast installation.
+fast_install=yes
+
+# The host system.
+host_alias=
+host=x86_64-unknown-linux-gnu
+host_os=linux-gnu
+
+# The build system.
+build_alias=
+build=x86_64-unknown-linux-gnu
+build_os=linux-gnu
+
+# A sed program that does not truncate output.
+SED="/bin/sed"
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP="/bin/grep"
+
+# An ERE matcher.
+EGREP="/bin/grep -E"
+
+# A literal string matcher.
+FGREP="/bin/grep -F"
+
+# A BSD- or MS-compatible name lister.
+NM="/usr/bin/nm -B"
+
+# Whether we need soft or hard links.
+LN_S="ln -s"
+
+# What is the maximum length of a command?
+max_cmd_len=1572864
+
+# Object file suffix (normally "o").
+objext=o
+
+# Executable file suffix (normally "").
+exeext=
+
+# whether the shell understands "unset".
+lt_unset=unset
+
+# turn spaces into newlines.
+SP2NL="tr \\040 \\012"
+
+# turn newlines into spaces.
+NL2SP="tr \\015\\012 \\040\\040"
+
+# How to create reloadable object files.
+reload_flag=" -r"
+reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"
+
+# An object symbol dumper.
+OBJDUMP="objdump"
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method="pass_all"
+
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd="\$MAGIC_CMD"
+
+# The archiver.
+AR="ar"
+AR_FLAGS="cru"
+
+# A symbol stripping program.
+STRIP="strip"
+
+# Commands used to install an old-style archive.
+RANLIB="ranlib"
+old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib"
+old_postuninstall_cmds=""
+
+# A C compiler.
+LTCC="gcc"
+
+# LTCC compiler flags.
+LTCFLAGS="-Wno-address -Wno-pointer-sign -g -O2 -D _REENTRANT -Wall -Wunused -Wno-unused-label -funsigned-char -D_GNU_SOURCE -std=c99"
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe="sed -n -e 's/^.*[	 ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[	 ][	 ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'"
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'"
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/  {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/  {\"\\2\", (void *) \\&\\2},/p'"
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\([^ ]*\\) \$/  {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\(lib[^ ]*\\)\$/  {\"\\2\", (void *) \\&\\2},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/  {\"lib\\2\", (void *) \\&\\2},/p'"
+
+# The name of the directory that contains temporary libtool files.
+objdir=.libs
+
+# Shell to use when invoking shell scripts.
+SHELL="/bin/bash"
+
+# An echo program that does not interpret backslashes.
+ECHO="echo"
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=file
+
+# Must we lock files when doing compilation?
+need_locks="no"
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=""
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=""
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=""
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=""
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=""
+
+# Old archive suffix (normally "a").
+libext=a
+
+# Shared library suffix (normally ".so").
+shrext_cmds=".so"
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=""
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=no
+
+# Do we need a version for libraries?
+need_version=no
+
+# Library versioning type.
+version_type=linux
+
+# Shared library runtime path variable.
+runpath_var=LD_RUN_PATH
+
+# Shared library path variable.
+shlibpath_var=LD_LIBRARY_PATH
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=no
+
+# Format of library name prefix.
+libname_spec="lib\$name"
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}"
+
+# The coded name of the library, if different from the real name.
+soname_spec="\${libname}\${release}\${shared_ext}\$major"
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=""
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=""
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir"
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=""
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=yes
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.4.3 /usr/lib /lib"
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/alsa-lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu "
+
+# Whether dlopen is supported.
+dlopen_support=unknown
+
+# Whether dlopen of programs is supported.
+dlopen_self=unknown
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=unknown
+
+# Commands to strip libraries.
+old_striplib="strip --strip-debug"
+striplib="strip --strip-unneeded"
+
+
+# The linker used to build libraries.
+LD="/usr/bin/ld -m elf_x86_64"
+
+# Commands used to build an old-style archive.
+old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib"
+
+# A language specific compiler.
+CC="gcc"
+
+# Is the compiler the GNU compiler?
+with_gcc=yes
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=" -fno-builtin"
+
+# How to pass a linker flag through the compiler.
+wl="-Wl,"
+
+# Additional compiler flags for building library objects.
+pic_flag=" -fPIC -DPIC"
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="-static"
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o="yes"
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=no
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=no
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="\${wl}--export-dynamic"
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive"
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object="no"
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=""
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=""
+
+# Commands used to build a shared archive.
+archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~
+	    cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~
+	    echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~
+	    \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib"
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=""
+module_expsym_cmds=""
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld="yes"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=""
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=""
+
+# Flag to hardcode $libdir into a binary during linking.
+# This must work even if $libdir does not exist
+hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir"
+
+# If ld is used when linking, flag to hardcode $libdir into a binary
+# during linking.  This must work even if $libdir does not exist.
+hardcode_libdir_flag_spec_ld=""
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=""
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=no
+
+# Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting ${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=no
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=no
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=unsupported
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=no
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=no
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=no
+
+# Fix the shell variable $srcfile for the compiler.
+fix_srcfile_path=""
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=no
+
+# The commands to list exported symbols.
+export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*"
+
+# Symbols that must always be exported.
+include_expsyms=""
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=""
+
+# Specify filename containing input files.
+file_list_spec=""
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=immediate
+
+# ### END LIBTOOL CONFIG
+
+# Generated from ltmain.m4sh.
+
+# ltmain.sh (GNU libtool) 2.2.6b
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#     --config             show all configuration variables
+#     --debug              enable verbose shell tracing
+# -n, --dry-run            display commands without modifying any files
+#     --features           display basic configuration information and exit
+#     --mode=MODE          use operation mode MODE
+#     --preserve-dup-deps  don't remove duplicate dependency libraries
+#     --quiet, --silent    don't print informational messages
+#     --tag=TAG            use configuration variables from tag TAG
+# -v, --verbose            print informational messages (default)
+#     --version            print version information
+# -h, --help               print short or long help message
+#
+# MODE must be one of the following:
+#
+#       clean              remove files from the build directory
+#       compile            compile a source file into a libtool object
+#       execute            automatically set library path, then run a program
+#       finish             complete the installation of libtool libraries
+#       install            install libraries or executables
+#       link               create a library or an executable
+#       uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#       host-triplet:	$host
+#       shell:		$SHELL
+#       compiler:		$LTCC
+#       compiler flags:		$LTCFLAGS
+#       linker:		$LD (gnu? $with_gnu_ld)
+#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1
+#       automake:		$automake_version
+#       autoconf:		$autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="2.2.6b Debian-2.2.6b-2ubuntu1"
+TIMESTAMP=""
+package_revision=1.3017
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# NLS nuisances: We save the old values to restore during execute mode.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+
+$lt_unset CDPATH
+
+
+
+
+
+: ${CP="cp -f"}
+: ${ECHO="echo"}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/bin/sed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+# Generated shell functions inserted here.
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+# Generated shell functions inserted here.
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+# In the unlikely event $progname began with a '-', it would play havoc with
+# func_echo (imagine progname=-n), so we prepend ./ in that case:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+case $progname in
+  -*) progname=./$progname ;;
+esac
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname${mode+: }$mode: $*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "X$my_tmpdir" | $Xsed
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "X$1" | $Xsed \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $SED -n '/^# Usage:/,/# -h/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    $ECHO
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+     }' < "$progpath"
+    exit $?
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    func_error "missing argument for $1"
+    exit_cmd=exit
+}
+
+exit_cmd=:
+
+
+
+
+
+# Check that we have a working $ECHO.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell, and then maybe $ECHO will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+# $mode is unset
+nonopt=
+execute_dlfiles=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+opt_dry_run=false
+opt_duplicate_deps=false
+opt_silent=false
+opt_debug=:
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    $ECHO "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $ECHO "enable shared libraries"
+    else
+      $ECHO "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $ECHO "enable static libraries"
+    else
+      $ECHO "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# Parse options once, thoroughly.  This comes as soon as possible in
+# the script to make things like `libtool --version' happen quickly.
+{
+
+  # Shorthand for --mode=foo, only valid as the first argument
+  case $1 in
+  clean|clea|cle|cl)
+    shift; set dummy --mode clean ${1+"$@"}; shift
+    ;;
+  compile|compil|compi|comp|com|co|c)
+    shift; set dummy --mode compile ${1+"$@"}; shift
+    ;;
+  execute|execut|execu|exec|exe|ex|e)
+    shift; set dummy --mode execute ${1+"$@"}; shift
+    ;;
+  finish|finis|fini|fin|fi|f)
+    shift; set dummy --mode finish ${1+"$@"}; shift
+    ;;
+  install|instal|insta|inst|ins|in|i)
+    shift; set dummy --mode install ${1+"$@"}; shift
+    ;;
+  link|lin|li|l)
+    shift; set dummy --mode link ${1+"$@"}; shift
+    ;;
+  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+    shift; set dummy --mode uninstall ${1+"$@"}; shift
+    ;;
+  esac
+
+  # Parse non-mode specific arguments:
+  while test "$#" -gt 0; do
+    opt="$1"
+    shift
+
+    case $opt in
+      --config)		func_config					;;
+
+      --debug)		preserve_args="$preserve_args $opt"
+			func_echo "enabling shell trace mode"
+			opt_debug='set -x'
+			$opt_debug
+			;;
+
+      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			execute_dlfiles="$execute_dlfiles $1"
+			shift
+			;;
+
+      --dry-run | -n)	opt_dry_run=:					;;
+      --features)       func_features					;;
+      --finish)		mode="finish"					;;
+
+      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			case $1 in
+			  # Valid mode arguments:
+			  clean)	;;
+			  compile)	;;
+			  execute)	;;
+			  finish)	;;
+			  install)	;;
+			  link)		;;
+			  relink)	;;
+			  uninstall)	;;
+
+			  # Catch anything else as an error
+			  *) func_error "invalid argument for $opt"
+			     exit_cmd=exit
+			     break
+			     ;;
+		        esac
+
+			mode="$1"
+			shift
+			;;
+
+      --preserve-dup-deps)
+			opt_duplicate_deps=:				;;
+
+      --quiet|--silent)	preserve_args="$preserve_args $opt"
+			opt_silent=:
+			;;
+
+      --verbose| -v)	preserve_args="$preserve_args $opt"
+			opt_silent=false
+			;;
+
+      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
+			preserve_args="$preserve_args $opt $1"
+			func_enable_tag "$1"	# tagname is set here
+			shift
+			;;
+
+      # Separate optargs to long options:
+      -dlopen=*|--mode=*|--tag=*)
+			func_opt_split "$opt"
+			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
+			shift
+			;;
+
+      -\?|-h)		func_usage					;;
+      --help)		opt_help=:					;;
+      --version)	func_version					;;
+
+      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
+
+      *)		nonopt="$opt"
+			break
+			;;
+    esac
+  done
+
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
+      ;;
+  esac
+
+  # Having warned about all mis-specified options, bail out if
+  # anything was wrong.
+  $exit_cmd $EXIT_FAILURE
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+$opt_help || {
+  # Sanity checks first:
+  func_check_version_match
+
+  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+    func_fatal_configuration "not configured to build any kind of library"
+  fi
+
+  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
+
+
+  # Darwin sucks
+  eval std_shrext=\"$shrext_cmds\"
+
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    func_error "unrecognized option \`-dlopen'"
+    $ECHO "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$progname --help --mode=$mode' for more information."
+}
+
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_ltwrapper_scriptname_result=""
+    if func_ltwrapper_executable_p "$1"; then
+	func_dirname_and_basename "$1" "" "."
+	func_stripname '' '.exe' "$func_basename_result"
+	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    fi
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+        func_quote_for_eval "$arg"
+	CC_quoted="$CC_quoted $func_quote_for_eval_result"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_quote_for_eval "$arg"
+	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
+	    done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          pie_flag="$pie_flag $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_quote_for_eval "$arg"
+	    lastarg="$lastarg $func_quote_for_eval_result"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_quote_for_eval "$lastarg"
+      base_compile="$base_compile $func_quote_for_eval_result"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      removelist="$removelist $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    removelist="$removelist $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+test "$mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$mode'"
+        ;;
+    esac
+
+    $ECHO
+    $ECHO "Try \`$progname --help' for more information about other modes."
+
+    exit $?
+}
+
+  # Now that we've collected a possible --mode arg, show help if necessary
+  $opt_help && func_mode_help
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_quote_for_eval "$file"
+      args="$args $func_quote_for_eval_result"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	$ECHO "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    $ECHO "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $ECHO "   $libdir"
+    done
+    $ECHO
+    $ECHO "If you ever happen to want to link against installed libraries"
+    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
+    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $ECHO "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $ECHO "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $ECHO "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $ECHO "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $ECHO "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $ECHO
+
+    $ECHO "See any operating system documentation about shared libraries for"
+    case $host in
+      solaris2.[6789]|solaris2.1[0-9])
+        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	$ECHO "pages."
+	;;
+      *)
+        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
+        ;;
+    esac
+    $ECHO "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+}
+
+test "$mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    install_prog="$install_prog$func_quote_for_eval_result"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      install_prog="$install_prog $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_verbose "extracting global C symbols from \`$progfile'"
+	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+	  $opt_dry_run || {
+	    eval '$ECHO ": $name " >> "$nlist"'
+	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	  }
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+"
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* )
+	    $ECHO >> "$output_objdir/$my_dlsyms" "\
+/* DATA imports from DLLs on WIN32 con't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs.  */"
+	    lt_dlsym_const= ;;
+	  *osf5*)
+	    echo >> "$output_objdir/$my_dlsyms" "\
+/* This system does not cope well with relocations in const data */"
+	    lt_dlsym_const= ;;
+	  *)
+	    lt_dlsym_const=const ;;
+	  esac
+
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+extern $lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+$lt_dlsym_const lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  $ECHO >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) symtab_cflags="$symtab_cflags $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+
+# func_emit_wrapper_part1 [arg=no]
+#
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
+{
+	func_emit_wrapper_part1_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part1_arg1=$1
+	fi
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    ECHO=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$ECHO works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$ECHO will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$ECHO "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+"
+}
+# end: func_emit_wrapper_part1
+
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
+
+	$ECHO "\
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2* | *-cegcc*)
+	  $ECHO "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $ECHO "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
+	fi
+
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "$SHELL $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat <<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+# define setmode _setmode
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+#ifdef _MSC_VER
+# define S_IXUSR _S_IEXEC
+# define stat _stat
+# ifndef _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifdef __CYGWIN__
+# define FOPEN_WB "wb"
+#endif
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#undef LTWRAPPER_DEBUGPRINTF
+#if defined DEBUGWRAPPER
+# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
+static void
+ltwrapper_debugprintf (const char *fmt, ...)
+{
+    va_list args;
+    va_start (args, fmt);
+    (void) vfprintf (stderr, fmt, args);
+    va_end (args);
+}
+#else
+# define LTWRAPPER_DEBUGPRINTF(args)
+#endif
+
+const char *program_name = NULL;
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
+EOF
+
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+
+	    cat <<EOF
+const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
+
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
+
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
+
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
+  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
+
+  /* very simple arg parsing; don't want to rely on getopt */
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
+	  return 0;
+	}
+    }
+
+  newargz = XMALLOC (char *, argc + 1);
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal ("Couldn't find %s", argv[0]);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
+			  tmp_pathspec));
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
+			  actual_cwrapper_path));
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
+    {
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
+			  path ? (*path ? path : "EMPTY!") : "NULL!"));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
+			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal ("getcwd failed");
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
+			      tmp_pathspec));
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  char *errstr = strerror (errno);
+	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal ("Could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
+
+  p = strchr (arg, (int)'=');
+
+  if (!p)
+    return 1;
+
+  *value = xstrdup (++p);
+
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
+
+  return 0;
+}
+
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
+
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  weak_libs="$weak_libs $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname '-L' '' "$arg"
+	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  arg="$arg $wl$func_quote_for_eval_result"
+	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
+	  linker_flags="$linker_flags $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_duplicate_deps ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  case $lib in
+	  *.la)	func_source "$lib" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) deplibs="$deplibs $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    newlib_search_path="$newlib_search_path $func_stripname_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    dir=$func_stripname_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		$ECHO
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
+		$ECHO "*** that it is just a static archive that I should not use here."
+	      else
+		$ECHO
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_duplicate_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+		esac
+	      fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	    # Keep a list of preopened convenience libraries to check
+	    # that they are being used correctly in the link pass.
+	    test -z "$libdir" && \
+		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         newlib_search_path="$newlib_search_path $func_stripname_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) temp_rpath="$temp_rpath$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      notinst_deplibs="$notinst_deplibs $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    $ECHO
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  $ECHO
+			  $ECHO "*** And there doesn't seem to be a static archive available"
+			  $ECHO "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $ECHO
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** I have the capability to make that library automatically link in when"
+	    $ECHO "*** you link to this library.  But I can only do this if you have a"
+	    $ECHO "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $ECHO "*** But as you try to build a module library, libtool will still create "
+	      $ECHO "*** a static module, that should work as long as the dlopening application"
+	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$ECHO
+		$ECHO "*** However, this would only work if libtool was able to extract symbol"
+		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$ECHO "*** not find such a program.  So, this module is probably useless."
+		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if $opt_duplicate_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_dirname "$deplib" "" "."
+		dir="$func_dirname_result"
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  $ECHO
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      libobjs="$libobjs $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
+      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $ECHO
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    $ECHO "*** I have the capability to make that library automatically link in when"
+		    $ECHO "*** you link to this library.  But I can only do this if you have a"
+		    $ECHO "*** shared version of the library, which I believe you do not have"
+		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
+		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $ECHO
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      $ECHO "*** I have the capability to make that library automatically link in when"
+		      $ECHO "*** you link to this library.  But I can only do this if you have a"
+		      $ECHO "*** shared version of the library, which you do not appear to have"
+		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
+		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $ECHO
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $ECHO "*** make it link in!  You will probably need to install it or some"
+		  $ECHO "*** library that it depends on before this library will be fully"
+		  $ECHO "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		newdeplibs="$newdeplibs $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$ECHO
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		$ECHO "*** I have the capability to make that library automatically link in when"
+		$ECHO "*** you link to this library.  But I can only do this if you have a"
+		$ECHO "*** shared version of the library, which you do not appear to have"
+		$ECHO "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
+	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
+	    done
+	  fi
+	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
+	     $GREP . >/dev/null; then
+	    $ECHO
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $ECHO "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $ECHO
+	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $ECHO "*** a static module, that should work as long as the dlopening"
+	    $ECHO "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $ECHO
+	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
+	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $ECHO "*** not find such a program.  So, this module is probably useless."
+	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
+	    $ECHO "*** automatically added whenever a program is linked with this library"
+	    $ECHO "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $ECHO
+	      $ECHO "*** Since this library must not contain undefined symbols,"
+	      $ECHO "*** because either the platform does not support them or"
+	      $ECHO "*** it was explicitly requested with -no-undefined,"
+	      $ECHO "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  delfiles="$delfiles $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      func_len " $cmd"
+	      len=$func_len_result
+	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    tmp_deplibs="$tmp_deplibs $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    $ECHO 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    $ECHO ')' >> $output
+	    delfiles="$delfiles $output"
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      $ECHO "$obj" >> $output
+	    done
+	    delfiles="$delfiles $output"
+	    output=$firstobj\"$file_list_spec$output\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=$obj
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      delfiles="$delfiles $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  libobjs="$libobjs $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      compile_command="$compile_command ${wl}-bind_at_load"
+	      finalize_command="$finalize_command ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $ECHO for shipping.
+      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    oldobjs="$oldobjs $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  oldobjs="$oldobjs $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $ECHO "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  generated="$generated $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlfiles="$newdlfiles $libdir/$name"
+		;;
+	      *) newdlfiles="$newdlfiles $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		newdlprefiles="$newdlprefiles $libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$mode" = link || test "$mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) RM="$RM $arg"; rmforce=yes ;;
+      -*) RM="$RM $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$mode" = uninstall || test "$mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/monit-5.4/libmonit/m4/libtool.m4 b/monit-5.4/libmonit/m4/libtool.m4
new file mode 100644
index 0000000..a3fee53
--- /dev/null
+++ b/monit-5.4/libmonit/m4/libtool.m4
@@ -0,0 +1,7377 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
diff --git a/monit-5.4/libmonit/m4/ltoptions.m4 b/monit-5.4/libmonit/m4/ltoptions.m4
new file mode 100644
index 0000000..34151a3
--- /dev/null
+++ b/monit-5.4/libmonit/m4/ltoptions.m4
@@ -0,0 +1,368 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/monit-5.4/libmonit/m4/ltsugar.m4 b/monit-5.4/libmonit/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/monit-5.4/libmonit/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/monit-5.4/libmonit/m4/ltversion.m4 b/monit-5.4/libmonit/m4/ltversion.m4
new file mode 100644
index 0000000..f3c5309
--- /dev/null
+++ b/monit-5.4/libmonit/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# Generated from ltversion.in.
+
+# serial 3017 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6b])
+m4_define([LT_PACKAGE_REVISION], [1.3017])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6b'
+macro_revision='1.3017'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/monit-5.4/libmonit/m4/lt~obsolete.m4 b/monit-5.4/libmonit/m4/lt~obsolete.m4
new file mode 100644
index 0000000..637bb20
--- /dev/null
+++ b/monit-5.4/libmonit/m4/lt~obsolete.m4
@@ -0,0 +1,92 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/monit-5.4/libmonit/src/Bootstrap.c b/monit-5.4/libmonit/src/Bootstrap.c
new file mode 100644
index 0000000..4654426
--- /dev/null
+++ b/monit-5.4/libmonit/src/Bootstrap.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdarg.h>
+
+#include "Thread.h"
+#include "Exception.h"
+#include "Bootstrap.h"
+
+
+/**
+ * Implementation of the Bootstrap interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+void(*_AbortHandler)(const char *error, va_list ap) = NULL;
+void(*_ErrorHandler)(const char *error, va_list ap) = NULL;
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+void Bootstrap(void) {
+        Exception_init();
+        Thread_init();
+}
+
+
+void Bootstrap_setAbortHandler(void(*abortHandler)(const char *error, va_list a)) {
+        _AbortHandler = abortHandler;
+}
+
+
+void Bootstrap_setErrorHandler(void(*errorHandler)(const char *error, va_list ap)) {
+        _ErrorHandler = errorHandler;
+}
diff --git a/monit-5.4/libmonit/src/Bootstrap.h b/monit-5.4/libmonit/src/Bootstrap.h
new file mode 100644
index 0000000..a47f4f0
--- /dev/null
+++ b/monit-5.4/libmonit/src/Bootstrap.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef BOOTSTRAP_INCLUDED
+#define BOOTSTRAP_INCLUDED
+
+
+
+/**
+ * Temporary interface for bootstrapping libmonit from Monit.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * Bootstrap libmonit. This method should be called from Monit at startup
+ */
+void Bootstrap(void);
+
+
+/**
+ * Set the function to call if a fatal error occurs in the library. In 
+ * practice this means Out-Of-Memory errors or uncatched exceptions.
+ * Clients may optionally provide this function. If not provided
+ * the library will call <code>abort(3)</code> upon encountering a 
+ * fatal error. This method provide clients with means to close down 
+ * execution gracefully. It is an unchecked runtime error to continue 
+ * using the library after the <code>abortHandler</code> was called.
+ * @param abortHandler The handler function to call should a fatal 
+ * error occur in the library. An explanatory error message is
+ * passed to the handler function in the string <code>error</code>
+ * @see Exception.h
+ */
+void Bootstrap_setAbortHandler(void(*abortHandler)(const char *error, va_list ap));
+
+
+/**
+ * Set the function the library should call for (logging) error messages.
+ * If not provided, the library will write error messages to stderr.
+ * @param errorHandler The handler function to call when the library
+ * emit an error message. The error message is passed to the handler
+ * function in the string <code>error</code> with optional variable
+ * arguments.
+ * @see Exception.h
+ */
+void Bootstrap_setErrorHandler(void(*errorHandler)(const char *error, va_list ap));
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/Config.h b/monit-5.4/libmonit/src/Config.h
new file mode 100644
index 0000000..5486802
--- /dev/null
+++ b/monit-5.4/libmonit/src/Config.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef CONFIG_INCLUDED
+#define CONFIG_INCLUDED
+
+
+/**
+ * Global defines, macros and types
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+
+#include "xconfig.h"
+#include "assert.h"
+#include "system/Mem.h"
+
+
+/* ----------------------------------- Error, Exceptions and report macros */
+
+
+/**
+ * The standard abort routine
+ */
+#define ABORT	System_abort
+
+
+/**
+ * The standard error routine
+ */
+#define ERROR	System_error
+
+
+/* ------------------------------------------------------------ Exceptions */
+
+
+#include "AssertException.h"
+#include "IOException.h"
+#include "NumberFormatException.h"
+
+
+/* ------------------------------------------ General Purpose value macros */
+
+
+/**
+ * Standard String length
+ */
+#define STRLEN 256
+
+
+/* ---------------------------------------------------------- Build macros */
+
+
+/* Mask out GCC __attribute__ extension for non-gcc compilers. */
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
+
+/* ------------------------------------------------------ Type definitions */
+
+
+#if !defined(SOLARIS) && !defined(AIX)
+/**
+ * The internal 8-bit char type
+ */
+typedef unsigned char uchar_t;
+
+
+/**
+ * The internal 32 bits integer type
+ */
+typedef  unsigned int uint32_t;
+
+
+/**
+ * The internal boolean integer type
+ */
+typedef enum {false=0, true} boolean_t;
+#else
+#define false 0
+#define true  1
+#endif
+
+
+#endif
+
+
diff --git a/monit-5.4/libmonit/src/exceptions/AssertException.h b/monit-5.4/libmonit/src/exceptions/AssertException.h
new file mode 100644
index 0000000..af9b5c8
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/AssertException.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef ASSERTEXCEPTION_INCLUDED
+#define ASSERTEXCEPTION_INCLUDED
+#include <exceptions/Exception.h>
+
+
+/**
+ * Thrown to indicate that an assertion has failed.
+ * @see Exception.h
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+extern Exception_T AssertException;
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/exceptions/Exception.c b/monit-5.4/libmonit/src/exceptions/Exception.c
new file mode 100644
index 0000000..308606c
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/Exception.c
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "Str.h"
+#include "Thread.h"
+#include "system/System.h"
+#include "Exception.h"
+
+
+/**
+ * Implementation of the Exception interface. This implementation 
+ * defines the Thread local Exception stack and all Exceptions used
+ * in the system. New Exceptions should also be defined in this class.
+ *
+ * This implementation is a minor modification of the Except code found 
+ * in David R. Hanson's excellent book "C Interfaces and Implementations".
+ * See http://www.cs.princeton.edu/software/cii/
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+ 
+/* ----------------------------------------------------------- Definitions */
+
+
+#define T Exception_T
+/* Thread specific Exception stack */
+ThreadData_T Exception_stack;
+/* Placeholder for system exceptions */
+Exception_T IOException = {"IOException"};
+Exception_T AssertException = {"AssertException"};
+Exception_T MemoryException = {"MemoryException"};
+Exception_T NumberFormatException = {"NumberFormatException"};
+
+static pthread_once_t once_control = PTHREAD_ONCE_INIT;
+
+
+/* --------------------------------------------------------------- Private */
+
+
+static void init_once(void) { ThreadData_create(Exception_stack); }
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+void Exception_init() { pthread_once(&once_control, init_once); }
+
+
+void Exception_throw(const T *e, const char *func, const char *file, int line, const char *cause, ...) {
+	assert(e);
+        va_list ap;
+	Exception_Frame *p = ThreadData_get(Exception_stack);
+	if (p) {
+                p->exception = e;
+                p->func = func;
+                p->file = file;
+                p->line = line;
+                if (cause) {
+                        va_start(ap, cause);
+                        vsnprintf(p->message, EXCEPTION_MESSAGE_LENGTH, cause, ap);
+                        va_end(ap);
+                }
+                pop_exception_stack;	
+                longjmp(p->env, Exception_thrown);
+        } else if (cause) {
+                char message[EXCEPTION_MESSAGE_LENGTH + 1] = "?";
+                va_start(ap, cause);
+                vsnprintf(message, EXCEPTION_MESSAGE_LENGTH, cause, ap);
+                va_end(ap);
+                ABORT("%s: %s\n raised in %s at %s:%d\n", e->name, message, func ? func : "?", file ? file : "?", line);
+        } else {
+                ABORT("%s: 0x%p\n raised in %s at %s:%d\n", e->name, e, func ? func : "?", file ? file : "?", line);
+        }
+}
+
diff --git a/monit-5.4/libmonit/src/exceptions/Exception.h b/monit-5.4/libmonit/src/exceptions/Exception.h
new file mode 100644
index 0000000..bb56b24
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/Exception.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef EXCEPTION_INCLUDED
+#define EXCEPTION_INCLUDED
+#include <setjmp.h>
+
+
+/**
+ * An <b>Exception</b> indicate an error condition from which recovery may 
+ * be possible. The Library <i>raise</i> exceptions, which can be handled by
+ * recovery code, if recovery is possible. When an exception is raised, it is
+ * handled by the handler that was most recently instantiated. If no handlers
+ * are defined an exception will cause the library to call its abort handler 
+ * to abort with an error message. 
+ *
+ * <p>
+ * Handlers are instantiated by the TRY-CATCH and TRY-FINALLY statements, 
+ * which are implemented as macros in this interface. These statements handle 
+ * nested exceptions and manage exception-state data. The syntax of the 
+ * TRY-CATCH statement is,
+ * 
+ * <pre>
+ * TRY
+ *      <b>S</b>
+ * CATCH(e1)
+ *      S1
+ * CATCH(e2)
+ *      S2
+ * [...]
+ * CATCH(en)
+ *      Sn
+ * END_TRY;
+ * </pre>
+ * 
+ * The TRY-CATCH statement establish handlers for the exceptions named 
+ * <code>e1, e2,.., en</code> and execute the statements <b>S</b>.
+ * If no exceptions are raised by <b>S</b>, the handlers are dismantled and 
+ * execution continues at the statement after the END_TRY. If <b>S</b> raises
+ * an exception <code>e</code> which is one of <i>e1..en</i> the execution
+ * of <b>S</b> is interrupted and control transfers immediately to the 
+ * statements following the relevant CATCH clause. If <b>S</b> raises an 
+ * exception that is <i>not</i> one of <i>e1..en</i>, the exception will raise
+ * up the call-stack and unless a previous installed handler catch the 
+ * exception, it will cause the application to abort.
+ *
+ * <p>
+ * Here's a concrete example calling a method in the zild API which may throw
+ * an exception. If the method Connection_execute() fails it will throw an 
+ * SQLException. The CATCH statement will catch this exception, if thrown, 
+ * and log an error message
+ * <pre>
+ * TRY
+ *      [...]
+ *      Connection_execute(c, sql);
+ * CATCH(SQLException)
+ *      log("SQL error: %s\n", Connection_getLastError(c)); 
+ * END_TRY;
+ * </pre>
+ * 
+ * The TRY-FINALLY statement is similar to TRY-CATCH but in addition
+ * adds a FINALLY clausal which is always executed, regardless if an exception
+ * was raised or not. The syntax of the TRY-FINALLY statement is,
+ * <pre>
+ * TRY
+ *      <b>S</b>
+ * CATCH(e1)
+ *      S1
+ * CATCH(e2)
+ *      S2
+ *      [...]
+ * CATCH(en)
+ *      Sn
+ * FINALLY
+ *      Sf
+ * END_TRY;
+ * </pre>
+ * <p>
+ * Note that <code>Sf</code> is executed whether <b>S</b> raise an exception
+ * or not. One purpose of the TRY-FINALLY statement is to give clients an 
+ * opportunity to "clean up" when an exception occurs. For example,  
+ * <pre>
+ * TRY
+ *      [...]
+ *      Connection_execute(c, sql);
+ * CATCH(SQLException)
+ *      &lt;exception handler code&gt;
+ * FINALLY
+ *      Connection_close(c);
+ * END_TRY;
+ * </pre>
+ * closes the database Connection regardless if an exception
+ * was thrown or not by the code in the TRY-block. 
+ *
+ * Finally, the RETURN statement, defined in this interface, must be used
+ * instead of C return statements inside a try-block. If any of the
+ * statements in a try-block must do a return, they <b>must</b>
+ * do so with this macro instead of the usual C return statement. 
+ *
+ * <h3>Exception details</h3>
+ * Inside an exception handler, details about an exception is
+ * available in the variable <code>Exception_frame</code>. The
+ * following demonstrate how to use this variable to provide detailed 
+ * logging of an exception. 
+ *
+ * <pre>
+ * TRY 
+ * {
+ *      code that can throw an exception
+ * }
+ * ELSE  
+ * {
+ *      fprintf(stderr, "%s: %s raised in %s at %s:%d\n",
+ *              Exception_frame.exception->name, 
+ *              Exception_frame.message, 
+ *              Exception_frame.func, 
+ *              Exception_frame.file,
+ *              Exception_frame.line);
+ *      ....
+ * }
+ * END_TRY;
+ * </pre>
+ * 
+ * <p>The Exception stack is stored in a thread-specific variable so Exceptions
+ * are made thread-safe. <i>This means that Exceptions are thread local and an
+ * Exception thrown in one thread cannot be catched in another thread</i>. 
+ * This also means that clients must handle Exceptions per thread and cannot 
+ * use one TRY-ELSE block in the main program to catch all Exceptions. This is
+ * only possible if no threads were started. 
+ * <p><small>This implementation of Exception is a minor modification of code
+ * found in <a href="http://www.drhanson.net/">David R. Hanson's</a> excellent 
+ * book <a href="http://www.cs.princeton.edu/software/cii/">C Interfaces and
+ * Implementations</a>.</small>
+ * @see SQLException.h IOException.h AssertException.h NumberFormatException.h
+ * MemoryException.h
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T Exception_T
+/** @cond hide */
+#include <pthread.h>
+#define TD_T pthread_key_t
+#define TD_set(key, value) pthread_setspecific((key), (value))
+#define TD_get(key) pthread_getspecific((key))
+typedef struct T {
+        const char *name;
+} T;
+#define EXCEPTION_MESSAGE_LENGTH 511
+typedef struct Exception_Frame Exception_Frame;
+struct Exception_Frame {
+	int line;
+	jmp_buf env;
+        const char *func;
+	const char *file;
+	const T *exception;
+	Exception_Frame *prev;
+        char message[EXCEPTION_MESSAGE_LENGTH + 1];
+};
+enum {Exception_entered=0, Exception_thrown, Exception_handled, Exception_finalized};
+extern TD_T Exception_stack;
+void Exception_init(void);
+void Exception_throw(const T *e, const char *func, const char *file, int line, const char *cause, ...);
+#define pop_exception_stack TD_set(Exception_stack, ((Exception_Frame*)TD_get(Exception_stack))->prev)
+/** @endcond */
+
+
+/**
+ * Throws an exception. 
+ * @param e The Exception to throw
+ * @param cause The cause. A NULL value is permitted, and 
+ * indicates that the cause is unknown.
+ * @hideinitializer
+ */
+#define THROW(e, cause, ...) \
+        Exception_throw(&(e), __func__, __FILE__, __LINE__, cause, ##__VA_ARGS__, 0)
+
+
+/**
+ * Re-throws an exception. In a CATCH or ELSE block clients can use RETHROW
+ * to re-throw the Exception
+ * @hideinitializer
+ */
+#define RETHROW Exception_throw(Exception_frame.exception, \
+        Exception_frame.func, Exception_frame.file, Exception_frame.line, Exception_frame.message)
+
+
+/**
+ * Clients <b>must</b> use this macro instead of C return statements
+ * inside a try-block
+ * @hideinitializer
+ */
+#define RETURN switch((pop_exception_stack,0)) default:return
+
+
+/**
+ * Defines a block of code that can potentially throw an exception
+ * @hideinitializer
+ */
+#define TRY do { \
+	volatile int Exception_flag; \
+        Exception_Frame Exception_frame; \
+        Exception_frame.message[0]= 0; \
+        Exception_frame.prev = TD_get(Exception_stack); \
+        TD_set(Exception_stack, &Exception_frame); \
+        Exception_flag = setjmp(Exception_frame.env); \
+        if (Exception_flag == Exception_entered) {
+                
+
+/**
+ * Defines a block containing code for handling an exception thrown in 
+ * the TRY block.
+ * @param e The Exception to handle
+ * @hideinitializer
+ */
+#define CATCH(e) \
+                if (Exception_flag == Exception_entered) pop_exception_stack; \
+        } else if (Exception_frame.exception == &(e)) { \
+                Exception_flag = Exception_handled; 
+
+
+/**
+ * Defines a block containing code for handling any exception thrown in 
+ * the TRY block. An ELSE block catches any exception type not already 
+ * catched in a previous CATCH block.
+ * @hideinitializer
+ */
+#define ELSE \
+                if (Exception_flag == Exception_entered) pop_exception_stack; \
+        } else { \
+                Exception_flag = Exception_handled;
+
+
+/**
+ * Defines a block of code that is subsequently executed whether an 
+ * exception is thrown or not
+ * @hideinitializer
+ */
+#define FINALLY \
+                if (Exception_flag == Exception_entered) pop_exception_stack; \
+        } { \
+                if (Exception_flag == Exception_entered) \
+                        Exception_flag = Exception_finalized;
+                
+
+/**
+ * Ends a TRY-CATCH block
+ * @hideinitializer
+ */
+#define END_TRY \
+                if (Exception_flag == Exception_entered) pop_exception_stack; \
+        } if (Exception_flag == Exception_thrown) RETHROW; \
+        } while (0)
+
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/exceptions/IOException.h b/monit-5.4/libmonit/src/exceptions/IOException.h
new file mode 100644
index 0000000..5f41f06
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/IOException.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef IOEXCEPTION_INCLUDED
+#define IOEXCEPTION_INCLUDED
+#include <exceptions/Exception.h>
+
+
+/**
+ * Signals that an I/O exception of some sort has occurred. This class 
+ * is the general class of exceptions produced by failed I/O operations. 
+ * @see Exception.h
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+extern Exception_T IOException;
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/exceptions/MemoryException.h b/monit-5.4/libmonit/src/exceptions/MemoryException.h
new file mode 100644
index 0000000..654418a
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/MemoryException.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MEMORYEXCEPTION_INCLUDED
+#define MEMORYEXCEPTION_INCLUDED
+#include <exceptions/Exception.h>
+
+
+/**
+ * Thrown to indicate that a memory allocation failed. Every class that 
+ * expose methods for object allocation may throw a MemoryException if 
+ * the underlying allocator failed.
+ * @see Exception.h
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+extern Exception_T MemoryException;
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/exceptions/NumberFormatException.h b/monit-5.4/libmonit/src/exceptions/NumberFormatException.h
new file mode 100644
index 0000000..da445cc
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/NumberFormatException.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef NUMBERFORMATEXCEPTION_INCLUDED
+#define NUMBERFORMATEXCEPTION_INCLUDED
+#include <exceptions/Exception.h>
+
+
+/**
+ * Thrown to indicate that an attempt to convert a string to one of the 
+ * numeric types failed, because the string does not have the appropriate
+ * format.
+ * @see Exception.h
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+extern Exception_T NumberFormatException;
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/exceptions/assert.c b/monit-5.4/libmonit/src/exceptions/assert.c
new file mode 100644
index 0000000..0777aa7
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/assert.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "assert.h"
+void (assert)(int e) {
+	assert(e);
+}
diff --git a/monit-5.4/libmonit/src/exceptions/assert.h b/monit-5.4/libmonit/src/exceptions/assert.h
new file mode 100644
index 0000000..9d46f94
--- /dev/null
+++ b/monit-5.4/libmonit/src/exceptions/assert.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef ASSERTION_INCLUDED
+#define ASSERTION_INCLUDED
+#include <exceptions/AssertException.h>
+
+
+/**
+ * The assert() macro tests the given expression and if it is false, raise
+ * an AssertException. Unless a previous installed exception handler catch
+ * the exception, it will cause the application to abort. If expression is 
+ * true, the assert() macro does nothing. <small>The assert() macro is 
+ * required and may <b>not</b> be removed at compile time.</small>
+ * @see AssertException.h 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+#undef assert
+/** @cond hide */
+extern void assert(int e);
+/** @endcond */
+
+
+/**
+ * Evaluate the given expression <code>e</code> and if false raise
+ * an AssertException
+ * @param e The expression to evaluate
+ * @exception AssertException if <code>e</code> is false
+ * @hideinitializer
+ */
+#define assert(e) ((void)((e)||(Exception_throw(&(AssertException), __func__, __FILE__, __LINE__, #e),0)))
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/io/Dir.c b/monit-5.4/libmonit/src/io/Dir.c
new file mode 100644
index 0000000..9c2095d
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/Dir.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <glob.h>
+
+#include "system/System.h"
+#include "Str.h"
+#include "File.h"
+#include "Dir.h"
+
+
+/**
+ * Implementation of the Dir interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+
+/* ----------------------------------------------------------------- Class */
+
+
+int Dir_mkdir(const char *dir, int perm) {
+        if (dir) {
+                if (mkdir(dir, 0777) == 0) {
+                        if (perm != 0)
+                                File_chmod(dir, perm);
+                        return true;
+                }
+        }
+        errno = EINVAL;
+        return false;
+}
+
+
+int Dir_delete(const char *dir) {
+        if (dir)
+                return File_delete(dir);
+        errno = EINVAL;
+        return false;        
+}
+
+
+int Dir_chdir(const char *path) {
+        if (path) 
+                return (chdir(path)==0);
+        errno = EINVAL;
+        return false;
+}
+
+
+const char *Dir_cwd(char *result, int length) {
+        if (result) 
+                return getcwd(result, length);
+        errno = EINVAL;
+        return result;
+}
diff --git a/monit-5.4/libmonit/src/io/Dir.h b/monit-5.4/libmonit/src/io/Dir.h
new file mode 100644
index 0000000..0f2a0c9
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/Dir.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef DIR_INCLUDED
+#define DIR_INCLUDED
+
+
+/**
+ * A collection of class methods for operating on a dir
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+ 
+/** @name class methods */
+//@{
+
+
+/**
+ * Creates the directory named by this absolute pathname. The optional 
+ * <code>perm</code> parameter specify the permission for the created
+ * directory. If perm is 0 the directory is created with standard 
+ * permission as modified by the process umask.
+ * @param dir An absolute directory path
+ * @param perm An octal number specifying a permission bit pattern, e.g. 0775
+ * or 0 for the default.
+ * @return true if success otherwise false, System_getLastError() can be
+ * used to get a description of the error that occurred
+ * @see File_umask()
+ */
+int Dir_mkdir(const char *dir, int perm);
+
+
+/**
+ * Delete the directory named by this absolute pathname. This method
+ * fails if the directory <code>dir</code> is not empty.
+ * @param dir An absolute  directory path
+ * @return true if success otherwise false and System_getLastError() can be
+ * used to get a description of the error that occurred
+ */
+int Dir_delete(const char *dir);
+
+
+/**
+ * Changes the current working directory of the process to the given 
+ * <code>path</code>.
+ * @param path An absolute directory path
+ * @return true if success otherwise false and System_getLastError() can be
+ * used to get a description of the error that occurred
+ */
+int Dir_chdir(const char *path);
+
+
+/**
+ * Returns the current working directory of the process.
+ * @param result A buffer to write the result to. 
+ * @param length The length of the result buffer
+ * @return A pointer to the result buffer
+ */
+const char *Dir_cwd(char *result, int length);
+
+//@}
+
+#endif
diff --git a/monit-5.4/libmonit/src/io/File.c b/monit-5.4/libmonit/src/io/File.c
new file mode 100644
index 0000000..6988821
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/File.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "Str.h"
+#include "system/System.h"
+#include "File.h"
+
+
+/**
+ * Implementation of the File Facade for Unix systems. 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+#define DEFAULT_PERM 0666
+
+#define RETURN_FILETYPE(X) do { \
+        switch ((X) & S_IFMT) { \
+        case S_IFREG:  return 'r'; \
+        case S_IFDIR:  return 'd'; \
+        case S_IFCHR:  return 'c'; \
+        case S_IFBLK:  return 'b'; \
+        case S_IFLNK:  return 'l'; \
+        case S_IFIFO:  return 'p'; \
+        case S_IFSOCK: return 's'; \
+        default:       return '?'; \
+} } while (0)
+
+const char SEPARATOR_CHAR = '/';
+const char *SEPARATOR = "/";
+const char PATH_SEPARATOR_CHAR = ':';
+const char *PATH_SEPARATOR = ":";
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+
+int File_open(const char *file, const char *mode) {
+        if (file && mode) {
+                switch(mode[0]) {
+                        case 'r':
+                                switch (mode[1]) {
+                                        case '+': return open(file, O_RDWR|O_NONBLOCK);
+                                        default:  return open(file, O_RDONLY|O_NONBLOCK);
+                                }
+                        case 'w':  
+                                switch (mode[1]) {
+                                        case '+': return open(file, O_CREAT|O_RDWR|O_TRUNC|O_NONBLOCK, DEFAULT_PERM);
+                                        default:  return open(file, O_CREAT|O_WRONLY|O_TRUNC|O_NONBLOCK, DEFAULT_PERM);
+                                }
+                        case 'a':  
+                                switch (mode[1]) {
+                                        case '+': return open(file, O_CREAT|O_RDWR|O_APPEND|O_NONBLOCK, DEFAULT_PERM);
+                                        default:  return open(file, O_CREAT|O_WRONLY|O_APPEND|O_NONBLOCK, DEFAULT_PERM);
+                                }
+                }
+        }
+        errno = EINVAL;
+        return -1;
+}
+
+
+int File_close(int fd) {
+        int r;
+        do
+                r = close(fd);
+        while (r == -1 && errno == EINTR);
+        return (r == 0);
+}
+
+
+int File_rewind(int fd) {
+        return (lseek(fd, 0, SEEK_SET) >=0);
+}
+
+
+time_t File_mtime(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) == 0)
+                        return buf.st_mtime;
+        }
+        return -1;
+}
+
+
+time_t File_ctime(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) == 0)
+                        return buf.st_ctime;
+        }
+        return -1;
+}
+
+
+time_t File_atime(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) == 0)
+                        return buf.st_atime;
+        }
+        return -1;
+}
+
+
+int File_isFile(const char *file) {
+        if (file) {
+                struct stat buf;
+                return (stat(file, &buf) == 0 && S_ISREG(buf.st_mode));
+        }
+        return false;
+}
+
+
+int File_isDirectory(const char *file) {
+        if (file) {
+                struct stat buf;
+                return (stat(file, &buf) == 0 && S_ISDIR(buf.st_mode));
+        }
+        return false;
+}
+
+
+int File_exist(const char *file) {
+        if (file) {
+                struct stat buf;
+                return (stat(file, &buf) == 0);
+        }
+        return false;
+}
+
+
+char File_type(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) == 0)
+                        RETURN_FILETYPE(buf.st_mode);
+        }
+        return '?';
+}
+
+
+off_t File_size(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) < 0)
+                        return -1;
+                return buf.st_size;
+        }
+        return -1;
+}
+
+
+int File_chmod(const char *file, mode_t mode) {
+        if (file)
+                return (chmod(file, mode) == 0);
+        errno = EINVAL;
+        return false;
+}
+
+
+mode_t File_mod(const char *file) {
+        if (file) {
+                struct stat buf;
+                if (stat(file, &buf) == 0)
+                        return buf.st_mode;
+        }
+        return -1;
+}
+
+
+mode_t File_umask(void) {
+        mode_t omask = umask(0);
+        umask(omask);
+        return omask;        
+}
+
+
+mode_t File_setUmask(mode_t mask) {
+        mode_t omask = umask(mask);
+        return omask;        
+}
+
+
+int File_isReadable(const char *file) {
+        if (file) 
+                return (access(file, R_OK) == 0);
+        return false;
+}
+
+
+int File_isWritable(const char *file) {
+        if (file) 
+                return (access(file, W_OK) == 0);
+        return false;
+}
+
+
+int File_isExecutable(const char *file) {
+        if (file) 
+                return (access(file, X_OK) == 0);
+        return false;
+}
+
+
+int File_delete(const char *file) {
+        if (file)
+                return (remove(file) == 0);
+        errno = ENOENT;
+        return false;
+}
+
+
+int File_rename(const char *file, const char *name) {
+        if (file)                
+                return (rename(file, name) == 0);
+        errno = ENOENT;
+        return false;
+}
+
+
+const char *File_basename(const char *path) {
+        if ((STR_DEF(path))) {
+                char *f = strrchr(path, SEPARATOR_CHAR);
+                return (f ? ++f : path);
+        }
+        return path;
+}
+
+
+char *File_dirname(char *path) {
+        if ((STR_DEF(path))) {
+                char *d = strrchr(path, SEPARATOR_CHAR);
+                if (d) 
+                        *(d + 1) = 0; /* Keep last separator */
+                else {
+                        path[0] = '.'; 
+                        path[1] = 0;
+                }
+        }
+        return path;
+}
+
+
+const char *File_extension(const char *path) {
+        if (STR_DEF(path)) {
+                char *e = strrchr(path, '.');
+                return (e ? ++e : NULL);
+        }
+        return NULL;
+}
+
+
+char *File_removeTrailingSeparator(char *path) {
+        if (STR_DEF(path)) {
+                char *p;
+                for (p = path; *p; p++);
+                do 
+                        *(p--) = 0;
+                while ((p > path) && (isspace(*p) || *p == SEPARATOR_CHAR));
+        }
+        return path;
+}
+
+
+char *File_getRealPath(const char *path, char *resolved) {
+        if (path && resolved)
+                return realpath(path, resolved);
+        return NULL;
+}
diff --git a/monit-5.4/libmonit/src/io/File.h b/monit-5.4/libmonit/src/io/File.h
new file mode 100644
index 0000000..e3e0f03
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/File.h
@@ -0,0 +1,359 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef FILE_INCLUDED
+#define FILE_INCLUDED
+#include <sys/types.h>
+
+
+/**
+ * A set of low-level class methods for operating on a file.
+ * 
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * The system-dependent filename separator character. On UNIX systems
+ * the value of this char is '/' on Win32 systems it is '\'.
+ */
+extern const char SEPARATOR_CHAR;
+
+/**
+ * The separator character, provided as a string for convenience. This
+ * string contains a single character, namely SEPARATOR_CHAR.
+ */
+extern const char *SEPARATOR;
+
+/**
+ * The system-dependent path-separator character. This character is
+ * used to separate filenames in a sequence of files given as a path
+ * list. On UNIX systems, this character is ':' on Win32 systems it is ';'.
+ */
+extern const char PATH_SEPARATOR_CHAR;
+
+/**
+ * The system-dependent path-separator character, provided as a string
+ * for convenience. This string contains a single character, namely
+ * PATH_SEPARATOR_CHAR.
+ */
+extern const char *PATH_SEPARATOR;
+
+
+/**
+ * Open <code>file</code> and return its file descriptor. The file is 
+ * opened in non-blocking mode, meaning that read and write operations
+ * will not block. Clients can pass the descriptor to an Input- and/or 
+ * an OutputStream for reading/writing to the file. The mode parameter
+ * is used to specify the access requested for the file. The mode may 
+ * be one of
+ * <ol>
+ * <li>"r" Open for reading. The stream is positioned at the beginning 
+ * of the file</li>
+ * <li>"w" Open for writing. If the file does not exist it will be
+ * created, if it exist it is truncated to length 0. The stream is 
+ * positioned at the beginning of the file</li>
+ * <li>"r+" Open for reading and writing. The stream is positioned 
+ * at the beginning of the file</li>
+ * <li>"w+" Open for reading and writing. If the file does not exist it 
+ * will be created, if it exist it is truncated to length 0. The stream is 
+ * positioned at the beginning of the file</li>
+ * <li>"a" Open for writing at the end of the file (appending). If the
+ * file does not exist it will be created. The stream is positioned at
+ * the end of the file</li>
+ * <li>"a+" Open for reading and writing. If the file does not exist it 
+ * will be created. The stream is positioned at the end of the file</li>
+ *</ol>
+ * @param file An absolute  file path
+ * @param mode the file access mode
+ * @return A file descriptor or -1 if the file cannot be opened. Use 
+ * System_getLastError() to get a description of the error that occurred
+ */
+int File_open(const char *file, const char *mode);
+
+
+/**
+ * Close the file descriptor <code>fd</code>
+ * @param fd An open file descriptor
+ * @return true on success or false if an error occurred.
+ */
+int File_close(int fd);
+
+
+/**
+ * Move the <code>read</code> position in the file to the beginning
+ * of input.
+ * @param fd An open file descriptor
+ * @return true if success otherwise false and errno is set accordingly
+ */
+int File_rewind(int fd);
+
+
+/**
+ * Returns the last modified time stamp for the given <code>file</code>. 
+ * A file's mtime is changed by a file write operation
+ * @param file An absolute file path
+ * @return the last modified time stamp or -1 if the file was not found.
+ */
+time_t File_mtime(const char *file);
+
+
+/**
+ * Returns the time when the <code>file</code> status was last changed. 
+ * A file ctime is changed by a file write, chmod, chown, rename, etc.
+ * @param file An absolute file path
+ * @return the last changed time stamp or -1 if the file was not found 
+ */
+time_t File_ctime(const char *file);
+
+
+/**
+ * Returns the time when <code>file</code> data was last accessed. 
+ * A file atime is changed by a file read operation
+ * @param file An absolute file path
+ * @return the last accessed time stamp or -1 if the file was not found.
+ */
+time_t File_atime(const char *file);
+
+
+/**
+ * Check if this is a regular <code>file</code>.
+ * @param file An absolute file path
+ * @return true if file exist and is a regular file, otherwise false
+ */
+int File_isFile(const char *file);
+
+
+/**
+ * Check if <code>file</code> is a directory
+ * @param file An absolute file path
+ * @return true if file exist and is a directory, otherwise false
+ */
+int File_isDirectory(const char *file);
+
+
+/**
+ * Check if the <code>file</code> exist
+ * @param file An absolute file path
+ * @return true if file exist otherwise false
+ */
+int File_exist(const char *file);
+
+
+/**
+ * Returns the file type. The returned char is one of
+ * <ul>
+ * <li>r - regular file</li>
+ * <li>d - directory</li>
+ * <li>c - char special</li>
+ * <li>b - block special</li>
+ * <li>l - symbolic link</li>
+ * <li>p - fifo or socket</li>
+ * <li>s - socket</li>
+ * <li>? - file does not exist</li>
+ * </ul>
+ * @param file An absolute file path
+ * @return The file type
+ */
+char File_type(const char *file);
+
+
+/**
+ * Returns the <code>file</code> size in bytes
+ * @param file An absolute file path
+ * @return The file size or -1 if it does not exist
+ */
+off_t File_size(const char *file);
+
+
+/**
+ * Changes permission bits on the <code>file</code> to the bit pattern 
+ * represented by <code>perm</code>. On POSIX systems, see chmod(1) for 
+ * details. Example, <code>File_chmod(file, 0644);</code> sets read and 
+ * write permission for the File owner and read-only permission for others.
+ * @param file An absolute file path
+ * @param perm An octal number specifying a permission bit pattern.
+ * @return true if success otherwise false if for instance the File does
+ * not exist in the file system.
+ */
+int File_chmod(const char *file, mode_t perm);
+
+
+/**
+ * Returns the permission bit pattern for the <code>file</code>. See also
+ * File_chmod().
+ * @param file An absolute file path
+ * @return An octal number specifying the permission set for this file
+ * or -1 if the file does not exist 
+ */
+mode_t File_mod(const char *file);
+
+
+/**
+ * Returns the current umask value for this process. Umask values are 
+ * subtracted from the default permissions. Files and directories 
+ * are created with default permission set to 0666 and 0777 respectively.
+ * 
+ * Simply put, the umask value is a set of permission bits to turn back off 
+ * a file creation mode. When a file or directory is created, the permission
+ * bits specified are <i>anded</i> with the complement of the umask value to
+ * determine the actual bits that will be set. For instance, when a file is 
+ * created with File_open() the permission for the new file is set 
+ * according to
+ * <pre>
+ * 0666 & ~File_umask(). If File_umask() is 022 then; 0666 & ~022 = 0644
+ * </pre>
+ * If a new directory is created with Dir_mkdir() then permission is set
+ * according to,
+ * <pre>
+ * 0777 & ~File_umask(). If File_umask() is 022 then; 0777 & ~022 = 0755
+ * </pre>
+ * Here is a ruby on-liner to play with, to see how umask modifies default
+ * permissions
+ * <pre>
+ * ruby -e 'printf("%#o\n", (0666 & ~0022))' 
+ * </pre>
+ * See also http://en.wikipedia.org/wiki/Umask and umask(2) on Unix
+ * @return An octal number representing the umask value for this process
+ */
+mode_t File_umask(void);
+
+
+/**
+ * Set the umask value for this process. The default value is 022, unless
+ * changed by the user. See also File_umask()
+ * @param mask The new umask value, as a 3 digit octal number, e.g. 007
+ * @return The old umask value for this process
+ */
+mode_t File_setUmask(mode_t mask);
+
+
+/**
+ * Check if the <code>file</code> is readable for the real user id (uid) of 
+ * this process
+ * @param file An absolute path
+ * @return true if the file is readable, otherwise false
+ */
+int File_isReadable(const char *file);
+
+
+/**
+ * Check if the <code>file</code> is writable for the real user id (uid) of 
+ * this process
+ * @param file An absolute path
+ * @return true if the file is writable, otherwise false
+ */
+int File_isWritable(const char *file);
+
+
+/**
+ * Check if the <code>file</code> is executable for the real user id (uid) of 
+ * this process
+ * @param file An absolute path
+ * @return true if the file is executable, otherwise false
+ */
+int File_isExecutable(const char *file);
+
+
+/**
+ * Delete <code>file</code> from the filesystem
+ * @param file An absolute path
+ * @return true if success otherwise false
+ */
+int File_delete(const char *file);
+
+
+/**
+ * Renames the given <code>file</code> to the new <code>name</code>
+ * Both <code>file</code> and <code>name</code> should contain a full path.
+ * @param file The name of the file to be renamed
+ * @param name The new name for the file. 
+ * @return true if success otherwise false
+ */
+int File_rename(const char *file, const char *name);
+
+
+/**
+ * Returns only the filename with leading directory components
+ * removed. This function does not modify the path string.
+ * @param path A file path string
+ * @return A pointer to the base name in path
+ */
+const char *File_basename(const char *path);
+
+
+/**
+ * Strip the filename and return only the path, including the last path
+ * separator. The path parameter is modified so if you need to preserve 
+ * the path string, copy the string before it is passed to this function. 
+ * If no file separator can be found in the given path the following string
+ * is returned "." meaning the current directory.
+ * @param path A file path string
+ * @return The dir name from the path
+ */
+char *File_dirname(char *path);
+
+
+/**
+ * Returns only the file extension from the <code>path</code>. This
+ * function does not modify the path string. For instance given
+ * the file path: <code>zild/webapps/ROOT/hello.html</code> this method 
+ * returns a pointer to the sub-string <code>html</code>. If the 
+ * <code>path</code> string does not contain an extension this 
+ * method returns NULL.
+ * @param path A file path string
+ * @return A pointer to the file extension in the <code>path</code>
+ * string or NULL if no extension is found.
+ */
+const char *File_extension(const char *path);
+
+
+/**
+ * If path is a directory, remove the last SEPARATOR char if any.
+ * Example:
+ * <pre>
+ * File_removeTrailingSeparator("/tmp/")    -> "/tmp"
+ * File_removeTrailingSeparator("/tmp")     -> "/tmp"
+ * File_removeTrailingSeparator(".monitrc") -> ".monitrc"
+ * </pre>
+ * @param path A file path string
+ * @return A pointer to the path string
+ */
+char *File_removeTrailingSeparator(char *path);
+
+
+/**
+ * Returns the canonicalized absolute pathname of the <code>path</code>
+ * parameter. The <code>resolved</code> buffer must have size equal to
+ * PATH_MAX
+ * @param path The file path to normalize
+ * @param resolved The buffer to write the real path too
+ * @return A pointer to the resolved buffer or NULL if an error occured
+ */
+char *File_getRealPath(const char *path, char *resolved);
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/io/InputStream.c b/monit-5.4/libmonit/src/io/InputStream.c
new file mode 100644
index 0000000..691fc1b
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/InputStream.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#include "Str.h"
+#include "system/Net.h"
+#include "InputStream.h"
+
+
+/**
+ * Implementation of the InputStream interface. 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+// One TCP frame data size
+#define BUFFER_SIZE 1500
+
+#define T InputStream_T
+struct T {
+        int fd;
+        int offset;
+        int length;
+        time_t timeout;
+        boolean_t isclosed;
+        uchar_t buffer[BUFFER_SIZE];
+};
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/* Fill the internal buffer. Only read once, since we may have read all and an
+extra read would just be an extra system call. Returns true (the length of
+data read), -1 if an error occured or if the connection was closed by the
+client. 0 is returned if a read returned 0 (eof) and read should be retried
+because it would block. If an error occured the stream is also set in closed
+mode. */
+static inline int fill(T S) {
+        if (S->isclosed)
+                return -1;
+        S->length = 0;
+        S->offset = 0; 
+        errno = 0;
+        int n = (int)Net_read(S->fd, S->buffer, BUFFER_SIZE, S->timeout);
+        if (n > 0)
+                S->length = n;
+        else if (n < 0) {
+                n = -1; 
+                S->isclosed = true; 
+                S->offset = S->length = 0;
+        } else if (! (errno == EAGAIN || errno == EWOULDBLOCK)) // peer closed connection
+                n = -1;
+        return n;
+}
+
+
+/* Read a single byte. The byte is returned as an int in the range 0 to 255.
+Returns the byte read, or -1 if the end of the stream has been reached or if a
+read error occurred */
+static inline int read_byte(T S) {
+        if (S->offset >= S->length) {
+                if (fill(S) <= 0) {
+                        return -1;
+                }
+        }
+        return S->buffer[S->offset++];
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+T InputStream_new(int descriptor) {
+        T S;
+        NEW(S);
+        S->fd = descriptor;
+        S->timeout = NET_READ_TIMEOUT;
+        return S;
+}
+
+
+void InputStream_free(T *S) {
+        assert(S && *S);
+        FREE(*S);
+}
+
+
+/* ------------------------------------------------------------ Properties */
+
+
+int InputStream_getDescriptor(T S) {
+        assert(S);
+        return S->fd;
+}
+
+
+void InputStream_setTimeout(T S, time_t timeout) {
+        assert(S);
+        assert(timeout >= 0);
+        S->timeout = timeout;
+}
+
+
+time_t InputStream_getTimeout(T S) {
+        assert(S);
+        return S->timeout;
+}
+
+
+int InputStream_isClosed(T S) {
+        assert(S);
+        return S->isclosed;
+}
+
+
+int InputStream_buffered(T S) {
+        assert(S);
+        return S->length - S->offset;
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+int InputStream_read(T S) {
+        assert(S);
+        return read_byte(S);
+}
+
+
+char *InputStream_readLine(T S, char *s, int size) { 
+        assert(S);
+        assert(s);
+        uchar_t *p = (uchar_t *)s; 
+        for (int c = 0; (--size > 0) && ((c = read_byte(S)) > 0);) { // Stop if \0 is read or no more data
+                *p++ = c;
+                if (c == '\n')
+                        break;
+        }
+        *p = 0;
+        return *s ? s : NULL;
+}
+
+
+int InputStream_readBytes(T S, void *b, int size) {
+        assert(S);
+        assert(b);
+        uchar_t *p = (uchar_t*)b;
+        for (int c = 0; (size-- > 0) && ((c = read_byte(S)) != -1);)
+                *p++ = c;
+        return  S->isclosed ? -1 : (int)(p - (uchar_t*)b);
+}
+
+
+void InputStream_clear(T S) {
+        assert(S);
+        S->offset = S->length = 0;
+}
diff --git a/monit-5.4/libmonit/src/io/InputStream.h b/monit-5.4/libmonit/src/io/InputStream.h
new file mode 100644
index 0000000..f4fb243
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/InputStream.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef INPUTSTREAM_INCLUDED
+#define INPUTSTREAM_INCLUDED
+#include <sys/types.h>
+
+
+/**
+ * An <b>InputStream</b> can be used for reading text or binary
+ * data (8 bits) from a descriptor. 
+ *
+ * The method InputStream_isClosed() can be used to test the
+ * underlying descriptor for an error, a read timeout or for EOF.
+ * 
+ * Clients can use this stream in a non-blocking manner by setting 
+ * InputStream_setTimeout() to 0.
+ * 
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T InputStream_T
+typedef struct T *T;
+
+
+/**
+ * Create a new InputStream object.
+ * @param descriptor The descriptor for this inputstream
+ * @return An InputStream object
+ */
+T InputStream_new(int descriptor);
+
+
+/**
+ * Destroy an InputStream object and release allocated resources. 
+ * Call this method to release an InputStream object allocated with
+ * InputStream_new()
+ * @param S An InputStream object reference
+ */
+void InputStream_free(T *S);
+
+
+/** @name Properties */
+//@{
+
+
+/**
+ * Returns the underlying descriptor for this stream
+ * @param S An InputStream object
+ * @return The descriptor for this stream 
+ */
+int InputStream_getDescriptor(T S);
+
+
+/**
+ * Set a read <code>timeout</code> in milliseconds. During a read
+ * operation the stream will wait up to <code>timeout</code>
+ * milliseconds for data to become available if not already present.
+ * @param S An InputStream object
+ * @param timeout The timeout value in milliseconds
+ * @exception AssertException if timeout is < 0
+ */
+void InputStream_setTimeout(T S, time_t timeout);
+
+
+/**
+ * Get the read timeout in milliseconds. 
+ * @param S An InputStream object
+ * @return The timeout value in milliseconds
+ */
+time_t InputStream_getTimeout(T S);
+
+
+/**
+ * Returns true if the underlying descriptor was closed. The stream is
+ * closed if an I/O error occurs.
+ * @param S An InputStream object
+ * @return true if the descriptor was closed, otherwise false
+ */
+int InputStream_isClosed(T S);
+
+
+/**
+ * Returns the number of bytes in the InputStream's cache buffer. 
+ * I.e. bytes that are cached in the stream's internal buffer
+ * @param S An InputStream object
+ * @return Number of input bytes cached
+ */
+int InputStream_buffered(T S);
+
+//@}
+
+/**
+ * Read a single byte. The byte is returned as an int in the range 0-255.
+ * @param S An InputStream object
+ * @return The byte read, or -1 if the end of the stream has been reached
+ * If the stream uses non-blocking I/O, i.e. timeout is 0, then -1 is also
+ * returned if a read would block, indicating that the caller should try again
+ * later.
+ */
+int InputStream_read(T S);
+
+
+/**
+ * Reads in at most one less than <code>size</code> characters and stores
+ * them into the buffer pointed to by <code>s</code>. Reading stops after
+ * an EOF, a newline or '\\0'. If a newline is read, it is stored into the buffer.
+ * A '\\0' is stored after the last character in the buffer.
+ * @param S An InputStream object
+ * @param s A character buffer to store the string in
+ * @param size The size of the string buffer s
+ * @return s on success or NULL when end of file or an error occurs.
+ * If the stream uses non-blocking I/O, i.e. timeout is 0, then NULL is also
+ * returned if a read would block, indicating that the caller should try again
+ * later.
+ */
+char *InputStream_readLine(T S, char *s, int size);
+
+
+/**
+ * Reads size <code>bytes</code> and stores them into the byte buffer
+ * pointed to by <code>b</code>. Reading stops when size bytes are read
+ * or if no more data is available. The buffer is <b>not</b> NUL terminated. 
+ * @param S An InputStream object
+ * @param b A Byte buffer
+ * @param size The size of the buffer b
+ * @return Number of bytes read, 0 when end of file or -1 if an error occurs.
+ * If the stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also
+ * returned if a read would block, indicating that the caller should try again
+ * later.
+ */
+int InputStream_readBytes(T S, void *b, int size);
+
+
+/**
+ * Clears any data that exist in the buffer
+ * @param S An InputStream object
+ */
+void InputStream_clear(T S);
+
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/io/OutputStream.c b/monit-5.4/libmonit/src/io/OutputStream.c
new file mode 100644
index 0000000..bb66d44
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/OutputStream.c
@@ -0,0 +1,489 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (c) 1994,1995,1996,1997 by David R. Hanson.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <float.h>
+#include <limits.h>
+#include <ctype.h>
+#ifdef OPENBSD
+#include <sys/uio.h>
+#endif
+
+#include "system/Net.h"
+#include "OutputStream.h"
+
+
+/**
+ * Implementation of the OutputStream interface. The printf implementation is
+ * based on "Fmt" from David Hanson's excellent CII library.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+// One TCP frame data size
+#define BUFFER_SIZE 1500
+
+#define T OutputStream_T
+struct T {
+        int fd;
+        time_t timeout;
+        uchar_t *limit;
+        uchar_t *length;
+        boolean_t isclosed;
+        int sessionWritten;
+        long long int bytesWritten;
+        uchar_t buffer[BUFFER_SIZE + 1];
+};
+typedef struct va_list_box {va_list ap;} va_list_box;
+typedef void (*fmt_t)(T S, int code, va_list_box *box, unsigned char flags[256], int width, int precision);
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/* Write the output buffer to the underlying file descriptor */
+static int flush(T S) {
+        if (S->isclosed)
+                return -1;
+        errno = 0;
+        int n = (int)Net_write(S->fd, S->buffer, S->length - S->buffer, S->timeout);
+        if (n > 0) {
+                S->bytesWritten += n;
+                if ((S->buffer + n) < S->length) { // Did not write all, shift remaining to the front of buffer
+                        // TODO: Instead of shifting, use buffer as a circular buffer
+                        memmove(S->buffer, S->buffer + n, S->length - (S->buffer + n));
+                }
+                S->length -= n;
+        } else if (n < 0) {
+                n = -1; 
+                S->isclosed = true; 
+        } else if (! (errno == EAGAIN || errno == EWOULDBLOCK)) // peer closed connection
+                n = -1;
+        return n;
+}
+
+
+/* Write a single byte. The byte is written as an int in the range 0 to 255.
+ Returns the byte written, or -1 if a write error occurred */
+static inline int write_byte(T S, uchar_t byte) {
+        if (S->length == S->limit) {
+                if (flush(S) <= 0)
+                        return -1;
+        }
+        *S->length++ = byte;
+        S->sessionWritten++;
+        return byte;
+}
+
+
+/* ------------------------------------------------------- Format handlers */
+
+
+#define pad(n,c) do { int nn = (n); while (nn-- > 0) write_byte(S, (c)); } while (0)
+static void putd(T S, const char *str, int len, unsigned char flags[], int width, int precision) {
+        int sign;
+        assert(str);
+        assert(len >= 0);
+        assert(flags);
+        if (width == INT_MIN)
+                width = 0;
+        if (width < 0) {
+                flags['-'] = 1;
+                width = -width;
+        }
+        if (precision >= 0)
+                flags['0'] = 0;
+        if (len > 0 && (*str == '-' || *str == '+')) {
+                sign = *str++;
+                len--;
+        } else if (flags['+'])
+                sign = '+';
+        else if (flags[' '])
+                sign = ' ';
+        else
+                sign = 0;
+        { int n;
+                if (precision < 0)
+                        precision = 1;
+                if (len < precision)
+                        n = precision;
+                else if (precision == 0 && len == 1 && str[0] == '0')
+                        n = 0;
+                else
+                        n = len;
+                if (sign)
+                        n++;
+                if (flags['-']) {
+                        if (sign)
+                                write_byte(S, sign);
+                } else if (flags['0']) {
+                        if (sign)
+                                write_byte(S, sign);
+                        pad(width - n, '0');
+                } else {
+                        pad(width - n, ' ');
+                        if (sign)
+                                write_byte(S, sign);
+                }
+                pad(precision - len, '0');
+                for (int i = 0; i < len; i++)
+                        write_byte(S, (uchar_t)*str++);
+                if (flags['-'])
+                        pad(width - n, ' '); 
+        }
+}
+
+
+static void cvt_s(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        uchar_t *str = va_arg(box->ap, uchar_t *);
+        assert(str);
+        int len = (int)strlen((char*)str);
+        assert(len >= 0);
+        assert(flags);
+        if (width == INT_MIN)
+                width = 0;
+        if (width < 0) {
+                flags['-'] = 1;
+                width = -width;
+        }
+        if (precision >= 0)
+                flags['0'] = 0;
+        if (precision >= 0 && precision < len)
+                len = precision;
+        if (!flags['-'])
+                pad(width - len, ' ');
+        for (int i = 0; i < len; i++)
+                write_byte(S, *str++);
+        if (flags['-'])
+                pad(width - len, ' ');
+}
+
+
+static void cvt_d(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        int val = va_arg(box->ap, int);
+        unsigned int m;
+        char buf[43];
+        char *p = buf + sizeof buf;
+        if (val == INT_MIN)
+                m = INT_MAX + 1UL;
+        else if (val < 0)
+                m = -val;
+        else
+                m = val;
+        do
+                *--p = m%10 + '0';
+        while ((m /= 10) > 0);
+        if (val < 0)
+                *--p = '-';
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_l(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        long val = va_arg(box->ap, long);
+        unsigned long m;
+        char buf[43];
+        char *p = buf + sizeof buf;
+        if (val == LONG_MIN)
+                m = LONG_MAX + 1UL;
+        else if (val < 0)
+                m = -val;
+        else
+                m = val;
+        do
+                *--p = m%10 + '0';
+        while ((m /= 10) > 0);
+        if (val < 0)
+                *--p = '-';
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_u(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        unsigned long m = va_arg(box->ap, unsigned long);
+        char buf[43];
+        char *p = buf + sizeof buf;
+        do
+                *--p = m%10 + '0';
+        while ((m /= 10) > 0);
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_o(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        unsigned long m = va_arg(box->ap, unsigned long);
+        char buf[43];
+        char *p = buf + sizeof buf;
+        do
+                *--p = (m&0x7) + '0';
+        while ((m>>= 3) != 0);
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_x(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        unsigned long m = va_arg(box->ap, unsigned long);
+        char buf[43];
+        char *p = buf + sizeof buf;
+        do
+                *--p = "0123456789abcdef"[m&0xf];
+        while ((m>>= 4) != 0);
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_p(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        unsigned long m = (unsigned long)va_arg(box->ap, void*);
+        char buf[43];
+        char *p = buf + sizeof buf;
+        precision = INT_MIN;
+        do
+                *--p = "0123456789abcdef"[m&0xf];
+        while ((m>>= 4) != 0);
+        putd(S, p, (int)((buf + sizeof buf) - p), flags, width, precision);
+}
+
+
+static void cvt_c(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        if (width == INT_MIN)
+                width = 0;
+        if (width < 0) {
+                flags['-'] = 1;
+                width = -width;
+        }
+        if (!flags['-'])
+                pad(width - 1, ' ');
+        write_byte(S, va_arg(box->ap, int));
+        if (flags['-'])
+                pad(width - 1, ' ');
+}
+
+
+static void cvt_f(T S, int code, va_list_box *box, unsigned char flags[], int width, int precision) {
+        char buf[DBL_MAX_10_EXP+1+1+99+1];
+        if (precision < 0)
+                precision = 6;
+        if (code == 'g' && precision == 0)
+                precision = 1;
+        {
+                char fmt[] = "%.dd?";
+                assert(precision <= 99);
+                fmt[4] = code;
+                fmt[3] = precision%10 + '0';
+                fmt[2] = (precision/10)%10 + '0';
+                sprintf(buf, fmt, va_arg(box->ap, double));
+        }
+        putd(S, buf, (int)strlen(buf), flags, width, precision);
+}
+
+
+static char *Fmt_flags = "-+ 0";
+static fmt_t cvt[256] = {
+        /*   0-  7 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*   8- 15 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  16- 23 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  24- 31 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  32- 39 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  40- 47 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  48- 55 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  56- 63 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  64- 71 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  72- 79 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  80- 87 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  88- 95 */     0,     0,     0,     0,     0,     0,     0,     0,
+        /*  96-103 */     0,     0,     0, cvt_c, cvt_d, cvt_f, cvt_f, cvt_f,
+        /* 104-111 */     0, cvt_d,     0,     0, cvt_l,     0,     0, cvt_o,
+        /* 112-119 */ cvt_p,     0,     0, cvt_s,     0, cvt_u,     0,     0,
+        /* 120-127 */ cvt_x,     0,     0,     0,     0,     0,     0,     0
+};
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+T OutputStream_new(int descriptor) {
+        T S;
+        NEW(S);
+        S->fd = descriptor;
+        S->timeout = NET_WRITE_TIMEOUT;
+        S->length = S->buffer;
+        S->limit = S->buffer + BUFFER_SIZE;
+        return S;
+}
+
+
+void OutputStream_free(T *S) {
+        assert(S && *S);
+        OutputStream_flush(*S);
+        FREE(*S);
+}
+
+
+/* ------------------------------------------------------------ Properties */
+
+
+int OutputStream_getDescriptor(T S) {
+        assert(S);
+        return S->fd;
+}
+
+
+int OutputStream_buffered(T S) {
+        assert(S);
+        return (int)(S->length - S->buffer);
+}
+
+
+void OutputStream_setTimeout(T S, time_t timeout) {
+        assert(S);
+        assert(timeout >= 0);
+        S->timeout = timeout;
+}
+
+
+time_t OutputStream_getTimeout(T S) {
+        assert(S);
+        return S->timeout;
+}
+
+
+int OutputStream_isClosed(T S) {
+        assert(S);
+        return S->isclosed;
+}
+
+
+long long int OutputStream_getBytesWritten(T S) {
+        assert(S);
+        return S->bytesWritten;
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+int OutputStream_print(T S, const char *s, ...) {
+        assert(S);
+        assert(s);
+        va_list ap;
+        va_start(ap, s);
+        int n = OutputStream_vprint(S, s, ap);
+        va_end(ap);
+        return n;
+}
+
+
+int OutputStream_vprint(T S, const char *fmt, va_list ap) {
+        assert(S);
+        assert(fmt);
+        va_list_box box;
+        va_copy(box.ap, ap);
+        S->sessionWritten = 0;
+        while (*fmt) {
+                if (*fmt != '%' || *++fmt == '%')
+                        write_byte(S, *fmt++);
+                else {
+                        uchar_t c, flags[256] = {0};
+                        int width = INT_MIN, precision = INT_MIN;
+                        for (c = *fmt; c && strchr(Fmt_flags, c); c = *++fmt) {
+                                assert(flags[c] < 255);
+                                flags[c]++;
+                        }
+                        if (*fmt == '*' || isdigit(*fmt)) {
+                                int n;
+                                if (*fmt == '*') {
+                                        n = va_arg(box.ap, int);
+                                        assert(n != INT_MIN);
+                                        fmt++;
+                                } else
+                                        for (n = 0; isdigit(*fmt); fmt++) {
+                                                int d = *fmt - '0';
+                                                assert(n <= (INT_MAX - d)/10);
+                                                n = 10*n + d;
+                                        }
+                                width = n;
+                        }
+                        if (*fmt == '.' && (*++fmt == '*' || isdigit(*fmt))) {
+                                int n;
+                                if (*fmt == '*') {
+                                        n = va_arg(box.ap, int);
+                                        assert(n != INT_MIN);
+                                        fmt++;
+                                } else
+                                        for (n = 0; isdigit(*fmt); fmt++) {
+                                                int d = *fmt - '0';
+                                                assert(n <= (INT_MAX - d)/10);
+                                                n = 10*n + d;
+                                        }
+                                precision = n;
+                        }
+                        c = *fmt++;
+                        if (c == 'l')  {
+                                c = *fmt++;
+                                if (c == 'd' || c == 'i')
+                                        c = 'l';
+                        }
+                        assert(cvt[c]);
+                        cvt[c](S, c, &box, flags, width, precision);
+                }
+        }
+        va_end(box.ap);
+        return S->isclosed ? -1 : S->sessionWritten;
+}
+
+
+int OutputStream_write(T S, const void *b, int size) {
+        assert(S);
+        assert(b);
+        S->sessionWritten = 0;
+        uchar_t *t = (uchar_t*)b;
+        while ((size-- > 0) && (write_byte(S, *t++) != -1));
+        return S->isclosed ? -1 : S->sessionWritten;
+}
+
+
+int OutputStream_flush(T S) {
+        assert(S);
+        if (S->length > S->buffer)
+                return flush(S);
+        return 0;
+}
+
+
+void OutputStream_clear(T S) {
+        assert(S);
+        S->length = S->buffer;
+}
+
diff --git a/monit-5.4/libmonit/src/io/OutputStream.h b/monit-5.4/libmonit/src/io/OutputStream.h
new file mode 100644
index 0000000..3fc73aa
--- /dev/null
+++ b/monit-5.4/libmonit/src/io/OutputStream.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef OUTPUTSTREAM_INCLUDED
+#define OUTPUTSTREAM_INCLUDED
+#include <sys/types.h>
+
+
+/**
+ * An <b>OutputStream</b> can be used for writing text or binary
+ * data (8 bits) to a descriptor. 
+ *
+ * The method OutputStream_isClosed() can be used to test the
+ * underlying descriptor for an error, a write timeout or for EOF.
+ * 
+ * Clients can use this stream in a non-blocking manner by setting 
+ * OutputStream_setTimeout() to 0.
+ * 
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T OutputStream_T
+typedef struct T *T;
+
+
+/**
+ * Create a new OutputStream object.
+ * @param descriptor The descriptor for this OutputStream
+ * @return An OutputStream object
+ */
+T OutputStream_new(int descriptor);
+
+
+/**
+ * Destroy an OutputStream object, release allocated resources and flush
+ * any remaining buffered data in the stream. Call this method to release
+ * an OutputStream object allocated with OutputStream_new()
+ * @param S An OutputStream object reference
+ */
+void OutputStream_free(T *S);
+
+
+/** @name Properties */
+//@{
+
+
+/**
+ * Returns the underlying descriptor for this stream
+ * @param S An OutputStream object
+ * @return The descriptor for this stream 
+ */
+int OutputStream_getDescriptor(T S);
+
+
+/**
+ * Returns the number of bytes in the OutputStream's cache buffer.
+ * I.e. bytes that are cached in stream's internal buffer
+ * @param S An OutputStream object
+ * @return Number of output bytes cached
+ */
+int OutputStream_buffered(T S);
+
+
+/**
+ * Set a write <code>timeout</code> in milliseconds. During a write
+ * operation the stream will wait up to <code>timeout</code>
+ * milliseconds for write to be performed.
+ * @param S An OutputStream object
+ * @param timeout The timeout value in milliseconds
+ * @exception AssertException if timeout isd < 0
+ */
+void OutputStream_setTimeout(T S, time_t timeout);
+
+
+/**
+ * Get the write timeout in milliseconds. 
+ * @param S An OutputStream object
+ * @return The timeout value in milliseconds
+ */
+time_t OutputStream_getTimeout(T S);
+
+
+/**
+ * Returns true if the stream was closed. The stream is closed
+ * if an I/O error occurs
+ * @param S An OutputStream object
+ * @return true if the stream is closed, otherwise false
+ */
+int OutputStream_isClosed(T S);
+
+
+/**
+ * Get the total number of bytes written by the stream to the
+ * underlying descriptor
+ * @param S An OutputStream object
+ * @return The total number of bytes written
+ */
+long long int OutputStream_getBytesWritten(T S);
+
+//@}
+
+/**
+ * Writes a character string. Use this function to send text
+ * based data to the underlying descriptor.
+ * @param S An OutputStream object
+ * @param s A String to send to the client. The string may contain 
+ * format specifiers similar to the ones used by printf(3). The format
+ * specifiers supported are:
+ * <ul>
+ * <li><b>%s, %c</b> - Prints a string (s) or a single char (c)
+ * <li><b>%d, %i, %u, %o, %x</b> - The int argument is printed as a 
+ * signed decimal (d or i), unsigned decimal (u), unsigned octal (o) or 
+ * unsigned hexadecimal (x), respectively. An optional length modifier,
+ * 'l' can be used to prefix d, i, n, o, u or x to specify a long argument
+ * instead of an int argument. 
+ * <li><b>%e, %f, %g</b> - Prints a real number (see printf(3) for details)
+ * <li><b>%p</b> - The void * pointer argument is printed in hexadecimal
+ * </ul>
+ * @return The number of bytes written or -1 if an error occurred. If the 
+ * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned
+ * if a write would block, indicating that the caller should try again later.
+ * @exception AssertException if an unknown format specifier is used in s.
+ */
+int OutputStream_print(T S, const char *s, ...) __attribute__((format (printf, 2, 3)));
+
+
+/**
+ * Writes a character string with a variable argument list. 
+ * @param S An OutputStream object
+ * @param s A String to send to the client. The string may contain 
+ * format specifiers similar to the ones used by printf(3).
+ * @param ap A variable argument lists
+ * @return The number of bytes written or -1 if an error occurred. If the 
+ * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned
+ * if a write would block, indicating that the caller should try again later.
+ * @exception AssertException if an unknown format specifier is used in s.
+ */
+int OutputStream_vprint(T S, const char *s, va_list ap);
+
+        
+/**
+ * Write <code>size</code> bytes from the buffer <code>b</code>.
+ * @param S An OutputStream object
+ * @param b The data to be written
+ * @param size The size of the data in b
+ * @return The number of bytes written or -1 if an error occurred. If the 
+ * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned
+ * if a write would block, indicating that the caller should try again later.
+*/
+int OutputStream_write(T S, const void *b, int size);
+
+
+/**
+ * Flushes this output stream and write any buffered output bytes. 
+ * @param S An OutputStream object
+ * @return The number of bytes written or -1 if an error occurred. If the 
+ * stream uses non-blocking I/O, i.e. timeout is 0, then 0 is also returned
+ * if a write would block, indicating that the caller should try again later.
+ */
+int OutputStream_flush(T S);
+
+
+/**
+ * Clears any data that exists in the output buffer
+ * @param S An OutputStream object
+ */
+void OutputStream_clear(T S);
+
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/system/Command.c b/monit-5.4/libmonit/src/system/Command.c
new file mode 100644
index 0000000..44ead18
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Command.c
@@ -0,0 +1,516 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include "Str.h"
+#include "Dir.h"
+#include "File.h"
+#include "List.h"
+#include "system/Net.h"
+
+#include "system/System.h"
+#include "system/Command.h"
+
+
+/**
+ * Implementation of the Command and Process interfaces.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+#define T Command_T
+struct T {
+        uid_t uid;
+        gid_t gid;
+        List_T env;
+        List_T args;
+        char *working_directory;
+};
+struct Process_T {
+        pid_t pid;
+        uid_t uid;
+        gid_t gid;
+        char **env; 
+        char **args;
+        int status;
+        int stdin_pipe[2];
+        int stdout_pipe[2];
+        int stderr_pipe[2];
+        InputStream_T in;
+        InputStream_T err;
+        OutputStream_T out;
+        char *working_directory;
+};
+const char *Command_Path = "PATH=/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin";
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/* Search the env list and return the pointer to the name (in the list)
+ if found, otherwise NULL */
+static inline char *findEnv(T C, const char *name) {
+        for (list_t p = C->env->head; p; p = p->next)
+                if (Str_startsWith(p->e, name))
+                        return p->e;
+        return NULL;
+}
+
+
+/* Remove env variable and value identified by name */
+static inline void removeEnv(T C, const char *name) {
+        char *e = findEnv(C, name);
+        if (e) {
+                List_remove(C->env, e);
+                FREE(e);
+        }
+}
+
+
+/* Free each string in a list of strings */
+static void freeStrings(List_T l) {
+        while (List_length(l) > 0) {
+                char *s = List_pop(l);
+                FREE(s);
+        }
+}
+
+
+/* Build the Command args list. The list represent the array sent
+ to execv and the List contains the following entries: args[0]
+ is the path to the program, the rest are arguments to the program */
+static void buildArgs(T C, const char *path, const char *x, va_list ap) {
+        freeStrings(C->args);
+        List_append(C->args, Str_dup(path));
+        va_list ap_copy;
+        va_copy(ap_copy, ap);
+        for (; x; x = va_arg(ap_copy, char *))
+                List_append(C->args, Str_dup(x));
+        va_end(ap_copy);
+}
+
+
+/* Create stdio pipes for communication between parent and child process */
+static void createPipes(Process_T P) {
+        if (pipe(P->stdin_pipe) < 0 
+            || pipe(P->stdout_pipe) < 0 
+            || pipe(P->stderr_pipe) < 0) {
+                ERROR("Command pipe(2): Bad file descriptors -- %s", System_getLastError());
+        }
+}
+
+
+/* Setup stdio pipes in subprocess */
+static void setupChildPipes(Process_T P) {
+        close(P->stdin_pipe[1]);   // close write end
+        if (P->stdin_pipe[0] != STDIN_FILENO) {
+                if (dup2(P->stdin_pipe[0],  STDIN_FILENO) != STDIN_FILENO)
+                        ERROR("Command: dup2(stdin) -- %s\n", System_getLastError());
+                close(P->stdin_pipe[0]);
+        }
+        close(P->stdout_pipe[0]);  // close read end
+        if (P->stdout_pipe[1] != STDOUT_FILENO) {
+                if (dup2(P->stdout_pipe[1], STDOUT_FILENO) != STDOUT_FILENO)
+                        ERROR("Command: dup2(stdout) -- %s\n", System_getLastError());
+                close(P->stdout_pipe[1]);
+        }
+        close(P->stderr_pipe[0]);  // close read end
+        if (P->stderr_pipe[1] != STDERR_FILENO) {
+                if (dup2(P->stderr_pipe[1], STDERR_FILENO) != STDERR_FILENO)
+                        ERROR("Command: dup2(stderr) -- %s\n", System_getLastError());
+                close(P->stderr_pipe[1]);
+        }
+}
+
+
+/* Setup stdio pipes in parent process for communication with the subprocess */
+static void setupParentPipes(Process_T P) {
+        close(P->stdin_pipe[0]);    // close read end
+        Net_setNonBlocking(P->stdin_pipe[1]);
+        close(P->stdout_pipe[1]);   // close write end
+        Net_setNonBlocking(P->stdout_pipe[0]);
+        close(P->stderr_pipe[1]);   // close write end
+        Net_setNonBlocking(P->stderr_pipe[0]);
+}
+
+
+/* Close stdio pipes in parent process */
+static void closeParentPipes(Process_T P) {
+        close(P->stdin_pipe[1]);    // close write end
+        close(P->stdout_pipe[0]);   // close read end
+        close(P->stderr_pipe[0]);   // close read end
+}
+
+
+/* Close and destroy opened stdio streams */
+static void closeStreams(Process_T P) {
+        if (P->in) InputStream_free(&P->in);
+        if (P->err) InputStream_free(&P->err);
+        if (P->out) OutputStream_free(&P->out);
+}
+
+
+/* -------------------------------------------------------------- Process_T */
+
+
+static inline void setstatus(Process_T P) {
+        if (WIFEXITED(P->status))
+                P->status = WEXITSTATUS(P->status);
+        else if (WIFSIGNALED(P->status))
+                P->status = WTERMSIG(P->status);
+        else if (WIFSTOPPED(P->status))
+                P->status = WSTOPSIG(P->status);
+}
+
+
+static Process_T Process_new(void) {
+        Process_T P;
+        NEW(P);
+        P->status = -1;
+        return P;
+}
+
+
+void Process_free(Process_T *P) {
+        assert(P && *P);
+        FREE((*P)->args);
+        FREE((*P)->env);
+        FREE((*P)->working_directory);
+        if (Process_isRunning(*P)) 
+                Process_kill(*P);
+        closeParentPipes(*P);
+        closeStreams(*P);
+        FREE(*P);
+}
+
+
+uid_t Process_getUid(Process_T P) {
+        assert(P);
+        return P->uid;
+}
+
+
+gid_t Process_getGid(Process_T P) {
+        assert(P);
+        return P->gid;
+}
+
+
+const char *Process_getDir(Process_T P) {
+        assert(P);
+        if (! P->working_directory) {
+                char t[STRLEN];
+                P->working_directory = Str_dup(Dir_cwd(t, STRLEN));
+        }
+        return P->working_directory;
+}
+
+
+pid_t Process_getPid(Process_T P) {
+        assert(P);
+        return P->pid;
+}
+
+
+int Process_waitFor(Process_T P) {
+        assert(P);
+        if (P->status < 0) {
+                int r;
+                do
+                        r = waitpid(P->pid, &P->status, 0); // Wait blocking
+                while (r == -1 && errno == EINTR);
+                if (r != P->pid) 
+                        P->status = -1;
+                else 
+                        setstatus(P);
+        }
+        return P->status;
+}
+
+
+int Process_exitStatus(Process_T P) {
+        assert(P);
+        if (P->status < 0) {
+                int r;
+                do
+                        r = waitpid(P->pid, &P->status, WNOHANG); // Wait non-blocking
+                while (r == -1 && errno == EINTR); 
+                if (r == 0) // Process is still running
+                        P->status = -1;
+                else 
+                        setstatus(P);
+        }
+        return P->status;
+}
+
+
+int Process_isRunning(Process_T P) {
+        assert(P);
+        errno = 0;
+        return ((getpgid(P->pid) > -1) || (errno == EPERM));
+}
+
+
+OutputStream_T Process_getOutputStream(Process_T P) {
+        assert(P);
+        if (! P->out)
+                P->out = OutputStream_new(P->stdin_pipe[1]);
+        return P->out;
+}
+
+
+InputStream_T Process_getInputStream(Process_T P) {
+        assert(P);
+        if (! P->in)
+                P->in = InputStream_new(P->stdout_pipe[0]);
+        return P->in;
+}
+
+
+InputStream_T Process_getErrorStream(Process_T P) {
+        assert(P);
+        if (! P->err)
+                P->err = InputStream_new(P->stderr_pipe[0]);
+        return P->err;
+}
+
+
+void Process_terminate(Process_T P) {
+        assert(P);
+        kill(P->pid, SIGTERM);
+}
+
+
+void Process_kill(Process_T P) {
+        assert(P);
+        kill(P->pid, SIGKILL);
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+T Command_new(const char *path, const char *arg0, ...) {
+        T C;
+        if (! File_exist(path))
+                THROW(AssertException, "File '%s' does not exist", path ? path : "null");
+        NEW(C);
+        C->env = List_new();
+        C->args = List_new();
+        List_append(C->env, Str_dup(Command_Path));
+        va_list ap;
+        va_start(ap, arg0);
+        buildArgs(C, path, arg0, ap);
+        va_end(ap);
+        return C;
+}
+
+
+void Command_free(T *C) {
+        assert(C && *C);
+        freeStrings((*C)->args);
+        List_free(&(*C)->args);
+        freeStrings((*C)->env);
+        List_free(&(*C)->env);
+        FREE((*C)->working_directory);
+        FREE(*C);
+}
+
+
+void Command_setUid(T C, uid_t uid) {
+        assert(C);
+        C->uid = uid;
+}
+
+
+uid_t Command_getUid(T C) {
+        assert(C);
+        return C->uid;
+}
+
+
+void Command_setGid(T C, gid_t gid) {
+        assert(C);
+        C->gid = gid;
+}
+
+
+gid_t Command_getGid(T C) {
+        assert(C);
+        return C->gid;
+}
+
+
+void Command_setDir(T C, const char *dir) {
+        assert(C);
+        if (dir) { // Allow to set a NULL directory, meaning the calling process's current directory
+                if (! File_isDirectory(dir))
+                        THROW(AssertException, "The working directory '%s' is not a directory", dir);
+                if (! File_isExecutable(dir))
+                        THROW(AssertException, "The working directory '%s' is not accessible", dir);
+        }
+        FREE(C->working_directory);
+        C->working_directory = Str_dup(dir);
+        File_removeTrailingSeparator(C->working_directory);
+}
+
+
+const char *Command_getDir(Command_T C) {
+        assert(C);
+        return C->working_directory;
+}
+
+
+/* Env variables are stored in the environment list as "name=value" strings */
+void Command_setEnv(Command_T C, const char *name, const char *value) {
+        assert(C);
+        assert(name);
+        removeEnv(C, name);
+        List_append(C->env, Str_cat("%s=%s", name, value ? value : ""));
+}
+
+
+void Command_vSetEnv(T C, const char *env, ...) {
+        assert(C);
+        if (STR_DEF(env)) {
+                va_list ap;
+                char *s, *n, *v, *t;
+                va_start(ap, env);
+                n = s = Str_vcat(env, ap);
+                va_end(ap);
+                while ((v = strchr(n, '='))) {
+                        *(v++) = 0;
+                        t = strchr(v, ';');
+                        if (t)
+                                *(t++) = 0;
+                        Command_setEnv(C, Str_trim(n), Str_trim(v));
+                        if (t)
+                                n = t;
+                        else
+                                break;
+                }
+                FREE(s);
+        }
+}
+
+
+/* Returns the value part from a "name=value" environment string */
+const char *Command_getEnv(Command_T C, const char *name) {
+        assert(C);
+        assert(name);
+        char *e = findEnv(C, name);
+        if (e) {
+                char *v = strchr(e, '=');
+                if (v)
+                        return ++v;   
+        }
+        return NULL;
+}
+
+
+List_T Command_getCommand(T C) {
+        assert(C);
+        return C->args;
+}
+
+
+/* The Execute function. Note that we use vfork() rather than fork. Vfork has
+ a special semantic in that the child process runs in the parent address space
+ until exec is called in the child. The child also run first and suspend the
+ parent process until exec or exit is called */
+Process_T Command_execute(T C) {
+        assert(C);
+        volatile int exec_error = 0;
+        Process_T P = Process_new();
+        P->env = (char**)List_toArray(C->env);
+        P->args = (char**)List_toArray(C->args);
+        createPipes(P);
+        if ((P->pid = vfork()) < 0) {
+                ERROR("Command: fork failed -- %s\n", System_getLastError());
+                Process_free(&P);
+                return NULL;
+        }
+        // Child
+        else if (P->pid == 0) { 
+                if (C->working_directory) {
+                        if (! Dir_chdir(C->working_directory)) {
+                                exec_error = errno;
+                                ERROR("Command: sub-process cannot change working directory to '%s' -- %s\n", C->working_directory, System_getLastError());
+                                _exit(errno);
+                        }
+                }
+                if (C->uid)
+                        P->uid = (setuid(C->uid) != 0) ? ERROR("Command: Cannot change process uid to '%d' -- %s\n", C->uid, System_getLastError()), getuid() : C->uid;
+                else
+                        P->uid = getuid();
+                if (C->gid)
+                        P->gid = (setgid(C->gid) != 0) ? ERROR("Command: Cannot change process gid to '%d' -- %s\n", C->gid, System_getLastError()), getgid() : C->gid;
+                else
+                        P->gid = getgid();
+                setsid(); // Loose controlling terminal
+                setupChildPipes(P);
+                // Close all descriptors except stdio
+                int descriptors = getdtablesize();
+                for (int i = 3; i < descriptors; i++)
+                        close(i);
+                // Unblock any signals and reset signal handlers
+                sigset_t mask;
+                sigemptyset(&mask);
+                pthread_sigmask(SIG_SETMASK, &mask, NULL);
+                signal(SIGINT, SIG_DFL);
+                signal(SIGQUIT, SIG_DFL);
+                signal(SIGABRT, SIG_DFL);
+                signal(SIGTERM, SIG_DFL);
+                signal(SIGPIPE, SIG_DFL);
+                signal(SIGCHLD, SIG_DFL); 
+                signal(SIGHUP, SIG_IGN);  // Ensure future opens won't allocate controlling TTYs
+                // Execute the program
+                execve(P->args[0], P->args, P->env);
+                exec_error = errno;
+                _exit(errno);
+        }
+        // Parent
+        if (exec_error != 0)
+                Process_free(&P);
+        else 
+                setupParentPipes(P);
+        errno = exec_error;
+        return P;
+}
diff --git a/monit-5.4/libmonit/src/system/Command.h b/monit-5.4/libmonit/src/system/Command.h
new file mode 100644
index 0000000..bcf1eb6
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Command.h
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef COMMAND_INCLUDED
+#define COMMAND_INCLUDED
+#include <system/Process.h>
+#include <util/List.h>
+
+
+/**
+ * A <b>Command</b> creates operating system processes. Each Command instance
+ * manages a collection of process attributes. The Command_execute() method
+ * creates a new sub-process with those attributes and the method can be invoked
+ * repeatedly from the same instance to create new sub-processes with identical
+ * or related attributes.
+ *
+ * Modifying a Command's attributes will affect processes subsequently created,
+ * but will never affect previously created processes or the calling process
+ * itself.
+ *
+ * @see Process.h
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T Command_T
+typedef struct T *T;
+/** 
+ * Default Path for Command: <code>PATH=/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin</code>. 
+ * May be overridden by Command_setEnv() 
+ */
+extern const char *Command_Path;
+
+
+/**
+ * Create a new Command object and set the operating system program with
+ * arguments to execute. The <code>arg0</code> argument is the first argument
+ * in a sequence of arguments to the program. The arguments list can be thought
+ * of as arg0, arg1, ..., argn. Together they describe a list of one or more
+ * pointers to null-terminated strings that represent the argument list 
+ * available to the executed program specified in <code>path</code>. The 
+ * list of arguments <em style="color:red">must</em> be terminated by a
+ * NULL pointer. Example:
+ * <pre>
+ * Command_new("/bin/ls", NULL)
+ * Command_new("/bin/ls", "-lrt", NULL)
+ * Command_new("/bin/sh", "-c", "ps -aef|egrep mmonit", NULL)
+ * </pre>
+ * @param path A string containing the path to the program to execute
+ * @param arg0 The first argument in a sequence of arguments. The last value
+ * in the arguments list <strong>must</strong> be NULL.
+ * @exception AssertException if the program does not exist or cannot be
+ * executed
+ * @return This Command object
+ */
+T Command_new(const char *path, const char *arg0, ...);
+
+
+/**
+ * Destroy A Command object and release allocated resources. Call this
+ * method to release a Command object allocated with Command_new()
+ * @param C A Command object reference
+ */
+void Command_free(T *C);
+
+
+/** @name Properties */
+//@{
+
+/**
+ * Set the user id the sub-process should switch to on exec. If not set, the uid of 
+ * the calling process is used. Note that this process must run with super-user
+ * privileges for the sub-process to be able to switch uid
+ * @param C A Command object
+ * @param uid The user id the sub-process should switch to when executed
+ */
+void Command_setUid(T C, uid_t uid);
+
+
+/**
+ * Returns the uid the sub-process should switch to on exec. 
+ * @param C A Command object
+ * @return The user id the sub-process should use. Returns 0
+ * if not set, meaning the sub-process will run with the same
+ * uid as this process.
+ */
+uid_t Command_getUid(T C);
+
+
+/**
+ * Set the group id the sub-process should switch to on exec. If not set, the gid of 
+ * the calling process is used. Note that this process must run with super-user
+ * privileges for the sub-process to be able to switch gid
+ * @param C A Command object
+ * @param gid The group id the sub-process should switch to when executed
+ */
+void Command_setGid(T C, gid_t gid);
+
+
+/**
+ * Returns the group id the Command should switch to on exec. 
+ * @param C A Command object
+ * @return The group id the sub-process should use. Returns 0
+ * if not set, meaning the sub-process will run with the same
+ * gid as this process.
+ */
+gid_t Command_getGid(T C);
+
+
+/**
+ * Set the working directory for the sub-process. If directory cannot be changed
+ * the sub-process will exit
+ * @param C A Command object
+ * @param dir The working directory for the sub-process
+ * @exception AssertException if the directory does not exist or is not accessible
+ */
+void Command_setDir(T C, const char *dir);
+
+
+/**
+ * Returns the working directory for the sub-process. Unless previously
+ * set, the returned value is NULL, meaning the calling process's current
+ * directory
+ * @param C A Command object
+ * @return The working directory for the sub-process or NULL meaning the calling
+ * process's current directory
+ */
+const char *Command_getDir(T C);
+
+
+/**
+ * Set or replace the environment variable identified by <code>name</code>.
+ * The sub-process does <em>not</em> inherit the environment from the calling 
+ * process and has only a spartan PATH set by default.
+ * @param C A Command object
+ * @param name The environment variable to set or replace
+ * @param value The value
+ */
+void Command_setEnv(T C, const char *name, const char *value);
+
+
+/**
+ * Set or replace the environment variable(s) specified in <code>env</code>.
+ * The <code>env</code> string is expected to be on a name=value; format
+ * and each name=value pair must be separated with ';'. This is a
+ * convenience function, wrapping Command_setEnv() and is rather inefficient.
+ * @param C A Command object
+ * @param env An environment string containing name=value pairs separated 
+ * with ';'. Example: <code>PATH=/usr/bin; SHELL=/bin/bash;</code>
+ * @see Command_setEnv()
+ */
+void Command_vSetEnv(T C, const char *env, ...);
+
+
+/**
+ * Returns the value of the environment variable identified by 
+ * <code>name</code>. 
+ * @param C A Command object
+ * @param name The environment variable to get the value of
+ * @return The value for name or NULL if name was not found
+ */
+const char *Command_getEnv(T C, const char *name);
+
+
+
+/**
+ * Returns the operating system program with arguments to be executed by 
+ * this Command. The first element in the list is the path to the program
+ * and subsequent elements are arguments to the program. Elements in the 
+ * list are C-strings. 
+ * @param C A Command object
+ * @return A list with the operating system program with arguments to 
+ * execute. The first element in the list is the program.
+ */
+List_T Command_getCommand(T C);
+
+
+//@}
+
+
+/** 
+ * Create a new sub-process using the attributes of this Command object.
+ * The new sub-process will execute the command and arguments given in 
+ * Command_new(). The caller is responsible for releasing the returned
+ * Process_T object by calling Process_free(). If creating the new 
+ * sub-process failed, NULL is returned and errno is set to indicate the
+ * error. Use e.g. System_getLastError() to get a description of the error
+ * that occured.
+ * @param C A Command object
+ * @return A new Process_T object representing the sub-process or NULL
+ * if execute failed.
+ */
+Process_T Command_execute(T C);
+
+
+#undef T
+#endif
+
diff --git a/monit-5.4/libmonit/src/system/Mem.c b/monit-5.4/libmonit/src/system/Mem.c
new file mode 100644
index 0000000..a015846
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Mem.c
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "assert.h"
+#include "System.h"
+#include "MemoryException.h"
+
+
+/**
+ * Implementation of the Mem interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+void *Mem_alloc(long nbytes, const char *func, const char *file, int line){
+	void *ptr;
+	assert(nbytes > 0);
+	ptr = malloc(nbytes);
+	if (ptr == NULL)
+                Exception_throw(&(MemoryException), func, file, line, System_getLastError());
+	return ptr;
+}
+
+
+void *Mem_calloc(long count, long nbytes, const char *func, const char *file, int line) {
+	void *ptr;
+	assert(count > 0);
+	assert(nbytes > 0);
+	ptr = calloc(count, nbytes);
+	if (ptr == NULL)
+                Exception_throw(&(MemoryException), func, file, line, System_getLastError());
+	return ptr;
+}
+
+
+void Mem_free(void *ptr, const char *func, const char *file, int line) {
+	if (ptr)
+		free(ptr);
+}
+
+
+void *Mem_resize(void *ptr, long nbytes, const char *func, const char *file, int line) {
+	assert(nbytes > 0);
+        if (! ptr)
+                return Mem_alloc(nbytes, func, file, line); 
+	ptr = realloc(ptr, nbytes);
+	if (ptr == NULL)
+                Exception_throw(&(MemoryException), func, file, line, System_getLastError());
+	return ptr;
+}
diff --git a/monit-5.4/libmonit/src/system/Mem.h b/monit-5.4/libmonit/src/system/Mem.h
new file mode 100644
index 0000000..ab7b63f
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Mem.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MEM_INCLUDED
+#define MEM_INCLUDED
+
+
+/**
+ * General purpose <b>memory allocation</b> methods.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * Allocate <code>n</code> bytes.
+ * @param n number of bytes to allocate
+ * @return A pointer to the newly allocated memory
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ * @hideinitializer
+ */
+#define ALLOC(n) Mem_alloc((n), __func__, __FILE__, __LINE__)
+
+
+/**
+ * Allocate <code>c</code> objects of size <code>n</code> each.
+ * Same as calling ALLOC(c * n) except this function also clear
+ * the memory region before it is returned. 
+ * @param c number of objects to allocate
+ * @param n object size in bytes
+ * @return A pointer to the newly allocated memory
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>c or n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ * @hideinitializer
+ */
+#define CALLOC(c, n) Mem_calloc((c), (n), __func__, __FILE__, __LINE__)
+
+
+/**
+ * Allocate object <code>p</code> and clear the memory region
+ * before the allocated object is returned. 
+ * @param p Object to allocate
+ * @exception MemoryException if allocation failed
+ * @see AssertException.h, MemoryException.h
+ * @hideinitializer
+ */
+#define NEW(p) ((p) = CALLOC(1, (long)sizeof *(p)))
+
+
+/**
+ * Deallocates <code>p</code>
+ * @param p Object to deallocate
+ * @hideinitializer
+ */
+#define FREE(p) ((void)(Mem_free((p), __func__, __FILE__, __LINE__), (p) = 0))
+
+
+/**
+ * Reallocate <code>p</code> with size <code>n</code>.
+ * @param p pointer to reallocate
+ * @param n new object size in bytes
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ * @hideinitializer
+ */
+#define RESIZE(p, n) ((p) = Mem_resize((p), (n), __func__, __FILE__, __LINE__))
+
+
+/**
+ * Allocate and return <code>size</code> bytes of memory. If 
+ * allocation failed this throws a MemoryException
+ * @param size The number of bytes to allocate
+ * @param func the callee
+ * @param file location of caller
+ * @param line location of caller
+ * @return a pointer to the allocated memory
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ */
+void *Mem_alloc(long size, const char *func, const char *file, int line);
+
+
+/**
+ * Allocate and return memory for <code>count</code> objects, each of 
+ * <code>size</code> bytes. The returned memory is cleared. If allocation
+ * failed this method throws a MemoryException
+ * @param count The number of objects to allocate
+ * @param size The size of each object to allocate
+ * @param func the callee
+ * @param file location of caller
+ * @param line location of caller
+ * @return a pointer to the allocated memory 
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>c or n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ */
+void *Mem_calloc(long count, long size, const char *func, const char *file, int line);
+
+
+/**
+ * Deallocate the memory pointed to by <code>p</code>
+ * @param p The memory to deallocate
+ * @param func the callee
+ * @param file location of caller
+ * @param line location of caller
+ */
+void Mem_free(void *p, const char *func, const char *file, int line);
+
+
+/**
+ * Resize the allocation pointed to by <code>p</code> by <code>size</code>
+ * bytes and return the changed allocation. If allocation failed this 
+ * method throws a MemoryException
+ * @param p A pointer to the allocation to change
+ * @param size The new size of <code>p</code>
+ * @param func the callee
+ * @param file location of caller
+ * @param line location of caller
+ * @return a pointer to the changed memory 
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if <code>n <= 0</code> 
+ * @see AssertException.h, MemoryException.h
+ */
+void *Mem_resize(void *p, long size, const char *func, const char *file, int line);
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/system/Net.c b/monit-5.4/libmonit/src/system/Net.c
new file mode 100644
index 0000000..c6a3622
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Net.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <netdb.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <signal.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <poll.h>
+#include <stdarg.h>
+#include <sys/uio.h>
+#include <sys/stat.h>
+#ifdef HAVE_STROPTS_H
+#include <stropts.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+
+#include "system/Net.h"
+
+                
+/**
+ * Implementation of the Net Facade for Unix Systems.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+int Net_setNonBlocking(int socket) {
+        int  on = 1;
+        return (ioctl(socket, FIONBIO, &on) != -1);
+}
+
+
+int Net_setBlocking(int socket) {
+        int  off = 0;
+        return (ioctl(socket, FIONBIO, &off) != -1);
+}
+
+
+int Net_canRead(int socket, time_t milliseconds) {
+        int r = 0;
+        struct pollfd fds[1];
+        fds[0].fd = socket;
+        fds[0].events = POLLIN;
+        do {
+                r = poll(fds, 1, (int)milliseconds);
+        } while (r == -1 && errno == EINTR);
+        return (r > 0);
+}
+
+
+int Net_canWrite(int socket, time_t milliseconds) {
+        int r = 0;
+        struct pollfd fds[1];
+        fds[0].fd = socket;
+        fds[0].events = POLLOUT;
+        do {
+                r = poll(fds, 1, (int)milliseconds);
+        } while (r == -1 && errno == EINTR);
+        return (r > 0);
+}
+
+
+size_t Net_read(int socket, void *buffer, size_t size, time_t timeout) {
+	ssize_t n = 0;
+        if (size > 0) {
+                do {
+                        n = read(socket, buffer, size);
+                } while (n == -1 && errno == EINTR);
+                if (n == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+                        if ((timeout == 0) || (Net_canRead(socket, timeout) == false))
+                                return 0;
+                        do {
+                                n = read(socket, buffer, size);
+                        } while (n == -1 && errno == EINTR);
+                }
+        }
+	return n;
+}
+
+
+size_t Net_write(int socket, const void *buffer, size_t size, time_t timeout) {
+	ssize_t n = 0;
+        if (size > 0) {
+                do {
+                        n = write(socket, buffer, size);
+                } while (n == -1 && errno == EINTR);
+                if (n == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+                        if ((timeout == 0) || (Net_canWrite(socket, timeout) == false))
+                                return 0;
+                        do {
+                                n = write(socket, buffer, size);
+                        } while (n == -1 && errno == EINTR);
+                }
+        }
+	return n;
+}
+
+
+int Net_isSocket(int fd) {
+        struct stat buf;
+        return (fstat(fd, &buf) == 0 && S_ISSOCK(buf.st_mode));
+}
diff --git a/monit-5.4/libmonit/src/system/Net.h b/monit-5.4/libmonit/src/system/Net.h
new file mode 100644
index 0000000..73fffd4
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Net.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef NET_INCLUDED
+#define NET_INCLUDED
+#include <sys/types.h>
+#include <sys/socket.h>
+
+
+/**
+ * Facade for system specific network and socket operation.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * Number of milli seconds before a socket write timeout
+ */
+#define NET_WRITE_TIMEOUT       3000
+
+/**
+ * Number of milli seconds before a socket read timeout
+ */
+#define NET_READ_TIMEOUT        3000
+
+
+/**
+ * Enable nonblocking i|o on the given socket.
+ * @param socket A socket
+ * @return true if success, otherwise false
+ */
+int Net_setNonBlocking(int socket);
+
+
+/**
+ * Disable nonblocking i|o on the given socket
+ * @param socket A socket
+ * @return true if success, otherwise false
+ */
+int Net_setBlocking(int socket);
+
+
+/**
+ * Check if data is available, if not, wait timeout milliseconds for data
+ * to be present.
+ * @param socket A socket
+ * @param milliseconds How long to wait before timeout
+ * @return true if the event occured, otherwise false.
+ */
+int Net_canRead(int socket, time_t milliseconds);
+
+
+/**
+ * Check if data can be sent to the socket, if not, wait timeout
+ * milliseconds for the socket to be ready.
+ * @param socket A socket
+ * @param milliseconds How long to wait before timeout
+ * @return true if the event occured, otherwise false.
+ */
+int Net_canWrite(int socket, time_t milliseconds);
+
+
+/**
+ * Read up to size bytes from the <code>socket</code> into the
+ * <code>buffer</code>. If data is not available wait for
+ * <code>timeout</code> milliseconds.
+ * @param socket the Socket to read data from
+ * @param buffer The buffer to write the data to
+ * @param size Number of bytes to read from the socket
+ * @param timeout Milliseconds to wait for data to be available
+ * @return The number of bytes read or -1 if an error occured.
+ */
+size_t Net_read(int socket, void *buffer, size_t size, time_t timeout);
+
+
+/**
+ * Write <code>size</code> bytes from the <code>buffer</code> to the
+ * <code>socket</code> 
+ * @param socket the Socket to write to
+ * @param buffer The buffer to write
+ * @param size Number of bytes to send
+ * @param timeout Milliseconds to wait for data to be sent
+ * @return The number of bytes sent or -1 if an error occured. 
+ */
+size_t Net_write(int socket, const void *buffer, size_t size, time_t timeout);
+
+
+/**
+ * Returns true if fd is a socket otherwise, false.
+ * @param fd File descriptor to test
+ * @return true if fd is a socket, otherwise false.
+ */
+int Net_isSocket(int fd);
+
+#endif
diff --git a/monit-5.4/libmonit/src/system/Process.h b/monit-5.4/libmonit/src/system/Process.h
new file mode 100644
index 0000000..c86b13c
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Process.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef PROCESS_INCLUDED
+#define PROCESS_INCLUDED
+#include <sys/types.h>
+#include "io/InputStream.h"
+#include "io/OutputStream.h"
+
+/**
+ * A <b>Process</b> represent an operating system process. A new Process 
+ * object is created via Command_execute(). 
+ * 
+ * The sub-process represented by this Process does not have its own terminal 
+ * or console. All its standard I/O (i.e. stdin, stdout, stderr) operations 
+ * will be redirected to the parent process where they can be accessed using 
+ * the streams obtained using the methods Process_getOutputStream(), 
+ * Process_getInputStream(), and Process_getErrorStream(). Your program can 
+ * then use these streams to feed input to and get output from the sub-process.
+ * 
+ * The sub-process continues executing until it stops or until either 
+ * Process_free() is called or it is terminated with either Process_terminate()
+ * or Process_kill().
+ *
+ * <h4>Environment</h4>
+ * The Process does <em>not</em> inherit the environment from the calling 
+ * process and has only a spartan PATH set by default; defined by 
+ * Command_Path. Clients should call Command_setEnv() to set environment 
+ * variables as needed <em>before</em> calling Command_execute()
+ *
+ * @see Command.h
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T Process_T
+typedef struct T *T;
+
+
+/**
+ * Destroy a Process object and free allocated resources. Clients
+ * should call this method when they are done with the Process object.
+ * This method will kill the sub-process represented by this Process
+ * object if it is still running and close down stdio to the sub-process.
+ * @param P a Process object reference
+ */
+void Process_free(T *P);
+
+
+/** @name Properties */
+//@{
+
+/**
+ * Returns the user id of the sub-process
+ * @param P A Process object
+ * @return The user id the sub-process
+ */
+uid_t Process_getUid(T P);
+
+
+/**
+ * Returns the group id of the sub-process
+ * @param P A Process object
+ * @return The group id the sub-process
+ */
+gid_t Process_getGid(T P);
+
+
+/**
+ * Returns the Process timeout. 
+ * @param P A Process object
+ * @return The number of seconds this Process has until exit before
+ * the <code>onTimeout</code> handler is called if it is defined for
+ * the Command. 0 means that there is no timeout.
+ */
+int Process_getTimeout(T P);
+
+
+/**
+ * Returns the working directory of the Process
+ * @param P A Process object
+ * @return The Process working directory
+ */
+const char *Process_getDir(T P);
+
+
+/**
+ * Returns the Process's identification number
+ * @param P A Process object
+ * @return The process identification number of the sub-process
+ */
+pid_t Process_getPid(T P);
+
+
+/**
+ * Causes the current thread to wait, if necessary, until the sub-process
+ * represented by this Process object has terminated. This method returns
+ * immediately if the sub-process has already terminated. If the sub-process
+ * has not yet terminated, the calling thread will be blocked until the 
+ * sub-process exits. By convention, the value 0 indicates normal termination.
+ * @param P A Process object
+ * @return The exit status of the sub-process or -1 if an error occur. 
+ * Investigate errno for a description of the error
+ */
+int Process_waitFor(T P);
+
+
+/**
+ * Returns the Process exit status. If the sub-process is still running, this 
+ * method returns -1, otherwise the sub-process exit status. By convention, 
+ * the value 0 indicates normal termination. 
+ * @param P A Process object
+ * @return The exit status of the sub-process or -1 if the sub-process is still
+ * running.
+ */
+int Process_exitStatus(T P);
+
+
+/**
+ * Returns true if the sub-process is running otherwise false
+ * @param P A Process object
+ * @return True if Process is running otherwise false
+ */
+int Process_isRunning(T P);
+
+
+/**
+ * Returns the output stream connected to the normal input of the sub-process. 
+ * Output to the stream is piped into the standard input of the process 
+ * represented by this Process object. 
+ * @param P A Process object
+ * @return The output stream connected to the normal input of the sub-process.
+ */
+OutputStream_T Process_getOutputStream(T P);
+
+
+/**
+ * Returns the input stream connected to the normal output of the sub-process. 
+ * The stream obtains data piped from the standard output of the process 
+ * represented by this Process object.
+ * @param P A Process object
+ * @return The input stream connected to the normal output of the sub-process.
+ */
+InputStream_T Process_getInputStream(T P);
+
+
+/**
+ * Returns the input stream connected to the error output of the sub-process. 
+ * The stream obtains data piped from the error output of the process 
+ * represented by this Process object. 
+ * @param P A Process object
+ * @return The input stream connected to the error output of the sub-process.
+ */
+InputStream_T Process_getErrorStream(T P);
+
+
+//@}
+
+
+/**
+ * Destroy the sub-process. The sub-process is destroyed by sending
+ * it a termination signal (SIGTERM)
+ * @param P A Process object
+ */
+void Process_terminate(T P);
+
+
+/**
+ * Kill the sub-process. The sub-process is destroyed by sending
+ * it a termination signal (SIGKILL). While SIGTERM may be blocked
+ * by a process, SIGKILL can not be blocked and will kill the process
+ * @param P A Process object
+ */
+void Process_kill(T P);
+
+
+#undef T
+#endif
+
diff --git a/monit-5.4/libmonit/src/system/System.c b/monit-5.4/libmonit/src/system/System.c
new file mode 100644
index 0000000..ad59f0d
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/System.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "Str.h"
+#include "system/System.h"
+
+
+/**
+ * Implementation of the System Facade for Unix Systems.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+ 
+
+/* ----------------------------------------------------------- Definitions */
+
+
+extern void(*_AbortHandler)(const char *error, va_list ap);
+extern void(*_ErrorHandler)(const char *error, va_list ap);
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+const char *System_getLastError(void) { 
+        return strerror(errno); 
+}
+
+
+const char *System_getError(int error) { 
+        return strerror(error); 
+}
+
+
+void System_abort(const char *e, ...) {
+        va_list ap;
+        va_start(ap, e);
+        if (_AbortHandler) 
+                _AbortHandler(e, ap);
+        else {
+                vfprintf(stderr, e, ap);
+                abort();
+        }
+        va_end(ap);
+}
+
+
+void System_error(const char *e, ...) {
+        va_list ap;
+        va_start(ap, e);
+        if (_ErrorHandler) 
+                _ErrorHandler(e, ap);
+        else 
+                vfprintf(stderr, e, ap);
+        va_end(ap);
+}
diff --git a/monit-5.4/libmonit/src/system/System.h b/monit-5.4/libmonit/src/system/System.h
new file mode 100644
index 0000000..daca3f5
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/System.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef SYSTEM_INCLUDED
+#define SYSTEM_INCLUDED
+
+
+/**
+ * System routines
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * Returns a String describing the last system error
+ * @return The last error message
+ */
+const char *System_getLastError(void);
+
+
+/**
+ * Returns a String describing the error code
+ * @param error error code to lookup
+ * @return The error string for the given code
+ */
+const char *System_getError(int error);
+
+
+/**
+ * Prints the given error message to <code>stderr</code> and 
+ * <code>abort(3)</code> the application. If an AbortHandler callback 
+ * function is defined for the library, this function is called instead.
+ * @param e A formated (printf-style) message string
+ */
+void System_abort(const char *e, ...) __attribute__((format (printf, 1, 2)));
+
+
+/**
+ * Prints the given error message to <code>stderr</code>. If an ErrorHandler
+ * callback function is defined for the library, this function is called instead.
+ * @param e A formated (printf-style) message string
+ */
+void System_error(const char *e, ...) __attribute__((format (printf, 1, 2)));
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/system/Time.c b/monit-5.4/libmonit/src/system/Time.c
new file mode 100644
index 0000000..7c3f231
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Time.c
@@ -0,0 +1,777 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+#include "Str.h"
+#include "system/System.h"
+#include "system/Time.h"
+
+
+/**
+ * Implementation of the Time interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+#define CTIME       "%a %b %d %H:%M:%S %z %Y"
+#define RFC822      "%a, %d %b %Y %H:%M:%S %z"
+#define RFC1123     "%a, %d %b %Y %H:%M:%S GMT"
+
+#define TEST_RANGE(v, f, t) \
+        do { \
+                if (v < f || v > t) \
+                        THROW(AssertException, "#v is outside the range (%d..%d)", f, t); \
+        } while (0)
+
+static const char days[] = "SunMonTueWedThuFriSat";
+static const char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
+#define MONTHS_LEN 36
+
+
+/* --------------------------------------------------------------- Private */
+
+
+static time_t parseDate(const char *date) {
+#define YYCTYPE     char
+#define YYCURSOR    date
+#define YYLIMIT     end
+#define YYMARKER    m
+#define YYFILL(n)   ((void)0)  
+	const char *t;
+	const char *m;
+	struct tm time = {0};
+	const char *end = date + strlen(date);
+	time.tm_mon   = -1;
+	time.tm_year  = -1;
+	time.tm_mday  = -1;
+	time.tm_isdst = -1;
+	for (;;) {
+		if (YYCURSOR >= YYLIMIT) {
+			if (time.tm_mon== -1 || time.tm_year== -1 || time.tm_mday== -1)
+				return -1;
+			return mktime(&time);
+		}
+		t = YYCURSOR;
+                {
+                        YYCTYPE yych;
+                        unsigned int yyaccept = 0;
+                        
+                        if ((YYLIMIT - YYCURSOR) < 8) YYFILL(8);
+                        yych = *YYCURSOR;
+                        switch (yych) {
+                                case '0':
+                                case '1':
+                                case '2':
+                                case '3':
+                                case '4':
+                                case '5':
+                                case '6':
+                                case '7':
+                                case '8':
+                                case '9':	goto yy11;
+                                case 'A':
+                                case 'a':	goto yy6;
+                                case 'D':
+                                case 'd':	goto yy10;
+                                case 'F':
+                                case 'f':	goto yy4;
+                                case 'J':
+                                case 'j':	goto yy2;
+                                case 'M':
+                                case 'm':	goto yy5;
+                                case 'N':
+                                case 'n':	goto yy9;
+                                case 'O':
+                                case 'o':	goto yy8;
+                                case 'S':
+                                case 's':	goto yy7;
+                                default:	goto yy12;
+                        }
+                yy2:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych <= 'U') {
+                                if (yych == 'A') goto yy53;
+                                if (yych >= 'U') goto yy52;
+                        } else {
+                                if (yych <= 'a') {
+                                        if (yych >= 'a') goto yy53;
+                                } else {
+                                        if (yych == 'u') goto yy52;
+                                }
+                        }
+                yy3:
+                        {
+                                continue;
+                        }
+                yy4:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'E') goto yy49;
+                        if (yych == 'e') goto yy49;
+                        goto yy3;
+                yy5:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'A') goto yy44;
+                        if (yych == 'a') goto yy44;
+                        goto yy3;
+                yy6:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych <= 'U') {
+                                if (yych == 'P') goto yy39;
+                                if (yych <= 'T') goto yy3;
+                                goto yy38;
+                        } else {
+                                if (yych <= 'p') {
+                                        if (yych <= 'o') goto yy3;
+                                        goto yy39;
+                                } else {
+                                        if (yych == 'u') goto yy38;
+                                        goto yy3;
+                                }
+                        }
+                yy7:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'E') goto yy35;
+                        if (yych == 'e') goto yy35;
+                        goto yy3;
+                yy8:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'C') goto yy32;
+                        if (yych == 'c') goto yy32;
+                        goto yy3;
+                yy9:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'O') goto yy29;
+                        if (yych == 'o') goto yy29;
+                        goto yy3;
+                yy10:
+                        yyaccept = 0;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych == 'E') goto yy26;
+                        if (yych == 'e') goto yy26;
+                        goto yy3;
+                yy11:
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy3;
+                        if (yych <= '9') goto yy13;
+                        goto yy3;
+                yy12:
+                        yych = *++YYCURSOR;
+                        goto yy3;
+                yy13:
+                        yyaccept = 1;
+                        yych = *(YYMARKER = ++YYCURSOR);
+                        if (yych <= '/') goto yy14;
+                        if (yych <= '9') goto yy15;
+                        if (yych <= ':') goto yy17;
+                yy14:
+                        {
+                                if (sscanf(t, "%d", &time.tm_mday) != 1)
+                                        time.tm_mday = -1;
+                                continue;
+                        }
+                yy15:
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy16;
+                        if (yych <= '9') goto yy24;
+                yy16:
+                        YYCURSOR = YYMARKER;
+                        if (yyaccept <= 0) {
+                                goto yy3;
+                        } else {
+                                goto yy14;
+                        }
+                yy17:
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy16;
+                        if (yych >= ':') goto yy16;
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy16;
+                        if (yych >= ':') goto yy16;
+                        yych = *++YYCURSOR;
+                        if (yych != ':') goto yy16;
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy16;
+                        if (yych >= ':') goto yy16;
+                        yych = *++YYCURSOR;
+                        if (yych <= '/') goto yy16;
+                        if (yych >= ':') goto yy16;
+                        ++YYCURSOR;
+                        {
+                                sscanf(t, "%d:%d:%d", &time.tm_hour, &time.tm_min, &time.tm_sec);
+                                continue;
+                        }
+                yy24:
+                        ++YYCURSOR;
+                        {
+                                if (sscanf(t, "%d", &time.tm_year) == 1)
+                                        time.tm_year -=1900;
+                                else
+                                        time.tm_year = -1;
+                                continue;
+                        }
+                yy26:
+                        yych = *++YYCURSOR;
+                        if (yych == 'C') goto yy27;
+                        if (yych != 'c') goto yy16;
+                yy27:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 11;
+                                continue;
+                        }
+                yy29:
+                        yych = *++YYCURSOR;
+                        if (yych == 'V') goto yy30;
+                        if (yych != 'v') goto yy16;
+                yy30:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 10;
+                                continue;
+                        }
+                yy32:
+                        yych = *++YYCURSOR;
+                        if (yych == 'T') goto yy33;
+                        if (yych != 't') goto yy16;
+                yy33:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 9;
+                                continue;
+                        }
+                yy35:
+                        yych = *++YYCURSOR;
+                        if (yych == 'P') goto yy36;
+                        if (yych != 'p') goto yy16;
+                yy36:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 8;
+                                continue;
+                        }
+                yy38:
+                        yych = *++YYCURSOR;
+                        if (yych == 'G') goto yy42;
+                        if (yych == 'g') goto yy42;
+                        goto yy16;
+                yy39:
+                        yych = *++YYCURSOR;
+                        if (yych == 'R') goto yy40;
+                        if (yych != 'r') goto yy16;
+                yy40:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 3;
+                                continue;
+                        }
+                yy42:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 7;
+                                continue;
+                        }
+                yy44:
+                        yych = *++YYCURSOR;
+                        if (yych <= 'Y') {
+                                if (yych == 'R') goto yy45;
+                                if (yych <= 'X') goto yy16;
+                                goto yy47;
+                        } else {
+                                if (yych <= 'r') {
+                                        if (yych <= 'q') goto yy16;
+                                } else {
+                                        if (yych == 'y') goto yy47;
+                                        goto yy16;
+                                }
+                        }
+                yy45:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 2;
+                                continue;
+                        }
+                yy47:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 4;
+                                continue;
+                        }
+                yy49:
+                        yych = *++YYCURSOR;
+                        if (yych == 'B') goto yy50;
+                        if (yych != 'b') goto yy16;
+                yy50:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 1;
+                                continue;
+                        }
+                yy52:
+                        yych = *++YYCURSOR;
+                        if (yych <= 'N') {
+                                if (yych == 'L') goto yy58;
+                                if (yych <= 'M') goto yy16;
+                                goto yy56;
+                        } else {
+                                if (yych <= 'l') {
+                                        if (yych <= 'k') goto yy16;
+                                        goto yy58;
+                                } else {
+                                        if (yych == 'n') goto yy56;
+                                        goto yy16;
+                                }
+                        }
+                yy53:
+                        yych = *++YYCURSOR;
+                        if (yych == 'N') goto yy54;
+                        if (yych != 'n') goto yy16;
+                yy54:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 0;
+                                continue;
+                        }
+                yy56:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 5;
+                                continue;
+                        }
+                yy58:
+                        ++YYCURSOR;
+                        {
+                                time.tm_mon = 6;
+                                continue;
+                        }
+                }
+	}
+	return -1;
+}
+
+
+/* ----------------------------------------------------------------- Class */
+
+
+time_t Time_build(int year, int month, int day, int hour, int min, int sec) {
+        struct tm tm = {.tm_isdst = -1};
+        TEST_RANGE(year, 1970, 2037);
+        TEST_RANGE(month, 1, 12);
+        TEST_RANGE(day, 1, 31);
+        TEST_RANGE(hour, 0, 23);
+        TEST_RANGE(min, 0, 59);
+        TEST_RANGE(sec, 0, 61);
+        tm.tm_year = (year - 1900);
+        tm.tm_mon  = (month - 1);
+        tm.tm_mday = day;
+        tm.tm_hour = hour;
+        tm.tm_min  = min;
+        tm.tm_sec  = sec;
+        return mktime(&tm);
+}
+
+
+time_t Time_parse(const char *date) {
+	if (STR_DEF(date))
+		return parseDate(date);
+	return -1;
+}
+
+
+time_t Time_now(void) {
+	struct timeval t;
+	if (gettimeofday(&t, NULL) != 0)
+                THROW(AssertException, "%s", System_getLastError());
+	return t.tv_sec;
+}
+
+
+long long int Time_milli(void) {
+	struct timeval t;
+	if (gettimeofday(&t, NULL) != 0)
+                THROW(AssertException, "%s", System_getLastError());
+	return (long long int)t.tv_sec * 1000  +  (long long int)t.tv_usec / 1000;
+}
+
+
+time_t Time_gmt(time_t localtime) {
+	struct tm r;
+	gmtime_r(&localtime, &r);
+	return mktime(&r);
+}
+
+
+int Time_seconds(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return tm.tm_sec;
+}
+
+
+int Time_minutes(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return tm.tm_min;
+}
+
+
+int Time_hour(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return tm.tm_hour;
+}
+
+
+int Time_weekday(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return tm.tm_wday;
+}
+
+
+int Time_day(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return tm.tm_mday;
+}
+
+
+int Time_month(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return (tm.tm_mon + 1);
+}
+
+
+int Time_year(time_t time) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        return (tm.tm_year + 1900);
+}
+
+
+time_t Time_add(time_t time, int years, int months, int days) {
+        struct tm tm;
+        localtime_r(&time, &tm);
+        tm.tm_year += years;
+        tm.tm_mon += months;
+        tm.tm_mday += days;
+        tm.tm_isdst = -1;
+        return mktime(&tm);
+}
+
+
+int Time_daysBetween(time_t to, time_t from) {
+        double t = difftime(to, from);
+        if (t < 0) t *= -1;
+	return ((t + (86400L/2))/86400L);
+}
+
+
+char *Time_string(time_t time, char *result) {
+#define i2a(i) (x[0]=(i/10)+'0', x[1]=(i%10)+'0')
+        if (result) {
+                char x[2];
+                struct tm ts;
+                /* This implementation needs to be fast and is around 50%
+                   faster than strftime */
+                localtime_r((const time_t *)&time, &ts);
+                memcpy(result, "aaa, xx aaa xxxx xx:xx:xx\0", 26);
+                /*              0    5  8   1214 17 20 2326 */
+                memcpy(result, days+3*ts.tm_wday, 3);
+                i2a(ts.tm_mday);
+                result[5] = x[0];
+                result[6] = x[1];
+                memcpy(result + 8, months+3*ts.tm_mon, 3);
+                i2a((ts.tm_year+1900)/100);
+                result[12] = x[0];
+                result[13] = x[1];
+                i2a((ts.tm_year+1900)%100);
+                result[14] = x[0];
+                result[15] = x[1];
+                i2a(ts.tm_hour);
+                result[17] = x[0];
+                result[18] = x[1];
+                i2a(ts.tm_min);
+                result[20] = x[0];
+                result[21] = x[1];
+                i2a(ts.tm_sec);
+                result[23] = x[0];
+                result[24] = x[1];
+        }
+	return result;     
+}
+
+
+char *Time_gmtstring(time_t time, char *result) {
+        if (result) {
+                char x[2];
+                struct tm ts;
+                /* This implementation needs to be fast and is around 50%
+                 faster than strftime */
+                gmtime_r(&time, &ts);
+                memcpy(result, "aaa, xx aaa xxxx xx:xx:xx GMT\0", 30);
+                /*              0    5  8   1214 17 20 23    29 */
+                memcpy(result, days+3*ts.tm_wday, 3);
+                i2a(ts.tm_mday);
+                result[5] = x[0];
+                result[6] = x[1];
+                memcpy(result + 8, months+3*ts.tm_mon, 3);
+                i2a((ts.tm_year+1900)/100);
+                result[12] = x[0];
+                result[13] = x[1];
+                i2a((ts.tm_year+1900)%100);
+                result[14] = x[0];
+                result[15] = x[1];
+                i2a(ts.tm_hour);
+                result[17] = x[0];
+                result[18] = x[1];
+                i2a(ts.tm_min);
+                result[20] = x[0];
+                result[21] = x[1];
+                i2a(ts.tm_sec);
+                result[23] = x[0];
+                result[24] = x[1];
+        }
+	return result;     
+}
+
+
+char *Time_fmt(char *result, int size, const char *format, time_t time) {
+        struct tm tm;
+        assert(result);
+        assert(format);
+        localtime_r((const time_t *)&time, &tm);
+        if (strftime(result, size, format, &tm) == 0) 
+                *result = 0;
+	return result;
+}
+
+
+char *Time_uptime(time_t sec, char *result) {
+        // Write max 24 bytes to result
+        if (result) {
+                int n = 0;
+                time_t r = 0;
+                result[0] = 0;
+                if (sec > 0) {
+                        if ((r = sec/86400) > 0) {
+                                n = snprintf(result, 24, "%ldd", r);
+                                sec -= r * 86400;
+                        }
+                        if((r = sec/3600) > 0) {
+                                n += snprintf(result + n, (24 - n), "%s%ldh", n ? ", " : "", r);
+                                sec -= r * 3600;
+                        }
+                        r = sec/60;
+                        snprintf(result + n, (24 - n), "%s%ldm", n ? ", " : "", r);
+                }
+        }
+        return result;
+}
+
+
+/* 
+ cron string is on format "minute hour day month wday"
+ where fields may have a numeric type, an asterix, a 
+ sequence of numbers or a range 
+ */
+int Time_incron(const char *cron, time_t time) {
+        assert(cron);
+#undef YYCURSOR 
+#undef YYLIMIT  
+#undef YYMARKER 
+#define YYCURSOR cron
+#define YYLIMIT  end
+#define YYMARKER m
+#define YYTOKEN  t
+	const char *m;
+	const char *t;
+	const char *end = cron + strlen(cron);
+        int n = 0;
+        int found = 0;
+        int fields[] = {Time_minutes(time), Time_hour(time), Time_day(time), Time_month(time), Time_weekday(time)};
+parse:
+        if (YYCURSOR >= YYLIMIT)
+                return found == 5;
+        YYTOKEN = YYCURSOR;
+	
+        {
+                YYCTYPE yych;
+                static const unsigned char yybm[] = {
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        128, 128, 128, 128, 128, 128, 128, 128, 
+                        128, 128,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                        0,   0,   0,   0,   0,   0,   0,   0, 
+                };
+                if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+                yych = *YYCURSOR;
+                if (yych <= ' ') {
+                        if (yych <= '\f') {
+                                if (yych <= 0x08) goto yy70;
+                                if (yych >= '\v') goto yy70;
+                        } else {
+                                if (yych <= '\r') goto yy62;
+                                if (yych <= 0x1F) goto yy70;
+                        }
+                } else {
+                        if (yych <= '+') {
+                                if (yych == '*') goto yy64;
+                                goto yy70;
+                        } else {
+                                if (yych <= ',') goto yy66;
+                                if (yych <= '/') goto yy70;
+                                if (yych <= '9') goto yy68;
+                                goto yy70;
+                        }
+                }
+        yy62:
+                ++YYCURSOR;
+                {
+                        goto parse;
+                }
+        yy64:
+                ++YYCURSOR;
+                {
+                        n++;
+                        found++;
+                        goto parse;
+                }
+        yy66:
+                ++YYCURSOR;
+                {
+                        n--; // backtrack on field advance
+                        assert(n < 5 && n >= 0);
+                        goto parse;
+                }
+        yy68:
+                yych = *(YYMARKER = ++YYCURSOR);
+                goto yy73;
+        yy69:
+                {
+                        int v = Str_parseInt(YYTOKEN);
+                        if (fields[n] == v)
+                                found++;
+                        n++;
+                        goto parse;
+                }
+        yy70:
+                ++YYCURSOR;
+                {
+                        return false;
+                }
+        yy72:
+                YYMARKER = ++YYCURSOR;
+                if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+                yych = *YYCURSOR;
+        yy73:
+                if (yybm[0+yych] & 128) {
+                        goto yy72;
+                }
+                if (yych != '-') goto yy69;
+                yych = *++YYCURSOR;
+                if (yych <= '/') goto yy75;
+                if (yych <= '9') goto yy76;
+        yy75:
+                YYCURSOR = YYMARKER;
+                goto yy69;
+        yy76:
+                ++YYCURSOR;
+                if (YYLIMIT <= YYCURSOR) YYFILL(1);
+                yych = *YYCURSOR;
+                if (yych <= '/') goto yy78;
+                if (yych <= '9') goto yy76;
+        yy78:
+                {
+                        int from = Str_parseInt(YYTOKEN);
+                        int to = Str_parseInt(strchr(YYTOKEN, '-') + 1);
+                        if ((fields[n] <= to) && (fields[n] >= from))
+                                found++;
+                        n++;
+                        goto parse;
+                }
+        }
+	return found == 5;
+}
+
+
+void Time_usleep(long u) {
+#ifdef NETBSD
+        // usleep is broken on NetBSD (at least in version 5.1)
+        struct timespec t = {u / 1000000, (u % 1000000) * 1000};
+        nanosleep(&t, NULL);
+#else
+        usleep((useconds_t)u);
+#endif
+}
+
diff --git a/monit-5.4/libmonit/src/system/Time.h b/monit-5.4/libmonit/src/system/Time.h
new file mode 100644
index 0000000..37e1140
--- /dev/null
+++ b/monit-5.4/libmonit/src/system/Time.h
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef TIME_INCLUDED
+#define TIME_INCLUDED
+
+
+/**
+ * <b>Time</b> is an abstraction of date and time. Time is stored internally 
+ * as the number of seconds and microseconds since the epoch, <i>January 1, 
+ * 1970 00:00 UTC</i>. 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/** @name class methods */
+//@{ 
+
+/**
+ * Factory method for building a specific time. Time is normalized and 
+ * built in the local time zone.
+ * @param year the year ~ (1970..2037) for this time
+ * @param month the month (January=1..December=12) 
+ * @param day the day of the month (1..31)
+ * @param hour the hour (0..23)
+ * @param min the minutes (0..59)
+ * @param sec the seconds of the minute (0..61). Yes, seconds can range 
+ * from 0 to 61. This allows the system to inject leap seconds.
+ * @return A time_t representing the specified time
+ * @exception AssertException If a parameter is outside the valid range
+ */
+time_t Time_build(int year, int month, int day, int hour, int min, int sec);
+
+
+/**
+ * Parse a Date string and return a <code>time_t</code> representation of 
+ * the parsed string. The method parse standard 
+ * <a href="ftp://ftp.rfc-editor.org/in-notes/rfc21123.txt">RFC1123</a> 
+ * date strings on the format <code>Thu, 17 Oct 2002 19:10:01</code>. Any 
+ * permutations of such a string can also be parsed, for example a Unix
+ * date string or a RFC822 date. Any timezone in <code>date</code> is
+ * ignored and the time is parsed using local zone. The following list 
+ * show some examples:
+ * <ul>
+ * <li>Fri, 12 Jan 2007 19:10:01</li>
+ * <li>Fri Jan 12 02:29:54 CET 2007</li>
+ * <li>October 17, 2002, time 19:10:01 GMT</li>
+ * <li>/2002/Oct/17</li>
+ * <li>17/Oct/2002</li>
+ * <li>19:10:01 2002 17 Oct</li>
+ * <li>17. October 1970</li>
+ * </ul>
+ * The <a href="ftp://ftp.rfc-editor.org/in-notes/rfc21123.txt">RFC1123</a>
+ * Date String time components: The weekday is a literal
+ * e.g. Thu or Thursday. The weekday component is optional. The month
+ * day is a two digit number, e.g. 17 or 07. The month must be given
+ * as a literal e.g. Oct or October. The year is a four digit number
+ * e.g. 2002. The time is a string with three numbers representing
+ * hours, minutes and seconds. The numbers must be separated with the
+ * ':' character i.e. 19:10:01. Time is optional and if omitted
+ * defaults to 00:00:00.
+ * @param date The date string to parse
+ * @return A time_t representing seconds since the Epoch or -1 if 
+ * <code>date</code> cannot be parsed as a Time.
+ */
+time_t Time_parse(const char *date);
+
+
+/**
+ * Returns the time since the Epoch (00:00:00 UTC, January 1, 1970),
+ * measured in seconds. 
+ * @return A time_t representing the current local time since the epoch
+ * @exception AssertException If time could not be obtained
+ */
+time_t Time_now(void);
+
+
+/**
+ * Returns the time since the Epoch (00:00:00 UTC, January 1, 1970),
+ * measured in milliseconds. 
+ * @return A 64 bits long representing the current local time since 
+ * the epoch in milliseconds
+ * @exception AssertException If time could not be obtained
+ */
+long long int Time_milli(void);
+
+
+/**
+ * Converts a local time to the GMT timezone
+ * @param localtime A time_t representing a local time
+ * @return The local time converted to the equivalent GMT timezone
+ */
+time_t Time_gmt(time_t localtime);
+
+
+/**
+ * Returns the second of the minute for time.
+ * @param time Number of seconds since the EPOCH
+ * @return The second of the minute (0..61) 
+ */
+int Time_seconds(time_t time);
+
+
+/**
+ * Returns the minute of the hour for time.
+ * @param time Number of seconds since the EPOCH
+ * @return The minute of the hour (0..59)  
+ */
+int Time_minutes(time_t time);
+
+
+/**
+ * Returns the hour of the day for time.
+ * @param time Number of seconds since the EPOCH
+ * @return The hour of the day (0..23)  
+ */
+int Time_hour(time_t time);
+
+
+/**
+ * Returns the day of week expressed as number of days since Sunday.
+ * @param time Number of seconds since the EPOCH
+ * @return The day of the week (Sunday=0..Saturday=6)
+ */
+int Time_weekday(time_t time);
+
+
+/**
+ * Returns the day of the month for time.
+ * @param time Number of seconds since the EPOCH
+ * @return The day of the month (1..31)
+ */
+int Time_day(time_t time);
+
+
+/**
+ * Returns the month of the year.
+ * @param time Number of seconds since the EPOCH
+ * @return The month of the year (January=1..December=12)
+ */
+int Time_month(time_t time);
+
+
+/**
+ * Returns the year of time.
+ * @param time Number of seconds since the EPOCH
+ * @return The year of time in the range ~ (1970..2037) 
+ */
+int Time_year(time_t time);
+
+
+/**
+ * Add <code>years, months and/or days</code> to this <code>time</code>
+ * (or subtract if <code>years, months and/or days</code> are negative).
+ * @param time time to modify
+ * @param days Number of days to add to time
+ * @param months Number of months to add to time
+ * @param years Number of years to add to time
+ * @return The new time normalized in the local time zone
+ */
+time_t Time_add(time_t time, int years, int months, int days);
+
+
+/**
+ * Returns the number of days between <code>to</code> and <code>from</code>.
+ * @param to time
+ * @param from time
+ * @return The difference between <code>from</code> and <code>to</code>
+ * in days. The value is a positive number regardless if <code>to</code>
+ * is earlier or later than <code>from</code>.
+ */
+int Time_daysBetween(time_t to, time_t from);
+
+
+/**
+ * Returns a RFC1123 formated date string minus the timezone for the given
+ * time. The returned string is computed in the local timezone. The result
+ * buffer must be large enough to hold at least 26 bytes. Example:
+ * <pre>
+ * Tue, 15 Sep 2009 22:01:25
+ * </pre>
+ * @param time Number of seconds since the EPOCH
+ * @param result The buffer to write the date string too
+ * @return a pointer to the result buffer
+ */
+char *Time_string(time_t time, char result[26]);
+
+
+/**
+ * Returns a RFC1123 formated date string for the given time. <code>time</code>
+ * is <i>converted</i> to UTC (GMT) and the returned string represent the 
+ * specified time in UTC. The submitted result buffer must be large enough 
+ * to hold at least 30 bytes. Result example:
+ * <pre>
+ * Tue, 15 Sep 2009 22:01:25 GMT
+ * </pre>
+ * @param time Number of localtime seconds since the EPOCH
+ * @param result The buffer to write the date string too
+ * @return a pointer to the result buffer
+ */
+char *Time_gmtstring(time_t time, char result[30]);
+
+
+/**
+ * Returns <code>time</code> as a date string. The <code>format</code> 
+ * parameter determines the format of the string. The format specifiers 
+ * are the same as those used by <code>strftime(3)</code>. For instance to
+ * specify a RFC822 time string on the format "Wed, 05 Feb 2003 01:16:44
+ * +0100" the following format string is used:
+ * <code>"%a, %d %b %Y %H:%M:%S %z"</code>
+ * @param result The buffer to write the date string too
+ * @param size Size of the result buffer
+ * @param format A <code>strftime</code> format string
+ * @param time Number of seconds since the EPOCH
+ * @return A pointer to the result buffer
+ * @exception AssertException If <code>format</code> or <code>result</code>
+ * is NULL
+ */ 
+char *Time_fmt(char *result, int size, const char *format, time_t time);
+
+
+/**
+ * Returns a uptime formated string for the given seconds. That is, convert
+ * <code>sec</code> to days, hours and minutes and return a string on the 
+ * form, <code>7d, 17h, 34m</code>. The submitted result buffer must be
+ * large enough to hold at least 24 bytes. 
+ * @param sec Number of seconds to split up into, days, hours, minutes and 
+ * seconds.
+ * @param result The buffer to write the uptime string too
+ * @return a pointer to the result buffer or NULL if <code>result</code>
+ * was NULL
+ */
+char *Time_uptime(time_t sec, char result[24]);
+
+
+/**
+ * Returns 1 if the given time is in the range of the specified cron
+ * format string, otherwise 0. The cron string consists of 5 fields separated
+ * with white-space. All fields are required:
+ *
+ * <table>
+ * <tr>
+ * <th>Name</th>
+ * <th>Allowed values</th>
+ * <th>Special characters</th>
+ * </tr>
+ * <tr>
+ * <td>Minutes</td>
+ * <td>0-59</td>
+ * <td>* , -</td>
+ * </tr>
+ * <tr>
+ * <td>Hours</td>
+ * <td>0-23</td>
+ * <td>* , -</td>
+ * </tr>
+ * <tr>
+ * <td>Day of month</td>
+ * <td>1-31</td>
+ * <td>* , -</td>
+ * </tr>
+ * <tr>
+ * <td>Month</td>
+ * <td>1-12 (1=jan, 12=dec)</td>
+ * <td>* , -</td>
+ * </tr>
+ * <tr>
+ * <td>Day of week</td>
+ * <td>0-6 (0=sunday, 6=saturday)</td>
+ * <td>* , -</td>
+ * </tr>
+ * </table>
+ * <h3>Special characters</h3>
+ * <ul>
+ * <li>* The asterisk indicates that the expression will match 
+ * for all values of the field; e.g., using an asterisk in the 4th 
+ * field (month) would indicate every month.
+ * <li>- (hyphen) Hyphens are used to define ranges. For example, 
+ * 8-9 in the hour field indicate between 8AM and 9AM. Note that
+ * range is from time1 until and including time2. That is, from 8AM
+ * and until 10AM unless minutes are set. Another example, 1-5 in the
+ * weekday field, specify from monday to friday (including friday).
+ * <li>, (comma) Comma are used to specify a sequence. For example, 
+ * 17,18 in the day field indicate the 17th and 18th day of the month. 
+ * A sequence can also include ranges. For example, using
+ * 1-5,0 in the weekday field indicate monday to friday and sunday.
+ * </ul>
+ * <h3>Example</h3>
+ * <ul>
+ * <li><code>"* 9-10 * * 1-5"</code> Matches 9AM-10AM every weekday 
+ * <li><code>"* 0-5,23 * * 0,6"</code> Matches between 0AM-5AM and 11PM each saturday and sunday
+ * </ul>
+ * @param cron A crontab format string. e.g. "* 8-9 * * *"
+ * @param time The time to test if in range of the cron format
+ * @return 1 if time is in cron range, otherwise 0.
+ */
+int Time_incron(const char *cron, time_t time);
+
+
+/**
+ * This method suspend the calling process or Thread for
+ * <code>u</code> micro seconds.
+ * @param u Micro seconds to sleep
+ */
+void Time_usleep(long u);
+
+//@}
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/thread/Thread.c b/monit-5.4/libmonit/src/thread/Thread.c
new file mode 100644
index 0000000..f227745
--- /dev/null
+++ b/monit-5.4/libmonit/src/thread/Thread.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include "system/System.h"
+#include "Thread.h"
+
+
+/**
+ * Implementation of the Thread.h interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+static pthread_attr_t myDetachStateAttribute;
+static pthread_once_t once_control = PTHREAD_ONCE_INIT;
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/* Setup common thread attribute */
+static void init_once(void) { 
+        int status = pthread_attr_init(&myDetachStateAttribute);
+        if (status != 0)
+                THROW(AssertException, "pthread_attr_init -- %s", System_getError(status));
+        status = pthread_attr_setdetachstate(&myDetachStateAttribute, PTHREAD_CREATE_DETACHED);
+        if (status != 0) {
+                pthread_attr_destroy(&myDetachStateAttribute);
+                THROW(AssertException, "pthread_attr_setdetachstate -- %s", System_getError(status));
+        }
+}
+
+
+/* ----------------------------------------------------- Protected Methods */
+
+
+/* Called from Bootstrap() */
+void Thread_init(void) { pthread_once(&once_control, init_once); }
+
+
+/* Called at program termination for cleanup */
+void Thread_fini(void) { pthread_attr_destroy(&myDetachStateAttribute); }
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+void Thread_createDetached(Thread_T *thread, void *(*threadFunc)(void *threadArgs), void *threadArgs) {
+        assert(thread);
+        assert(threadFunc);
+        int status = pthread_create(thread, &myDetachStateAttribute, threadFunc, threadArgs);
+        if (status != 0)
+                THROW(AssertException, "pthread_create -- %s", System_getError(status));
+}
+
+
diff --git a/monit-5.4/libmonit/src/thread/Thread.h b/monit-5.4/libmonit/src/thread/Thread.h
new file mode 100644
index 0000000..9a20ec2
--- /dev/null
+++ b/monit-5.4/libmonit/src/thread/Thread.h
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef THREAD_INCLUDED
+#define THREAD_INCLUDED
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+#include <string.h>
+#include <pthread.h>
+#include "system/System.h"
+
+
+/**
+ * General purpose <b>Thread</b> abstractions. This interface  defines object
+ * types and methods for handling threads, synchronization and semaphores. 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/** @cond hidden */
+#define wrapper(F) do { \
+        int status= (F); if (! (status == 0 || status==ETIMEDOUT)) \
+        THROW(AssertException, "%s -- %s", #F, System_getError(status)); \
+} while (0)
+/** @endcond */
+/** @name Abstract Data Types */
+//@{
+/**
+ * Thread object type
+ * @hideinitializer
+ */
+#define Thread_T pthread_t
+/**
+ * Semaphore object type
+ * @hideinitializer
+ */
+#define Sem_T   pthread_cond_t			  
+/**
+ * Mutex object type
+ * @hideinitializer
+ */
+#define Mutex_T pthread_mutex_t
+/**
+ * Read/Write Lock object type
+ * @hideinitializer
+ */
+#define Lock_T pthread_rwlock_t
+/**
+ * Thread Data object type
+ * @hideinitializer
+ */
+#define ThreadData_T pthread_key_t
+//@}
+/** @name Thread methods */
+//@{
+/**
+ * Create a new thread
+ * @param thread The thread to create
+ * @param threadFunc The thread routine to execute
+ * @param threadArgs Arguments to <code>threadFunc</code>
+ * @exception AssertException If thread creation failed
+ * @hideinitializer
+ */
+#define Thread_create(thread, threadFunc, threadArgs) \
+        wrapper(pthread_create(&thread, NULL, threadFunc, (void*)threadArgs))
+/**
+ * Returns the thread ID of the calling thread
+ * @return The id of the calling thread
+ * @hideinitializer
+ */
+#define Thread_self() pthread_self()
+/**
+ * Detach a thread
+ * @param thread The thread to detach
+ * @exception AssertException If detaching the thread failed
+ * @hideinitializer
+ */
+#define Thread_detach(thread) wrapper(pthread_detach(thread))
+/**
+ * Cancel execution of a thread
+ * @param thread The thread to cancel
+ * @exception AssertException If thread cancelation failed
+ * @hideinitializer
+ */
+#define Thread_cancel(thread) wrapper(pthread_cancel(thread))
+/**
+ * Wait for thread termination
+ * @param thread The thread to wait for
+ * @exception AssertException If thread join failed
+ * @hideinitializer
+ */
+#define Thread_join(thread) wrapper(pthread_join(thread, NULL))
+//@}
+/** @name Semaphore methods */
+//@{
+/**
+ * Initialize a new semaphore
+ * @param sem The semaphore to initialize
+ * @exception AssertException If initialization failed
+ * @hideinitializer
+ */
+#define Sem_init(sem) wrapper(pthread_cond_init(&sem, NULL))
+/**
+ * Wait on a semaphore
+ * @param sem The semaphore to wait on
+ * @param mutex A mutex to unlock on wait
+ * @exception AssertException If wait failed
+ * @hideinitializer
+ */
+#define Sem_wait(sem, mutex) wrapper(pthread_cond_wait(&sem, &(mutex)))
+/**
+ * Unblock a thread waiting for a semaphore
+ * @param sem The semaphore to signal
+ * @exception AssertException If signal failed
+ * @hideinitializer
+ */
+#define Sem_signal(sem) wrapper(pthread_cond_signal(&sem))
+/**
+ * Unblock all threads waiting for a semaphore
+ * @param sem The semaphore to broadcast
+ * @exception AssertException If broadcast failed
+ * @hideinitializer
+ */
+#define Sem_broadcast(sem) wrapper(pthread_cond_broadcast(&sem))
+/**
+ * Destroy a semaphore
+ * @param sem The semaphore to destroy
+ * @exception AssertException If destroy failed
+ * @hideinitializer
+ */
+#define Sem_destroy(sem) wrapper(pthread_cond_destroy(&sem))
+/**
+ * Wait on a semaphore for a specific amount of time. During the wait
+ * the mutex is unlocked and reacquired afterwards
+ * @param sem The semaphore to wait on
+ * @param mutex A mutex to unlock on wait
+ * @param time time to wait
+ * @exception AssertException If the timed wait failed
+ * @hideinitializer
+ */
+#define Sem_timeWait(sem, mutex, time) \
+        wrapper(pthread_cond_timedwait(&sem, &(mutex), &time))
+//@}
+/** @name Mutex methods */
+//@{
+/**
+ * Initialize a new mutex
+ * @param mutex The mutex to initialize
+ * @exception AssertException If initialization failed
+ * @hideinitializer
+ */
+#define Mutex_init(mutex) wrapper(pthread_mutex_init(&(mutex), NULL))
+/**
+ * Destroy a the given mutex
+ * @param mutex The mutex to destroy
+ * @exception AssertException If destroy failed
+ * @hideinitializer
+ */
+#define Mutex_destroy(mutex) wrapper(pthread_mutex_destroy(&(mutex)))
+/**
+ * Locks a mutex
+ * @param mutex The mutex to lock
+ * @exception AssertException If mutex lock failed
+ * @hideinitializer
+ */
+#define Mutex_lock(mutex) wrapper(pthread_mutex_lock(&(mutex)))
+/**
+ * Unlocks a mutex
+ * @param mutex The mutex to unlock
+ * @exception AssertException If mutex unlock failed
+ * @hideinitializer
+ */
+#define Mutex_unlock(mutex) wrapper(pthread_mutex_unlock(&(mutex)))
+/**
+ * Defines a block of code to execute after the given mutex is locked
+ * @param mutex The mutex to lock
+ * @hideinitializer
+ */
+#define LOCK(mutex) do { Mutex_T *_yymutex= &(mutex); assert(pthread_mutex_lock(_yymutex)==0);
+/**
+ * Ends a LOCK block
+ * @hideinitializer
+ */
+#define END_LOCK assert(pthread_mutex_unlock(_yymutex)==0); } while (0)
+//@}
+/** @name Read/Write Lock methods */
+//@{
+/**
+ * Initialize a new read/write lock
+ * @param lock The lock to initialize
+ * @exception AssertException If initialization failed
+ * @hideinitializer
+ */
+#define Lock_init(lock) wrapper(pthread_rwlock_init(&(lock), NULL))
+/**
+ * Destroy a read/write lock
+ * @param lock The lock to destroy
+ * @exception AssertException If destroy failed
+ * @hideinitializer
+ */
+#define Lock_destroy(lock) wrapper(pthread_rwlock_destroy(&(lock)))
+/**
+ * Acquire a read/write lock for reading
+ * @param lock A read/write lock
+ * @exception AssertException If failed
+ * @hideinitializer
+ */
+#define Lock_read(lock) wrapper(pthread_rwlock_rdlock(&(lock)))
+/**
+ * Acquire a read/write lock for writing
+ * @param lock A read/write lock
+ * @exception AssertException If failed
+ * @hideinitializer
+ */
+#define Lock_write(lock) wrapper(pthread_rwlock_wrlock(&(lock)))
+/**
+ * Release a read/write lock
+ * @param lock A read/write lock
+ * @exception AssertException If failed
+ * @hideinitializer
+ */
+#define Lock_unlock(lock) wrapper(pthread_rwlock_unlock(&(lock)))
+/**
+ * Defines a block of code to execute after the given read locked is acquired
+ * @param lock The read lock
+ * @hideinitializer
+ */
+#define RLOCK(lock) do { Lock_T *_yyrlock= &(lock); assert(pthread_rwlock_rdlock(_yyrlock)==0);
+/**
+ * Ends a RLOCK block
+ * @hideinitializer
+ */
+#define END_RLOCK assert(pthread_rwlock_unlock(_yyrlock)==0); } while (0)
+/**
+ * Defines a block of code to execute after the given write locked is acquired
+ * @param lock The write lock
+ * @hideinitializer
+ */
+#define WLOCK(lock) do { Lock_T *_yywlock= &(lock); assert(pthread_rwlock_wrlock(_yywlock)==0);
+/**
+ * Ends a RLOCK block
+ * @hideinitializer
+ */
+#define END_WLOCK assert(pthread_rwlock_unlock(_yywlock)==0); } while (0)
+//@}
+/** @name Thread data methods */
+//@{
+/**
+ * Creates a thread-specific data key. 
+ * @param key The ThreadData_T key to create
+ * @exception AssertException If thread data creation failed
+ * @hideinitializer
+ */
+#define ThreadData_create(key) wrapper(pthread_key_create(&(key), NULL))
+/**
+ * Sets a thread-specific data value. The key is of type ThreadData_T
+ * @param key The ThreadData_T key to set a new value for
+ * @param value The value for key
+ * @exception AssertException If setting thread data failed
+ * @hideinitializer
+ */
+#define ThreadData_set(key, value) wrapper(pthread_setspecific((key), (value)))
+/**
+ * Gets a thread-specific data value
+ * @param key The ThreadData_T key
+ * @return value of key or NULL of no value was set for the key
+ * @hideinitializer
+ */
+#define ThreadData_get(key) pthread_getspecific((key))
+//@}
+
+
+/* ----------------------------------------------------------------- Methods */
+
+
+//<< Start filter-out
+
+/**
+ * Initialize Threads. This method should be called at program startup
+ */
+void Thread_init(void);
+
+
+/**
+ * Shutdown and cleanup threads. This method should be called at program termination
+ */
+void Thread_fini(void);
+
+
+//>> End filter-out
+
+
+/**
+ * Create a new thread in a detached state
+ * @param thread The thread to create
+ * @param threadFunc The thread routine to execute
+ * @param threadArgs Arguments to <code>threadFunc</code>
+ * @exception AssertException If thread creation failed
+ */
+void Thread_createDetached(Thread_T *thread, void *(*threadFunc)(void *threadArgs), void *threadArgs);
+
+#endif
diff --git a/monit-5.4/libmonit/src/util/List.c b/monit-5.4/libmonit/src/util/List.c
new file mode 100644
index 0000000..9c5d96d
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/List.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <strings.h>
+#include <stdarg.h>
+
+#include "Str.h"
+#include "List.h"
+
+
+/**
+ * Implementation of the List interface. A freelist is used to retain
+ * deleted nodes for reuse.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ----------------------------------------------------------- Definitions */
+
+
+#define T List_T
+
+
+/* --------------------------------------------------------------- Private */
+
+
+static inline list_t new_node(T L, void *e, list_t next) {
+        list_t p;
+        if (L->freelist) {
+                p = L->freelist;
+                L->freelist = p->next;
+        } else
+                p = ALLOC(sizeof *(p));
+        p->e = e;
+        p->next = next;
+        return p;
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+T List_new(void) {
+ 	T L;
+        NEW(L);
+	return L;
+}
+
+
+void List_free(T *L) {
+        list_t p, q;
+        assert(L && *L);
+        for (p = (*L)->head; p; p = q) {
+                q = p->next;
+                FREE(p);
+        }
+        for (p = (*L)->freelist; p; p = q) {
+                q = p->next;
+                FREE(p);
+        }
+        FREE(*L);
+}
+
+
+void List_push(T L, void *e) {
+        assert(L);
+        list_t p = new_node(L, e, L->head);
+        if (L->head == NULL)
+                L->tail = p;
+        L->head = p;
+        L->length++;
+        L->timestamp++;
+}
+
+
+void *List_pop(T L) {
+        assert(L);
+        if (L->head) {
+                list_t p = L->head;
+                L->head = L->head->next;
+                L->length--;
+                L->timestamp++;
+                p->next = L->freelist;
+                L->freelist = p;
+                return p->e;
+        } 
+        return NULL;
+}
+
+
+void List_append(T L, void *e) {
+        list_t p;
+        assert(L);
+        p = new_node(L, e, NULL);
+        if (L->head == NULL)
+                L->head = p;
+        else
+                L->tail->next = p;
+        L->tail = p;
+        L->length++;
+        L->timestamp++;
+}
+
+
+void *List_remove(T L, void *e) {
+        assert(L);
+        if (e && L->head) {
+                list_t p, q;
+                if (L->head->e == e)
+                        return List_pop(L);
+                for (p = L->head; p; p = q) {
+                        q = p->next;
+                        if (q && (q->e == e)) {
+                                p->next = q->next;
+                                if (q == L->tail)
+                                        L->tail = p;
+                                p = q;
+                                L->length--;
+                                L->timestamp++;
+                                p->next = L->freelist;
+                                L->freelist = p;
+                                return p->e;
+                        }
+                }
+        }
+        return NULL;
+}
+
+
+void List_cat(T L, T list) {
+        assert(L);
+        assert(list);
+        if (L != list)
+                for (list_t p = list->head; p; p = p->next)
+                        List_append(L, p->e);
+}
+
+
+void List_reverse(T L) {
+        list_t head, next, list;
+        assert(L);
+        head = NULL;
+        list = L->head;
+        L->tail = L->head;
+	for (; list; list = next) {
+                next = list->next;
+                list->next = head;
+                head = list;
+	}
+        L->head = head;
+}
+
+
+int List_length(T L) {
+        assert(L);
+        return L->length;
+}
+
+
+void List_clear(T L) {
+        assert(L);
+        if (L->tail) {
+                L->tail->next = L->freelist;
+                L->freelist = L->head;
+        }
+        L->tail = L->head = NULL;
+        L->length = 0;
+}
+
+
+void List_map(T L, void (*apply)(void *e, void *ap), void *ap) {
+        int stamp;
+        list_t p;
+        assert(L);
+        stamp = L->timestamp;
+        assert(apply);
+        for (p = L->head; p; p = p->next) {
+                apply(p->e, ap);
+                assert(L->timestamp == stamp);
+        }
+}
+
+
+void **List_toArray(T L) {
+        assert(L);
+        int i = 0;
+        void **array = ALLOC((L->length + 1) * sizeof *(array)); 
+        for (list_t p = L->head; p; p = p->next, i++)
+                array[i] = p->e;
+        array[i] = NULL;
+        return array;
+}
+
+
diff --git a/monit-5.4/libmonit/src/util/List.h b/monit-5.4/libmonit/src/util/List.h
new file mode 100644
index 0000000..d3625f1
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/List.h
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef LIST_INCLUDED
+#define LIST_INCLUDED
+
+
+/**
+ * A <b>List</b> is a sequence of zero or more elements. A List can be used
+ * as a LIFO (last in, first out) stack by using List_push() and List_pop()
+ * or as a FIFO (first in, first out) queue by using List_append() and 
+ * List_pop(). These operations takes constant time.
+ *
+ * The List ADT representation is revealed in this interface for easy access
+ * by clients. The representation is trivial; a structure with two fields. 
+ * The first field, <code>e</code>, is a pointer to an element added to the
+ * list and <code>next</code> points to the next node in the List or to NULL
+ * if there are no more nodes. In addition, the two variables <code>head</code>
+ * and <code>tail</code> are pointers to respectively the first and last node
+ * in the List. The variable <code>freelist</code> is used to retain popped
+ * list_t nodes for reuse. 
+ *
+ * This class is reentrant but not thread-safe
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T List_T
+typedef struct T *T;
+/** @cond hide */
+typedef struct list_t {void *e; struct list_t *next;} *list_t;
+struct T {
+        int length;
+        int timestamp;
+        list_t  head, tail, freelist;
+};
+/** @endcond */
+
+
+/**
+ * Create a new List object.
+ * @return A List object
+ * @exception MemoryException if allocation failed
+ */
+T List_new(void);
+
+
+/**
+ * Destroy a List object and release allocated resources. Call this
+ * method to release a List object allocated with List_new()
+ * @param L A List object reference
+*/
+void List_free(T *L);
+
+
+/**
+ * Add <code>e</code> to the beginning of the List
+ * @param L A List object
+ * @param e An element to add to the beginning of the List
+ * @exception MemoryException if allocation failed
+ */
+void List_push(T L, void *e);
+
+
+/**
+ * Remove the first element from the List
+ * @param L A List object
+ * @return The element removed from the beginning of the List
+ */
+void *List_pop(T L);
+
+
+/**
+ * Append <code>e</code> to the end of the List
+ * @param L A List object
+ * @param e An element to append to the end of the List
+ */
+void List_append(T L, void *e);
+
+
+/**
+ * Remove the first occurrence of the element <code>e</code> from the List
+ * @param L A List object
+ * @param e The element to remove from the list
+ * @return The element removed from the List or NULL if <code>e</code> 
+ * was not found in the List
+ */
+void *List_remove(T L, void *e);
+
+
+/**
+ * Concatenate <code>list</code> with this List. All nodes in 
+ * <code>list</code> are appended to L. <code>list</code> 
+ * is not changed
+ * @param L A List object
+ * @param list A List to append to the end of this List
+ */
+void List_cat(T L, T list);
+
+
+/**
+ * Reverse the order of the elements in the List
+ * @param L A List object
+ */
+void List_reverse(T L);
+
+
+/**
+ * Returns the number of elements in the List.
+ * @param L A List object
+ * @return Number of elements in the List
+ */
+int List_length(T L);
+
+
+/**
+ * Clear this List so it contains no elements. The List will be empty after
+ * this call. 
+ * @param L A List object
+ */
+void List_clear(T L);
+
+
+/**
+ * Apply the visitor function, <code>apply</code> for each element in 
+ * the List. Clients can pass an application specific pointer, 
+ * <code>ap</code>, to List_map() and this pointer is passed along to the
+ * <code>apply</code> function at each call. It is a checked runtime error
+ * for <code>apply</code> to change the List. 
+ * @param L A List object
+ * @param apply The function to apply
+ * @param ap An application-specific pointer. If such a pointer is 
+ * not needed, just use NULL
+ * @exception AssertException if <code>apply</code> change the List
+ */
+void List_map(T L, void (*apply)(void *e, void *ap), void *ap);
+
+
+/**
+ * Creates a N + 1 length array containing all the elements 
+ * in this List. The last element in the array is NULL. The
+ * caller is responsible for deallocating the array.
+ * @param L A List object
+ * @return A pointer to the first element in the array
+ * @exception MemoryException if allocation failed
+ */
+void **List_toArray(T L);
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/util/Str.c b/monit-5.4/libmonit/src/util/Str.c
new file mode 100644
index 0000000..deb71d2
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/Str.c
@@ -0,0 +1,432 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "Config.h"
+
+#include <stdio.h>
+#include <strings.h>
+#include <string.h>
+#include <stdarg.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <regex.h>
+#include <limits.h>
+
+
+#include "NumberFormatException.h"
+#include "system/System.h"
+#include "Str.h"
+
+
+/**
+ * Implementation of the Str interface
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* -------------------------------------------------------- Public Methods */
+
+
+char *Str_chomp(char *s) {
+        if (STR_DEF(s)) {
+                for (char *p = s; *p; p++)
+                        if (*p == '\r' || *p == '\n') {
+                                *p = 0; break;
+                        }
+        }
+        return s;
+}
+
+
+char *Str_trim(char *s) {
+        return (Str_ltrim(Str_rtrim(s)));
+}
+
+
+char *Str_ltrim(char *s) {
+        if (STR_DEF(s) && isspace(*s)) {
+                int i, j;
+                for (j = 0; s[j]; j++) ;
+                for (i = 0; isspace(s[i]); i++) ;
+                memmove(s, s + i, j - i);
+                s[j-i] = 0;
+        }
+        return s;
+}
+
+
+char *Str_rtrim(char *s) {
+        if (STR_DEF(s)) {
+                int j;
+                for (j = 0; s[j]; j++) ;
+                for (j = j - 1; isspace(s[j]); j--) s[j] = 0;
+        }
+        return s;
+}
+
+
+char *Str_unquote(char *s) {
+        if (STR_DEF(s)) {
+                char *t = s;
+                // Left unquote
+                while (*t == 34 || *t == 39 || isspace(*t)) t++;
+                if (t != s) {
+                        char *u = s;
+                        for (; *t; t++, u++)
+                                *u = *t;
+                        t = u;
+                } else 
+                        while (*t) t++;
+                // Right unquote
+                do 
+                        *(t--) = 0;
+                while (t > s && (*t == 34 || *t == 39 || isspace(*t)));
+        }
+        return s;
+}
+
+
+char *Str_toLower(char *s) {
+        if (s)
+                for (int i = 0; s[i]; i++)
+                        s[i] = tolower(s[i]);
+        return s;
+}
+
+
+char *Str_toUpper(char *s) {
+        if (s)
+                for (int i = 0; s[i]; i++)
+                        s[i] = toupper(s[i]);
+        return s;
+}
+
+
+char *Str_ton(long n, char s[43]) {
+        assert(s);
+        s[42] = 0;
+        char *t = s + 42;
+        unsigned long m;
+        if (n == LONG_MIN)
+                m = LONG_MAX + 1UL;
+        else if (n < 0)
+                m = -n;
+        else
+                m = n;
+        do
+                *--t = m % 10 + '0';
+        while ((m /= 10) > 0);
+        if (n < 0)
+                *--t = '-';
+        return t;
+}
+
+
+int Str_parseInt(const char *s) {
+        int i;
+        char *e;
+        if (STR_UNDEF(s))
+                THROW(NumberFormatException, "For input string null");
+        errno = 0;
+        i = (int)strtol(s, &e, 10);
+        if (errno || (e == s))
+                THROW(NumberFormatException, "For input string %s -- %s", s, System_getError(errno));
+        return i;
+}
+
+
+long long int Str_parseLLong(const char *s) {
+        char *e;
+        long long l;
+        if (STR_UNDEF(s))
+                THROW(NumberFormatException, "For input string null");
+        errno = 0;
+        l = strtoll(s, &e, 10);
+        if (errno || (e == s))
+                THROW(NumberFormatException, "For input string %s -- %s", s, System_getError(errno));
+        return l;
+}
+
+
+double Str_parseDouble(const char *s) {
+        char *e;
+        double d;
+        if (STR_UNDEF(s))
+                THROW(NumberFormatException, "For input string null");
+        errno = 0;
+        d = strtod(s, &e);
+        if (errno || (e == s))
+                THROW(NumberFormatException, "For input string %s -- %s", s, System_getError(errno));
+        return d;
+}
+
+
+char *Str_replaceChar(char *s, char o, char n) {
+        if (s) {
+                for (char *t = s; *t; t++) 
+                        if (*t == o) 
+                                *t = n;
+        }
+        return s;
+}
+
+
+int Str_startsWith(const char *a, const char *b) {
+	if (a && b) {
+	        do 
+	                if (*a++ != *b++) return false;
+                while (*b);
+                return true;
+        }
+        return false;
+}
+
+
+int Str_endsWith(const char *a, const char *b) {
+        if (a && b) {
+                register int i = 0, j = 0;
+                while (a[i]) i++;
+                while (b[j]) j++;
+                for(; (i && j); i--, j--)
+                        if(toupper(a[i]) != toupper(b[j])) return false;
+                return (i >= j);
+        }
+        return false;
+}
+
+
+char *Str_sub(const char *a, const char *b) {
+        if (a && STR_DEF(b)) {
+                const char *ap, *bp;
+                while (*a) {
+                        if (toupper(*a) == toupper(*b)) {
+                                ap = a;
+                                bp = b;
+                                do
+                                        if (! *bp)
+                                                return (char*)a;
+                                while (toupper(*ap++) == toupper(*bp++));
+                        }
+                        a++;
+                }
+        }
+        return NULL;
+}
+
+
+int Str_has(const char *charset, const char *s) {
+        if (charset && s) {
+                for (int x = 0; s[x]; x++) {
+                        for (int y = 0; charset[y]; y++) {
+                                if (s[x] == charset[y])
+                                        return true; 
+                        }
+                }
+        }
+        return false;
+}
+
+
+int Str_isEqual(const char *a, const char *b) {
+        if (a && b) { 
+                while (*a && *b)
+                        if (toupper(*a++) != toupper(*b++)) return false;
+                return (*a == *b);
+        }
+        return false;
+}
+
+
+int Str_isByteEqual(const char *a, const char *b) {
+        if (a && b) {
+                while (*a && *b)
+                        if (*a++ != *b++) return false;
+                return (*a == *b);
+        }
+        return false;
+}
+
+
+char *Str_copy(char *dest, const char *src, int n) {
+	if (src && dest && (n > 0)) { 
+        	char *t = dest;
+	        while (*src && n--)
+        		*t++ = *src++;
+        	*t = 0;
+	} else if (dest)
+	        *dest = 0;
+        return dest;
+}
+
+
+// We don't use strdup so we can report MemoryException on OOM
+char *Str_dup(const char *s) { 
+        char *t = NULL;
+        if (s) {
+                size_t n = strlen(s); 
+                t = ALLOC(n + 1);
+                memcpy(t, s, n);
+                t[n] = 0;
+        }
+        return t;
+}
+
+
+char *Str_ndup(const char *s, long n) {
+        char *t = NULL;
+        assert(n >= 0);
+        if (s) {
+                size_t l = strlen(s); 
+                n = l < n ? l : n; // Use the actual length of s if shorter than n
+                t = ALLOC(n + 1);
+                memcpy(t, s, n);
+                t[n] = 0;
+        }
+        return t;
+}
+
+
+char *_Str_join(char *dest, int n, ...) {
+        char *p, *q;
+        va_list ap;
+        assert(dest);
+        va_start(ap, n);
+        for (q = dest, p = va_arg(ap, char *); (p && (n > 0)); p = va_arg(ap, char *))
+                while (*p && n--) *q++ = *p++;
+        va_end(ap);
+        *q = 0;
+        return dest;
+}
+
+
+char *Str_cat(const char *s, ...) {
+        char *t = NULL;
+        if (s) {
+                va_list ap;
+                va_start(ap, s);
+                t = Str_vcat(s, ap);
+                va_end(ap);
+        }
+        return t;
+}
+
+
+char *Str_vcat(const char *s, va_list ap) {
+        char *t = NULL;
+        if (s) {
+                int n = 0;
+                va_list ap_copy;
+                int size = STRLEN;
+                t = ALLOC(size);
+                while (true) {
+                        va_copy(ap_copy, ap);
+                        n = vsnprintf(t, size, s, ap_copy);
+                        va_end(ap_copy);
+                        if (n < size)
+                                break;
+                        size = n + 1;
+                        RESIZE(t, size);
+                }
+        }
+        return t;
+}
+
+
+char *Str_trunc(char *s, int n) {
+        assert(n >= 0);
+        if (s) {
+                size_t sl = strlen(s);
+                if (sl > (n + 4)) {
+                        int e = n+3;
+                        for (; n < e; n++)
+                                s[n] = '.';
+                        s[n] = 0;
+                }
+        }
+        return s;
+}
+
+
+char *Str_curtail(char *s, char *t) {
+        if (s) {
+                char *x = Str_sub(s, t);
+                if (x) *x = 0;
+        }
+        return s;
+}
+
+
+int Str_lim(const char *s, int limit) {
+        assert(limit>=0);
+        if (s)
+                for (; *s; s++) limit--;
+        return (limit <= 0);
+}
+
+
+int Str_match(const char *pattern, const char *subject) {
+        assert(pattern);
+        if (STR_DEF(subject)) {
+                regex_t regex = {0};
+                int error = regcomp(&regex, pattern, REG_NOSUB|REG_EXTENDED);
+                if (error) {
+                        char e[STRLEN];
+                        regerror(error, &regex, e, STRLEN);
+                        regfree(&regex);
+                        THROW(AssertException, "regular expression error -- %s", e);
+                } else {
+                        error = regexec(&regex, subject, 0, NULL, 0);
+                        regfree(&regex);
+                        return (error == 0);
+                }
+        }
+        return false;
+}
+
+
+unsigned int Str_hash(const void *x) {
+        const char *s = x;
+        unsigned long h = 0, g;
+        assert(x);
+        while (*s) {
+                h = (h << 4) + *s++;
+                if ((g = h & 0xF0000000))
+                        h ^= g >> 24;
+                h &= ~g;
+        }
+        return (int)h;
+}
+
+
+int Str_cmp(const void *x, const void *y) {
+        return strcmp((const char *)x, (const char *)y);
+}
+
diff --git a/monit-5.4/libmonit/src/util/Str.h b/monit-5.4/libmonit/src/util/Str.h
new file mode 100644
index 0000000..288d24e
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/Str.h
@@ -0,0 +1,421 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef STR_INCLUDED
+#define STR_INCLUDED
+#include <stdarg.h>
+
+
+/**
+ * General purpose <b>String</b> utility <b>class methods</b>.
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/**
+ * Test if the given string is defined. That is; not NULL nor the 
+ * empty ("") string
+ * @param s The string to test
+ * @return true if s is defined, otherwise false
+ * @hideinitializer
+ */
+#define STR_DEF(s) ((s) && *(s))
+
+
+/**
+ * Test if the given string is NULL or the empty ("") string
+ * @param s The string to test
+ * @return true if s is NULL or the empty string, otherwise false
+ * @hideinitializer
+ */
+#define STR_UNDEF(s) (! STR_DEF(s))
+
+
+/**
+ * Removes everything from the first newline (CR|LF)
+ * @param s A string to be chomped
+ * @return The chomped string
+ */
+char *Str_chomp(char *s);
+
+
+/**
+ * Remove leading and trailing white space [ \\t\\r\\n]
+ * from the string.
+ * @param s A string
+ * @return s with leading and trailing spaces removed
+ */
+char *Str_trim(char *s);
+
+
+/**
+ * Remove leading white space [ \\t\\r\\n] from the string. 
+ * @param s A string
+ * @return s with leading spaces removed
+ */
+char *Str_ltrim(char *s);
+
+
+/**
+ * Remove trailing white space [ \\t\\r\\n] from the string
+ * @param s A string
+ * @return s with trailing spaces removed
+ */
+char *Str_rtrim(char *s);
+
+
+/**
+ * Remove any enclosing quotes ["'] and white-space from the string
+ * @param s A string
+ * @return s with any enclosed quotes and white-space removed
+ */
+char *Str_unquote(char *s);
+
+
+/**
+ * Converts the given string to lower case
+ * @param s A string
+ * @return s converted to lower case letters
+ */
+char *Str_toLower(char *s);
+
+
+/**
+ * Converts the given string to upper case
+ * @param s A string
+ * @return s converted to upper case letters
+ */
+char *Str_toUpper(char *s);
+
+
+/**
+ * Converts a number to a string. The given <code>s</code> buffer
+ * is returned with the string representation of <code>n</code>.
+ * @param n The number (long) to convert to a string
+ * @param s A buffer to write the string representation of <code>n</code>
+ * into. The buffer must be of size 43 bytes or more
+ * @return A pointer to <code>s</code>
+ */
+char *Str_ton(long n, char s[43]);
+
+
+/**
+ * Parses the string argument as a signed decimal integer.
+ * @param s A string
+ * @return The integer represented by the string argument
+ * @exception NumberFormatException If the String does not contain a
+ * parsable int
+ */
+int Str_parseInt(const char *s);
+
+
+/**
+ * Parses the string argument as a signed long long in base 10. 
+ * @param s A string
+ * @return The long long represented by the string argument.
+ * @exception NumberFormatException If the String does not contain a
+ * parsable long long
+ */
+long long int Str_parseLLong(const char *s);
+
+
+/**
+ * Parses the string argument as a double. 
+ * @param s A string
+ * @return The double represented by the string argument.
+ * @exception NumberFormatException If the String does not contain a
+ * parsable double
+ */
+double Str_parseDouble(const char *s);
+
+
+/**
+ * Replace all occurrences of the <code>old</code> char in
+ * <code>s</code> with the <code>new</code> char.
+ * @param s A string
+ * @param o The old char
+ * @param n The new char
+ * @return s where all occurrence of old are replaced with new
+ */
+char *Str_replaceChar(char *s, char o, char n);
+
+
+/**
+ * Returns true if <i>a</i> starts with <i>b</i>. The test is 
+ * <i>case-insensitive</i> but depends on that all characters
+ * in the two strings can be translated in the current locale. 
+ * <code>b</code> is assumed to be the substring of <code>a</code>.
+ * This means that if <code>a</code> is shorter than <code>b</code>, 
+ * this method returns false
+ * @param a The string to search for b in
+ * @param b The sub-string to test a against
+ * @return true if a starts with b, otherwise false
+ */
+int Str_startsWith(const char *a, const char *b);
+
+
+/**
+ * Returns true if <i>a</i> ends with <i>b</i>. The test is 
+ * <i>case-insensitive</i> but depends on that all characters
+ * in the two strings can be translated in the current locale.
+ * @param a The string to search for b in
+ * @param b The sub-string to test a against
+ * @return true if a ends with b, otherwise false
+ */
+int Str_endsWith(const char *a, const char *b);
+
+
+/**
+ * Returns the first substring of <i>a</i> that match the string <code>b</code>.
+ * If any of the parameters are NULL or <code>b</code> is an empty string, 
+ * NULL is returned. The test is <i>case-insensitive</i>.
+ * Example:
+ * <pre>
+ * Str_sub("Haystack with Needle", "needle") -> "Needle"
+ * Str_sub("foo bar baz", "bar") -> "bar baz"
+ * Str_sub("foo", "foo bar") -> NULL
+ * Str_sub("foo", "") -> NULL
+ * </pre>
+ * @param a The string to search for b in
+ * @param b The sub-string to search for in a
+ * @return A pointer to the start of the substring in a that contains b, 
+ * otherwise NULL
+ */
+char *Str_sub(const char *a, const char *b);
+
+
+/**
+ * Returns true if <i>s</i> contains any characters in the 
+ * <code>charset</code>. Example: 
+ * <pre>
+ * char *foo = "'bar' (baz)"; 
+ * Str_has("(')", foo) -> true
+ * Str_has(",;", foo) -> false
+ * Str_has(",;", NULL) -> false
+ * </pre>
+ * @param charset The characters to test <code>s</code> against
+ * @param s The string to test
+ * @return true if s contains chars in charset, otherwise false
+ */
+int Str_has(const char *charset, const char *s);
+
+
+/**
+ * Returns true if <i>a</i> equals <i>b</i>. The test is 
+ * <i>case-insensitive</i> but depends on that all characters
+ * in the two strings can be translated in the current locale.
+ * @param a The string to test for equality with <code>b</code>
+ * @param b The string to test for equality with <code>a</code>
+ * @return true if a equals b, otherwise false
+ */
+int Str_isEqual(const char *a, const char *b);
+
+
+/**
+ * Returns true if <i>a</i> equals <i>b</i>. The
+ * test is <i>case-sensitive</i> and compares byte by byte 
+ * @param a The string to test for equality with <code>b</code>
+ * @param b The string to test for equality with <code>a</code>
+ * @return true if a equals b, otherwise false
+ */
+int Str_isByteEqual(const char *a, const char *b);
+
+
+/**
+ * Strcpy that copy only <code>n</code> char from the given
+ * string. The destination string, <code>dest</code>, is NUL
+ * terminated at length <code>n</code> or if <code>src</code> is
+ * shorter than <code>n</code> at the length of <code>src</code>
+ * @param dest The destination buffer
+ * @param src The string to copy to dest
+ * @param n The number of bytes to copy
+ * @return A pointer to dest
+ */
+char *Str_copy(char *dest, const char *src, int n);
+
+
+/**
+ * Returns a copy of <code>s</code>. The caller must free the returned String.
+ * @param s A String to duplicate
+ * @return A pointer to the duplicated string, NULL if s is NULL
+ * @exception MemoryException if allocation failed
+ */
+char *Str_dup(const char *s);
+
+
+/**
+ * Strdup that duplicates only n char from the given string The caller 
+ * must free the returned String. If s is shorter than n characters long, 
+ * all characters of s are copied. I.e. the same as calling Str_dup(s).
+ * @param s A string to duplicate
+ * @param n The number of bytes to copy from s
+ * @return A pointer to the duplicated string, NULL if s is NULL
+ * @exception MemoryException if allocation failed
+ * @exception AssertException if n is less than 0
+ */
+char *Str_ndup(const char *s, long n);
+
+
+/**
+ * Copy <code>n</code> bytes from a variable number of strings. The 
+ * destination string, <code>dest</code>, is 0 terminated at length
+ * <code>n</code> or if number of bytes to copy is shorter than 
+ * <code>n</code> at the combined length of the given strings.
+ * Example:
+ * <pre>
+ * char dest[10 + 1];
+ *
+ * Str_join(dest, 10, "012", "3456789", "foo") -> "0123456789"
+ * Str_join(dest, 4, "a", "b", "cd", "ghi", "jklmnopq") -> "abcd"
+ * Str_join(dest, 10) -> ""
+ * </pre>
+ * <i><small>It is an unchecked runtime error not to provide at least one 
+ * parameter in a variable argument list. This macro for the _Str_join()
+ * function ensures that at least one parameter exist in the argument list
+ * and its last parameter is NULL. </small></i>
+ * @param dest The destination buffer
+ * @param n The number of bytes to copy
+ * @return A pointer to dest
+ * @exception AssertException if <code>dest</code> is null
+ * @hideinitializer 
+ */
+#define Str_join(dest, n, ...) _Str_join((dest), (n), ##__VA_ARGS__, 0)
+/** Copy n bytes from a variable number of strings. @see Str_join() */
+char *_Str_join(char *dest, int n, ...);
+
+
+/**
+ * Creates a new String by merging a formated string and a variable
+ * argument list. The caller must free the returned String.
+ * @param s A format string
+ * @return The new String or NULL if the string could not be created
+ * @exception MemoryException if memory allocation fails
+ */
+char *Str_cat(const char *s, ...) __attribute__((format (printf, 1, 2)));
+
+
+/**
+ * Creates a new String by merging a formated string and a variable
+ * argument list. The caller must free the returned String.
+ * @param s A format string
+ * @param ap A variable argument lists
+ * @return a new String concating s and va_list or NULL on error
+ * @exception MemoryException if memory allocation fails
+ */
+char *Str_vcat(const char *s, va_list ap);
+
+
+/**
+ * Truncate <code>s</code> at <code>n</code> and add a trailing ellipsis
+ * to the end of <code>s</code>. If <code>s</code> is shorter than 
+ * <code>n</code> or has no space for the trail, <code>s</code> is left
+ * untouched otherwise this function modifies <code>s</code>. 
+ * <pre>
+ * Example: 
+ *  char s[] = "Hello World!";
+ *  Str_trunc(s, strlen(s)); -> "Hello World!" 
+ *  Str_trunc(s, 5); -> "Hello..."
+ *  Str_trunc(s, 0); -> "..."
+ * </pre>
+ * @param s String to truncate at n
+ * @param n number of bytes from where s is truncated
+ * @return A pointer to s
+ * @exception AssertException if n is less than 0
+*/
+char *Str_trunc(char *s, int n);
+
+
+/**
+ * Cut string <code>s</code> short at <code>t</code>. That is, 
+ * remove all bytes in <code>s</code> from and including 
+ * <code>t</code> to the end of the string. If <code>t</code>
+ * is not found in <code>s</code>, <code>s</code> is not modified.
+ * <pre>
+ * Example: 
+ *  char s[] = "<text>Hello World</text>";
+ *  Str_curtail(s, "</text>"); -> "<text>Hello World" 
+ *  Str_curtail(s, ">"); -> "<text"
+ *  Str_curtail(s, "@"); -> "<text"
+ * </pre>
+ * @param s String to curtail
+ * @param t The sub-string to shorten the string <code>s</code> from
+ * @return A pointer to s
+ */
+char *Str_curtail(char *s, char *t);
+
+
+/**
+ * Returns true if the string <code>s</code> has length equal to or 
+ * larger than <code>limit</code>, otherwise false.
+ * @param s String to test
+ * @param limit The limit in bytes to test s against
+ * @return true if <code>s.length >= limit</code> otherwise false
+ * @exception AssertException if limit is less than 0
+ */
+int Str_lim(const char *s, int limit);
+
+
+/**
+ * Returns true if the regular expression <code>pattern</code> match
+ * the <code>subject</code> string, otherwise false. This function 
+ * supports POSIX regular expression for <code>pattern</code>. See
+ * re_format(7) for details. For example, to test for a valid email
+ * address, 
+ * <pre>
+ * Str_match("^[^@ ]+@([-a-zA-Z0-9]+\\.)+[a-zA-Z]{2,}$", "foo@bar.baz") -> true
+ * </pre>
+ * @param pattern the regular expression
+ * @param subject the string to match agains pattern
+ * @return true if subject match pattern, otherwise false
+ * @exception AssertException if pattern is invalid or cannot be 
+ * compiled. 
+ */
+int Str_match(const char *pattern, const char *subject);
+
+
+/**
+ * UNIX ELF hash algorithm. May be used as the <code>hash</code>
+ * function in a Table or a Set. 
+ * @param x A String
+ * @return A hash value for the String
+ * @see Table.h and Set.h
+ */
+unsigned int Str_hash(const void *x);
+
+
+/**
+ * Compare case sensitive two strings. Facade function for strcmp(3)
+ * that can be used as the comparison function in a Table or a Set
+ * @param x A String
+ * @param y A String
+ * @return 0 if x and y are equal otherwise a non-zero integer
+ * @see Table.h and Set.h
+ */
+int Str_cmp(const void *x, const void *y);
+
+
+#endif
diff --git a/monit-5.4/libmonit/src/util/StringBuffer.c b/monit-5.4/libmonit/src/util/StringBuffer.c
new file mode 100644
index 0000000..13edfb8
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/StringBuffer.c
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "Config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#include "StringBuffer.h"
+
+
+/**
+ * Implementation of the StringBuffer interface. 
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+/* ------------------------------------------------------------ Definitions */
+
+
+#define T StringBuffer_T
+struct T {
+        int used;
+        int length;
+	uchar_t *buffer;
+};
+
+
+/* ---------------------------------------------------------------- Private */
+
+
+static inline void append(T S, const char *s, va_list ap) {
+        va_list ap_copy;
+        while (true) {
+                va_copy(ap_copy, ap);
+                int n = vsnprintf((char*)(S->buffer + S->used), S->length - S->used, s, ap_copy);
+                va_end(ap_copy);
+                if ((S->used + n) < S->length) {
+                        S->used += n;
+                        break;
+                }
+                S->length += STRLEN + n;
+                RESIZE(S->buffer, S->length);
+        }
+}
+
+
+static inline T ctor(int hint) {
+        T S;
+        NEW(S);
+        S->used = 0;
+        S->length = hint;
+        S->buffer = ALLOC(hint);
+        *S->buffer = 0;
+        return S;
+}
+
+
+/* ----------------------------------------------------------------- Public */
+
+
+T StringBuffer_new(const char *s) {
+        return StringBuffer_append(ctor(STRLEN), "%s", s);
+}
+
+
+T StringBuffer_create(int hint) {
+        if (hint <= 0)
+                THROW(AssertException, "Illegal hint value");
+        return ctor(hint);
+}
+
+
+void StringBuffer_free(T *S) {
+        assert(S && *S);
+        FREE((*S)->buffer);
+        FREE(*S);
+}
+
+
+T StringBuffer_append(T S, const char *s, ...) {
+        assert(S);
+        if (s && *s) {
+                va_list ap;
+                va_start(ap, s);
+                append(S, s, ap);
+                va_end(ap);
+        }
+        return S;
+}
+
+
+T StringBuffer_vappend(T S, const char *s, va_list ap) {
+        assert(S);
+        if (s && *s) {
+                va_list ap_copy;
+                va_copy(ap_copy, ap);
+                append(S, s, ap_copy);
+                va_end(ap_copy);
+        }
+        return S;
+}
+
+
+char StringBuffer_charAt(T S, int index) {
+        assert(S);
+        if (index < 0 || index > S->used)
+                THROW(AssertException, "Index out of bounds");
+        return S->buffer[index];
+}
+
+
+void StringBuffer_setCharAt(T S, int index, char c) {
+        assert(S);
+        if (index < 0 || index > S->used)
+                THROW(AssertException, "Index out of bounds");
+        S->buffer[index] = c;
+}
+
+
+int StringBuffer_replace(T S, const char *a, const char *b) {
+        int n = 0;
+        assert(S);
+        if (a && b && *a) {
+                register int i, j;
+                for (i = 0; S->buffer[i]; i++) {
+                        if (S->buffer[i] == *a) {
+                                j = 0;
+                                do
+                                        if (! a[++j]) {n++; break;}
+                                while (S->buffer[i + j] == a[j]);
+                        }
+                }
+                if (n) {
+                        int m = n;
+                        size_t bl = strlen(b);
+                        size_t diff = bl - strlen(a);
+                        if (diff > 0) {
+                                size_t required = (diff * n) + S->used + 1;
+                                if (required >= S->length) {
+                                        S->length = (int)required;
+                                        RESIZE(S->buffer, S->length);
+                                }
+                        }
+                        for (i = 0; m; i++) {
+                                if (S->buffer[i] == *a) {
+                                        j = 0;
+                                        do
+                                                if (! a[++j]) {
+                                                        memmove(S->buffer + i + bl, S->buffer + i + j, (S->used - (i + j)));
+                                                        memcpy(S->buffer + i, b, bl); 
+                                                        S->used += diff;
+                                                        i += bl - 1;
+                                                        m--;
+                                                        break;
+                                                }
+                                        while (S->buffer[i + j] == a[j]);
+                                }
+                        }
+                        S->buffer[S->used] = 0;
+                }
+        }
+        return n;
+}
+
+
+T StringBuffer_trim(T S) {
+        assert(S);
+        // Right trim
+        while (S->used && isspace(S->buffer[S->used - 1])) 
+                S->buffer[--S->used] = 0;
+        // Left trim
+        if (isspace(*S->buffer)) {
+                int i;
+                for (i = 0; isspace(S->buffer[i]); i++) ;
+                memmove(S->buffer, S->buffer + i, S->used - i);
+                S->used -= i;
+                S->buffer[S->used] = 0;
+        }
+        return S;
+}
+
+
+T StringBuffer_delete(T S, int index) {
+        assert(S);
+        if (index < 0 || index > S->used)
+                THROW(AssertException, "Index out of bounds");
+        S->used = index;
+        S->buffer[S->used] = 0;
+        return S;
+}
+
+
+int StringBuffer_indexOf(T S, const char *s) {
+        assert(S);
+        if (s && *s) {
+                register int i, j;
+                for (i = 0; i <= S->used; i++) {
+                        if (S->buffer[i] == *s) {
+                                j = 0;
+                                do
+                                        if (! s[++j])
+                                                return i;
+                                while (S->buffer[i + j] == s[j]);
+                        }
+                }
+        }
+        return -1;
+}
+
+
+int StringBuffer_lastIndexOf(T S, const char *s) {
+        assert(S);
+        if (s && *s) {
+                register int i, j;
+                for (i = S->used; i >= 0; i--) {
+                        if (S->buffer[i] == *s) {
+                                j = 0;
+                                do
+                                        if (! s[++j])
+                                                return i;
+                                while (S->buffer[i + j] == s[j]);
+                        }
+                }
+        }
+        return -1;
+}
+
+
+const char *StringBuffer_substring(T S, int index) {
+        assert(S);
+        if (index < 0 || index > S->used)
+                THROW(AssertException, "Index out of bounds");
+        return (const char*)(S->buffer + index);
+}
+
+
+int StringBuffer_length(T S) {
+        assert(S);
+        return S->used;
+}
+
+
+T StringBuffer_clear(T S) {
+        assert(S);
+        S->used = 0;
+        *S->buffer = 0;
+        return S;
+}
+
+
+const char *StringBuffer_toString(T S) {
+        assert(S);
+        return (const char*)S->buffer;
+}
+
diff --git a/monit-5.4/libmonit/src/util/StringBuffer.h b/monit-5.4/libmonit/src/util/StringBuffer.h
new file mode 100644
index 0000000..b854799
--- /dev/null
+++ b/monit-5.4/libmonit/src/util/StringBuffer.h
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef STRINGBUFFER_INCLUDED
+#define STRINGBUFFER_INCLUDED
+
+
+/** 
+ * A <b>StringBuffer</b> implements a mutable sequence of characters. 
+ * Indexing starts at 0 and it is a checked runtime error to access 
+ * index out of the range.
+ *
+ * This class is reentrant but not thread-safe
+ *
+ * @see http://www.mmonit.com/
+ * @file
+ */
+
+
+#define T StringBuffer_T
+typedef struct T *T;
+
+
+/**
+ * Constructs a string buffer so that it represents the same sequence of 
+ * characters as the string argument; in other  words, the initial contents 
+ * of the string buffer is a copy of the argument string. 
+ * @param s the initial contents of the buffer
+ * @return A new StringBuffer object
+ * @exception MemoryException if allocation failed
+ */
+T StringBuffer_new(const char *s);
+
+
+/**
+ * Factory method, create an empty string buffer
+ * @param hint The initial capacity of the buffer in bytes (hint > 0)
+ * @return A new StringBuffer object
+ * @exception AssertException if hint is less than or equal to 0
+ * @exception MemoryException if allocation failed
+ */
+T StringBuffer_create(int hint);
+
+
+/**
+ * Destroy a StringBuffer object and free allocated resources
+ * @param S a StringBuffer object reference
+ */
+void StringBuffer_free(T *S);
+
+
+/**
+ * The characters of the String argument are appended, in order, to the 
+ * contents of this string buffer, increasing the length of this string 
+ * buffer by the length of the argument. 
+ * @param S StringBuffer object
+ * @param s A string with optional var args
+ * @return a reference to this StringBuffer
+ * @exception MemoryException if allocation was used and failed
+ */
+T StringBuffer_append(T S, const char *s, ...) __attribute__((format (printf, 2, 3)));
+
+
+/**
+ * The characters of the String argument are appended, in order, to the 
+ * contents of this string buffer, increasing the length of this string 
+ * buffer by the length of the arguments. 
+ * @param S StringBuffer object
+ * @param s A string with optional var args
+ * @param ap A variable argument list
+ * @return a reference to this StringBuffer
+ * @exception MemoryException if allocation was used and failed
+ */
+T StringBuffer_vappend(T S, const char *s, va_list ap);
+
+
+/**
+ * Returns the character in the given <code>index</code> position. The
+ * first char in the string buffer is located at position 0 and the last
+ * character is located at StringBuffer_length() - 1. The index parameter
+ * must be greater than or equal to 0 and less than the length of the 
+ * StringBuffer.
+ * @param S StringBuffer object
+ * @param index The index of the character to return
+ * @return The char located at index
+ * @exception AssertException if the index parameter is negative 
+ * or greater than or equal to the StringBuffer length.
+ */
+char StringBuffer_charAt(T S, int index);
+
+
+/**
+ * Set the character in the StringBuffer to <code>c</code> at the 
+ * <code>index</code> position. The index parameter must be greater 
+ * than or equal to 0 and less than the length of the StringBuffer.
+ * @param S StringBuffer object
+ * @param index The index of the character to set
+ * @param c The character to set
+ * @exception AssertException if the index parameter is negative 
+ * or greater than or equal to the StringBuffer length.
+ */
+void StringBuffer_setCharAt(T S, int index, char c);
+
+
+/**
+ * Replace all occurences of <code>a</code> with <code>b</code>. Example: 
+ * <pre>
+ * StringBuffer_T b = StringBuffer_new("foo bar baz foo foo bar baz"); 
+ * StringBuffer_replace(b, "baz", "bar") -> "foo bar bar foo foo bar bar"
+ * StringBuffer_replace(b, "foo bar ", "") -> "bar foo bar"
+ * </pre>
+ * @param S StringBuffer object
+ * @param a The sub-string to be replaced with <code>b</code>
+ * @param b The string to replace <code>a</code>
+ * @return The number of replacements that took place
+ * @exception MemoryException if allocation was used and failed
+ */
+int StringBuffer_replace(T S, const char *a, const char *b);
+
+
+/**
+ * Remove (any) leading and trailing white space [ \\t\\r\\n]. Example
+ * <pre>
+ * StringBuffer_T b = StringBuffer_new("\t 'foo bar' \n"); 
+ * StringBuffer_trim(b) -> "'foo bar'"
+ * </pre>
+ * @param S StringBuffer object
+ * @return a reference to this StringBuffer
+ */
+T StringBuffer_trim(T S);
+
+
+/**
+ * Remove all characters from the given <code>index</code> position and 
+ * to the end of the StringBuffer. The index parameter must be greater 
+ * than or equal to 0 and less than the length of the StringBuffer.
+ * @param S StringBuffer object
+ * @param index The position of the buffer to start truncating
+ * @exception AssertException if the index parameter is negative 
+ * or greater than or equal to the StringBuffer length.
+ * @return a reference to this StringBuffer
+ */
+T StringBuffer_delete(T S, int index);
+
+
+/**
+ * Locate the first occurrence of the string <code>s</code> 
+ * in the StringBuffer. Example:
+ * <pre>
+ * StringBuffer_T b = StringBuffer_new("foo bar");
+ * StringBuffer_indexOf(b, "foo") ->  0
+ * StringBuffer_indexOf(b, "bar") ->  4
+ * StringBuffer_indexOf(b, "a")   ->  5
+ * StringBuffer_indexOf(b, "xy")  -> -1
+ * </pre>
+ * @param S StringBuffer object
+ * @param s The string to search for in the buffer
+ * @return The index of the first occurence of <code>s</code> in the
+ * buffer or -1 if not found.
+ */
+int StringBuffer_indexOf(T S, const char *s);
+
+
+/**
+ * Locate the last occurrence of the string <code>s</code> 
+ * in the StringBuffer.
+ * @param S StringBuffer object
+ * @param s The string to search for in the buffer
+ * @return The index of the last occurence of <code>s</code> in the
+ * buffer or -1 if not found.
+ */
+int StringBuffer_lastIndexOf(T S, const char *s);
+
+
+/**
+ * Returns a substring of characters currently contained in this character 
+ * sequence. The substring begins at the specified index and extends to the
+ * end of this sequence
+ * @param S StringBuffer object
+ * @param index The start index of the substring
+ * @return A substring of StringBuffer
+ * @exception AssertException if the index parameter is negative 
+ * or greater than or equal to the StringBuffer length.
+ */
+const char *StringBuffer_substring(T S, int index);
+
+
+/**
+ * Returns the length (character count) of this string buffer <i>not 
+ * including the last '\\0' char used to terminate a C-string</i>.
+ * @param S StringBuffer object
+ * @return the length of the sequence of characters currently represented 
+ * by this string buffer <i>not including the last NUL character</i>.
+ */
+int StringBuffer_length(T S);
+
+
+/**
+ * Clears the contents of the string buffer and set buffer length to 0.
+ * @param S StringBuffer object
+ * @return a reference to this StringBuffer
+ */
+T StringBuffer_clear(T S);
+
+
+/**
+ * Returns a string representing the data in this string buffer.
+ * @param S StringBuffer object
+ * @return a string representation of the string buffer 
+ */
+const char *StringBuffer_toString(T S);
+
+
+#undef T
+#endif
diff --git a/monit-5.4/libmonit/src/xconfig.h.in b/monit-5.4/libmonit/src/xconfig.h.in
new file mode 100644
index 0000000..a78b129
--- /dev/null
+++ b/monit-5.4/libmonit/src/xconfig.h.in
@@ -0,0 +1,176 @@
+/* src/xconfig.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if the system is AIX */
+#undef AIX
+
+/* Define to 1 if the system is OSX */
+#undef DARWIN
+
+/* Define to 1 if the system is FreeBSD */
+#undef FREEBSD
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#undef HAVE_CTYPE_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#undef HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+#undef HAVE_LIBCRYPTO
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the `ssl' library (-lssl). */
+#undef HAVE_LIBSSL
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#undef HAVE_SETJMP_H
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#undef HAVE_STROPTS_H
+
+/* Define to 1 if you have the <sys/dirent.h> header file. */
+#undef HAVE_SYS_DIRENT_H
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+#undef HAVE_SYS_FILIO_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+#undef HAVE_SYS_POLL_H
+
+/* Define to 1 if you have the <sys/sendfile.h> header file. */
+#undef HAVE_SYS_SENDFILE_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if the system is HPUX */
+#undef HPUX
+
+/* Define to 1 if the system supports IPv6 */
+#undef IPV6
+
+/* Define to 1 if the system is Linux */
+#undef LINUX
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to 1 if the system is NETBSD */
+#undef NETBSD
+
+/* Define to 1 if the system is OpenBSD */
+#undef OPENBSD
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if the system is SOLARIS */
+#undef SOLARIS
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/monit-5.4/libmonit/test/CommandTest.c b/monit-5.4/libmonit/test/CommandTest.c
new file mode 100644
index 0000000..a692dc5
--- /dev/null
+++ b/monit-5.4/libmonit/test/CommandTest.c
@@ -0,0 +1,226 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "List.h"
+#include "system/System.h"
+#include "system/Command.h"
+#include "system/Time.h"
+
+/**
+ * Command.c unit tests.
+ */
+
+
+static void onExec(Process_T P) {
+        assert(P);
+        char buf[STRLEN];
+        // Child process info
+        printf("\tSubprocess ((pid=%d) created with cwd (%s)\n", Process_getPid(P), Process_getDir(P));
+        InputStream_T in = Process_getInputStream(P);
+        OutputStream_T out = Process_getOutputStream(P);
+        InputStream_T err = Process_getErrorStream(P);
+        printf("\tSub-Process is %s\n", Process_isRunning(P) ? "running" : "not running");
+        printf("\tCommunication with child:\n");
+        if (! InputStream_readLine(in, buf, STRLEN)) {
+                InputStream_readLine(err, buf, STRLEN);
+                printf("\tError in script: %s\n", buf);
+        } else {
+                printf("\t%s", buf);
+                OutputStream_print(out, "Elessar Telcontar\n");
+                assert(OutputStream_flush(out) > 0);
+                char *line = InputStream_readLine(in, buf, STRLEN);
+                assert(line);
+                printf("\t%s", line);
+        }
+        Process_free(&P);
+        assert(! P);
+}
+
+
+static void onTerminate(Process_T P) {
+        assert(P);
+        printf("\tTest terminate subprocess ((pid=%d)\n", Process_getPid(P));
+        assert(Process_isRunning(P));
+        Process_terminate(P);
+        printf("\tWaiting on process to terminate.. ");
+        printf("Process exited with status: %d\n", Process_waitFor(P));
+        Process_free(&P);
+        assert(! P);
+}
+
+
+static void onKill(Process_T P) {
+        assert(P);
+        printf("\tTest kill subprocess ((pid=%d)\n", Process_getPid(P));
+        assert(Process_isRunning(P));
+        Process_kill(P);
+        printf("\tWaiting on process to exit.. ");
+        printf("Process exited with status: %d\n", Process_waitFor(P));
+        Process_free(&P);
+        assert(! P);
+}
+
+
+int main(void) {
+
+        Bootstrap(); // Need to initialize library
+                
+        printf("============> Start Command Tests\n\n");
+        
+        
+        printf("=> Test1: create/destroy\n");
+        {
+                Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL);
+                assert(c);
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test1: OK\n\n");
+        
+        printf("=> Test2: set and get uid/gid\n");
+        {
+                Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL);
+                assert(c);
+                // Check that default is 0
+                assert(Command_getUid(c) == 0);
+                assert(Command_getGid(c) == 0);
+                // set and test uid and gid
+                Command_setUid(c,42);
+                assert(Command_getUid(c) == 42);
+                Command_setGid(c,148);
+                assert(Command_getGid(c) == 148);
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test2: OK\n\n");
+                
+        printf("=> Test3: set and get working directory\n");
+        {
+                Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL);
+                assert(c);
+                // Check that a default working directory is NULL. I.e. current directory
+                assert(! Command_getDir(c));
+                // Check that a NULL working directory is allowed, meaning the calling process's current directory
+                Command_setDir(c, NULL);
+                // Set and get
+                Command_setDir(c, "/tmp/");
+                assert(Str_isEqual(Command_getDir(c), "/tmp")); // trailing separator is removed upon set
+                // Check invalid value
+                TRY
+                {
+                        Command_setDir(c, "/hubba/bubba");
+                        printf("Test failed\n");
+                        exit(1);
+                }
+                ELSE
+                {
+                        assert(Str_isEqual(Command_getDir(c), "/tmp"));
+                }
+                END_TRY;
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test3: OK\n\n");
+        
+        printf("=> Test4: set and get env\n");
+        {
+                Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL);
+                assert(c);
+                // Check default PATH
+                assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin"));
+                // Set and get
+                Command_setEnv(c, "LANG", "C");
+                assert(Str_isEqual(Command_getEnv(c, "LANG"), "C"));
+                Command_setEnv(c, "SHELL", "/bin/bash");
+                assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash"));
+                // setEnvString
+                // Check default PATH
+                assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin:/usr/bin:/usr/local/bin:/opt/csw/bin:/usr/sfw/bin"));
+                // Set and get env string
+                Command_vSetEnv(c, "PATH=/usr/bin;SHELL=/bin/bash");
+                assert(Str_isEqual(Command_getEnv(c, "PATH"), "/usr/bin"));
+                assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash"));
+                // With space in string
+                Command_vSetEnv(c, "LANG = C");
+                assert(Str_isEqual(Command_getEnv(c, "LANG"), "C"));
+                Command_vSetEnv(c, "PATH = /usr/bin ; SHELL = /bin/bash");
+                assert(Str_isEqual(Command_getEnv(c, "PATH"), "/usr/bin"));
+                assert(Str_isEqual(Command_getEnv(c, "SHELL"), "/bin/bash"));
+                // Invalid String
+                Command_vSetEnv(c, "HELLO:WORLD");
+                assert(! Command_getEnv(c, "HELLO"));
+                assert(! Command_getEnv(c, "HELLO:WORLD"));
+                // Varargs
+                Command_vSetEnv(c, "PATH=%s; TERM=%s;", "/bin", "vterm");
+                assert(Str_isEqual(Command_getEnv(c, "PATH"), "/bin"));
+                assert(Str_isEqual(Command_getEnv(c, "TERM"), "vterm"));
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test4: OK\n\n");
+        
+        printf("=> Test5: set and get Command\n");
+        {
+                Command_T c = Command_new("/bin/sh", "-c", "ps -aef|grep monit", NULL);
+                assert(c);
+                List_T l = Command_getCommand(c);
+                assert(Str_isEqual(l->head->e, "/bin/sh"));
+                assert(Str_isEqual(l->head->next->e, "-c"));
+                assert(Str_isEqual(l->head->next->next->e, "ps -aef|grep monit"));
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test5: OK\n\n");
+
+        printf("=> Test6: execute\n");
+        {
+                // Program producing error
+                Command_T c = Command_new("/bin/sh", "-c", "baluba;", NULL);
+                assert(c);
+                Command_setDir(c, "/");
+                printf("\tThis should produce an error:\n");
+                onExec(Command_execute(c));
+                Command_free(&c);
+                assert(!c);
+
+                // Correct program
+                c = Command_new("/bin/sh", "-c", "echo \"Please enter your name:\";read name;echo \"Hello $name\";", NULL);
+                assert(c);
+                onExec(Command_execute(c));
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test6: OK\n\n");
+                
+        printf("=> Test7: terminate and kill sub-process\n");
+        {
+                // Test terminate
+                Command_T c = Command_new("/bin/sh", "-c", "sleep 30;", NULL);
+                assert(c);
+                onTerminate(Command_execute(c));
+                Command_free(&c);
+                assert(!c);
+                
+                // Test kill
+                c = Command_new("/bin/sh", "-c", "trap 1 2 15; sleep 30; ", NULL);
+                assert(c);
+                onKill(Command_execute(c));
+                Command_free(&c);
+                assert(!c);
+        }
+        printf("=> Test7: OK\n\n");
+
+        printf("============> Command Tests: OK\n\n");
+       
+        return 0;
+}
+
diff --git a/monit-5.4/libmonit/test/DirTest.c b/monit-5.4/libmonit/test/DirTest.c
new file mode 100644
index 0000000..91b5426
--- /dev/null
+++ b/monit-5.4/libmonit/test/DirTest.c
@@ -0,0 +1,73 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <limits.h>
+#include <time.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "system/Time.h"
+#include "File.h"
+#include "Dir.h"
+
+/**
+ * Dir.c unity tests. 
+ */
+
+
+int main(void) {
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start Dir Tests\n\n");
+        
+        printf("=> Test1: mkdir\n");
+        {
+                File_setUmask(022);
+                assert(Dir_mkdir("X", 0));
+                printf("\tResult: Dir X created with default perm = %#o\n", File_mod("X"));
+                assert(File_mod("X") & 755);
+                assert(Dir_mkdir("Y", 0700));
+                printf("\tResult: Dir Y created with perm = %#o\n", File_mod("Y"));
+                assert(File_mod("Y") & 700);
+        }
+        printf("=> Test1: OK\n\n");
+
+        printf("=> Test2: chdir\n");
+        {
+                printf("\tResult: Changing working dir to X\n");
+                assert(Dir_chdir("X"));
+                printf("\tResult: Changing working dir to Y\n");
+                assert(Dir_chdir("../Y"));
+        }
+        printf("=> Test2: OK\n\n");
+
+        printf("=> Test3: getwd\n");
+        {
+                char cwd[STRLEN];
+                assert(Dir_cwd(cwd, STRLEN));
+                printf("\tResult: Current working dir is: %s\n", cwd);
+                assert(Str_endsWith(cwd, "Y"));
+                assert(Dir_chdir(".."));
+                assert(Dir_cwd(cwd, STRLEN));
+                printf("\tResult: Current working dir is: %s\n", cwd);
+        }
+        printf("=> Test3: OK\n\n");
+                 
+        printf("=> Test4: delete\n");
+        {
+                printf("\tResult: deleting dir X.. ");
+                assert(Dir_delete("X"));
+                printf("ok\n");
+                printf("\tResult: deleting dir Y.. ");
+                assert(Dir_delete("Y"));
+                printf("ok\n");
+        }
+        printf("=> Test4: OK\n\n");
+                 
+        printf("============> Dir Tests: OK\n\n");
+                 
+        return 0;
+}
diff --git a/monit-5.4/libmonit/test/ExceptionTest.c b/monit-5.4/libmonit/test/ExceptionTest.c
new file mode 100644
index 0000000..5e51dc9
--- /dev/null
+++ b/monit-5.4/libmonit/test/ExceptionTest.c
@@ -0,0 +1,374 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "Thread.h"
+#include "Exception.h"
+#include "AssertException.h"
+
+
+/**
+ * Exception unity tests
+ */
+
+#define THREADS 200
+
+Exception_T A= {"AException"};
+Exception_T B= {"BException"};
+Exception_T C= {"CException"};
+Exception_T D= {"DException"};
+
+void throwA() {
+        THROW(A, NULL);
+}
+
+void throwB() {
+        THROW(B, NULL);
+}
+
+void throwC() {
+        THROW(C, "A cause");
+}
+
+void throwD() {
+        THROW(D, "A cause");
+}
+
+void indirectA() {
+        throwA();
+}
+
+/* Throw and catch exceptions and check that we got the expected exception. 
+ * If the exception stack is corrupt somehow this should be detected
+ */
+void *thread(void *args) {
+        TRY
+                THROW(A, "A cause");
+                assert(false); // Should not be reached
+        CATCH(A)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, "A cause");
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(D, NULL);
+                assert(false); // Should not be reached
+        CATCH(D)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(C, NULL);
+                assert(false); // Should not be reached
+        CATCH(C)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(A, NULL);
+                assert(false); // Should not be reached
+        CATCH(A)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                throwA();
+                throwB();
+                throwC();
+                throwD();
+        CATCH(A)
+                // Ok
+        CATCH(B)
+                assert(false); // Should not be reached
+        CATCH(C)
+                assert(false); // Should not be reached
+        CATCH(D)
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                indirectA();
+        CATCH(A)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, NULL);
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, NULL);
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, NULL);
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, "A cause %s", "and another cause");
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(A, NULL);
+                assert(false); // Should not be reached
+        CATCH(A)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(B, NULL);
+                assert(false); // Should not be reached
+        CATCH(B)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                THROW(D, NULL);
+                assert(false); // Should not be reached
+        CATCH(D)
+                // Ok
+        ELSE
+                assert(false); // Should not be reached
+        END_TRY;
+        TRY
+                RETURN (NULL);
+                assert(false); // Should not be reached
+        CATCH(A)
+                assert(false); // Should not be reached
+        END_TRY;
+        return NULL; 
+}
+
+
+int main(void) {
+        Bootstrap(); // Need to initialize library
+        printf("============> Start Exeption Tests\n\n");
+        
+        printf("=> Test1: TRY-CATCH\n");
+        {
+                TRY
+                        THROW(A, "A cause");
+                        assert(false); // Should not be reached
+                CATCH(A)
+                        printf("\tResult: Ok\n");
+                END_TRY;
+        }
+        printf("=> Test1: OK\n\n");
+        
+        printf("=> Test2: TRY-CATCH indirect throw\n");
+        {
+                TRY
+                        indirectA();
+                        assert(false); // Should not be reached
+                CATCH(A)
+                        printf("\tResult: Ok\n");
+                END_TRY;
+        }
+        printf("=> Test2: OK\n\n");
+        
+        printf("=> Test3: TRY-ELSE\n");
+        {
+                TRY
+                        THROW(B, NULL);
+                        assert(false); // Should not be reached
+                ELSE
+                        printf("\tResult: Ok\n");
+                END_TRY;
+        }
+        printf("=> Test3: OK\n\n");
+ 
+        printf("=> Test4: TRY-CATCH-ELSE\n");
+        {
+                TRY
+                        throwB();
+                        assert(false); // Should not be reached
+                CATCH(A)
+                        assert(false); // Should not be reached
+                ELSE
+                        printf("\tResult: Ok\n");
+                END_TRY;
+        }
+        printf("=> Test4: OK\n\n");
+
+        printf("=> Test5: TRY-FINALLY\n");
+        {
+                int i= 0;
+                TRY
+                        i++;
+                FINALLY
+                        printf("\tResult: ok\n");
+                        assert(i==1);
+                END_TRY;
+        }
+        printf("=> Test5: OK\n\n");
+
+        printf("=> Test6: TRY-CATCH-FINALLY\n");
+        {
+                volatile int i = 0;
+                TRY
+                        i++;
+                        THROW(C, "A cause");
+                CATCH(C)
+                        i++;
+                FINALLY
+                        printf("\tResult: ok\n");
+                        assert(i == 2);
+                END_TRY;
+        }
+        printf("=> Test6: OK\n\n");
+        
+        printf("=> Test7: CATCH NumberFormatException\n");
+        {
+                TRY
+                        Str_parseInt("not a number");
+                        assert(false); // Should not be reached
+                CATCH(NumberFormatException)
+                        printf("\tResult: ok got NumberFormatException\n");
+                END_TRY;
+        }
+        printf("=> Test7: OK\n\n");
+        
+        printf("=> Test8: CATCH AssertException\n");
+        {
+                TRY
+                        assert(false); // Throws AssertException
+                        printf("Test8 failed\n"); 
+                        exit(1);
+                CATCH(AssertException)
+                        printf("\tResult: ok got AssertException\n");
+                END_TRY;
+        }
+        printf("=> Test8: OK\n\n");
+        
+        printf("=> Test9: Nested TRY-CATCH\n");
+        {
+                TRY
+                        TRY
+                                THROW(B, "A cause");
+                                THROW(A, "Another cause");
+                                assert(false); // Should not be reached
+                        CATCH(A)
+                                assert(false); // Should not be reached
+                        END_TRY;
+                CATCH(B)
+                        printf("\tResult: ok\n");
+                END_TRY;
+        }
+        printf("=> Test9: OK\n\n");
+        
+        printf("=> Test10: RETHROW\n");
+        {
+                TRY
+                        TRY
+                                THROW(A, "A cause %s", "and a cause");
+                                assert(false); // Should not be reached
+                        CATCH(A)
+                                RETHROW;
+                        END_TRY;
+                CATCH(A)
+                        printf("\tResult: ok got Exception\n");
+                END_TRY;
+        }
+        printf("=> Test10: OK\n\n");
+        
+        printf("=> Test11: No exception thrown\n");
+        {
+                TRY
+                        int i= 0; i++;
+                ELSE
+                        assert(false); // Should not be reached
+                END_TRY;
+        }
+        printf("=> Test11: OK\n\n");
+                
+        printf("=> Test12: Exception message append\n");
+        {
+                TRY
+                        TRY
+                                THROW(AssertException, "Original reason");
+                                exit(0); // Should not be reached
+                        CATCH(AssertException)
+                                THROW(AssertException, "%s - Appended reason", Exception_frame.message);
+                        END_TRY;
+                CATCH(AssertException)
+                        printf("\tResult: Got '%s' with reason: %s\n", AssertException.name, Exception_frame.message);
+                        assert(Str_startsWith(Exception_frame.message, "Original"));
+                END_TRY;
+        }
+        printf("=> Test12: OK\n\n");
+        
+        
+        printf("=> Test13: FINALLY rethrows exception\n");
+        {
+                TRY
+                {
+                        TRY
+                        {
+                                THROW(AssertException, "A reason");
+                                exit(0); // Should not be reached
+                        }
+                        FINALLY
+                        END_TRY;
+                        exit(0); // Should not be reached
+                }
+                CATCH(AssertException)
+                {
+                        printf("\tResult: Got '%s' thrown from FINALLY\n", AssertException.name);
+                }
+                END_TRY;
+        }
+        printf("=> Test13: OK\n\n");
+
+        
+        printf("=> Test14: Test thread-safeness\n");
+        {
+                int i;
+                Thread_T threads[THREADS];
+                for (i= 0; i < THREADS; i++) {
+                        Thread_create(threads[i], thread, NULL);
+                }
+                for (i= 0; i<THREADS; i++)
+                        Thread_join(threads[i]);
+        }
+        printf("=> Test14: OK\n\n");
+        
+        printf("============> Exception Tests: OK\n\n");
+
+        return 0;
+}
+
diff --git a/monit-5.4/libmonit/test/FileTest.c b/monit-5.4/libmonit/test/FileTest.c
new file mode 100644
index 0000000..98c5642
--- /dev/null
+++ b/monit-5.4/libmonit/test/FileTest.c
@@ -0,0 +1,167 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <limits.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "File.h"
+
+/**
+ * File.c unity tests.
+ */
+
+
+int main(void) {
+        char path[STRLEN];
+
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start File Tests\n\n");
+        
+        snprintf(path, STRLEN, "/tmp/.FileTest.%d", getpid());
+        
+        printf("=> Test1: open/close\n");
+        {
+                int fd;
+                assert((fd = File_open(path, "w")) != -1);
+                assert(File_close(fd) == true);
+                assert((fd = File_open(path, "w+")) != -1);
+                assert(File_close(fd) == true);
+                assert((fd = File_open("/a/b/c/d", "r")) == -1);
+                assert((fd = File_open(path, "r")) != -1);
+                assert(File_close(fd) == true);
+                assert((fd = File_open(path, "r+")) != -1);
+                assert(File_close(fd) == true);
+                assert((fd = File_open(path, "a")) != -1);
+                assert(File_close(fd) == true);
+                assert((fd = File_open(path, "a+")) != -1);
+                assert(write(fd, "something", sizeof("something") - 1) > 0);
+                assert(File_close(fd) == true);
+        }
+        printf("=> Test1: OK\n\n");
+
+        printf("=> Test2: check properties (class)\n");
+        {
+                char c;
+                int i;
+                long j;
+                long long k;
+                struct stat s;
+                assert(stat(path, &s) == 0);
+                assert((j = File_mtime(path)) > 0);
+                printf("\tmodification time: %ld\n", j);
+                assert(j == s.st_mtime);
+                assert((j = File_ctime(path)) > 0);
+                printf("\tchange time: %ld\n", j);
+                assert(j == s.st_ctime);
+                assert((j = File_atime(path)) > 0);
+                printf("\taccess time: %ld\n", j);
+                assert(j == s.st_atime);
+                assert((k = File_size(path)) >= 0);
+                printf("\tsize: %lld B\n", k);
+                assert(k == s.st_size);
+                assert((c = File_isFile(path)) == true);
+                assert((c = File_type(path)) == 'r');
+                printf("\ttype: regular file\n");
+                assert((File_exist(path)) == true);
+                printf("\texist: yes\n");
+                assert((i = File_mod(path)) > 0);
+                printf("\tpermission mode: %o\n", i & 07777);
+                assert(i == s.st_mode);
+                assert(File_chmod(path, 00640) == true);
+                assert((File_mod(path) & 07777) == 00640);
+                assert(File_isReadable(path) == true);
+                assert(File_isWritable(path) == true);
+#if defined(SOLARIS) || defined (FREEBSD) || defined (AIX)
+                /* Some systems like Solaris and FreeBSD return X_OK if the process has
+                 * appropriate privilege even if none of the execute file permission bits
+                 * are set. */
+                if (getuid() == 0)
+                        assert(File_isExecutable(path) == true);
+                else
+#endif
+                assert(File_isExecutable(path) == false);
+        }
+        printf("=> Test2: OK\n\n");
+
+        printf("=> Test3: check directory\n");
+        {
+                assert(File_isDirectory("/") == true);
+                assert(File_type("/") == 'd');
+                assert(File_isDirectory(path) == false);
+        }
+        printf("=> Test3: OK\n\n");
+
+        printf("=> Test4: check umask\n");
+        {
+                int i;
+                assert((i = File_umask()) >= 0);
+                printf("\tumask: %o\n", i & 07777);
+                assert(File_setUmask(0002) == i);
+                assert(File_setUmask(i) == 0002);
+        }
+        printf("=> Test4: OK\n\n");
+
+        printf("=> Test5: rename\n");
+        {
+                File_rename(path, "/tmp/.FileTest.abcde");
+                snprintf(path, STRLEN, "/tmp/.FileTest.abcde"); // the file is kept for later tests
+        }
+        printf("=> Test5: OK\n\n");
+
+        printf("=> Test6: path parsing\n");
+        {
+                char s[STRLEN];
+                assert(Str_isEqual(File_basename(path), ".FileTest.abcde"));
+                snprintf(s, STRLEN, "%s", path);
+                assert(Str_isEqual(File_dirname(s), "/tmp/"));
+                assert(Str_isEqual(File_extension(path), "abcde"));
+                char dir_path[] = "/tmp/";
+                assert(Str_isEqual(File_removeTrailingSeparator(dir_path), "/tmp"));
+        }
+        printf("=> Test6: OK\n\n");
+
+        printf("=> Test7: normalize path\n");
+        {
+                char s[PATH_MAX];
+                assert(File_getRealPath("/././tmp/../tmp", s) != NULL);
+#ifdef DARWIN
+                /* On Darwin /tmp is a link to /private/tmp */
+                assert(Str_isEqual(s, "/private/tmp")); 
+#else
+                assert(Str_isEqual(s, "/tmp"));
+#endif
+        }
+        printf("=> Test7: OK\n\n");
+
+        printf("=> Test8: delete\n");
+        {
+                assert(File_delete(path) == true);
+                assert(File_exist(path) == false);
+        }
+        printf("=> Test8: OK\n\n");
+        
+        printf("=> Test9: removeTrailingSeparator\n");
+        {
+                char a[] = "/abc/def/";
+                char b[] = "/abc/def";
+                assert(Str_isEqual(File_removeTrailingSeparator(a), "/abc/def"));
+                assert(Str_isEqual(File_removeTrailingSeparator(b), "/abc/def"));
+                assert(Str_isEqual(File_removeTrailingSeparator(""), ""));
+                assert(File_removeTrailingSeparator(NULL) == NULL);
+        }
+        printf("=> Test9: OK\n\n");
+        
+        printf("============> File Tests: OK\n\n");
+
+        return 0;
+}
+
+
diff --git a/monit-5.4/libmonit/test/InputStreamTest.c b/monit-5.4/libmonit/test/InputStreamTest.c
new file mode 100644
index 0000000..1b8ae1a
--- /dev/null
+++ b/monit-5.4/libmonit/test/InputStreamTest.c
@@ -0,0 +1,141 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "InputStream.h"
+#include "File.h"
+#include "Str.h"
+#include "system/System.h"
+
+/**
+ * InputStream.c unit tests. 
+ */
+
+#define DATA    "./data/stream.data"
+#define TIMEOUT 50
+
+int main(void) {
+        int fd;
+        InputStream_T in = NULL;
+
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start InputStream Tests\n\n");
+        
+        printf("=> Test0: create/destroy the file input stream\n");
+        {
+                in = InputStream_new(File_open(DATA, "r"));
+                assert(!InputStream_isClosed(in));
+                File_close(InputStream_getDescriptor(in));
+                InputStream_free(&in);
+                assert(in == NULL);
+        }
+        printf("=> Test0: OK\n\n");
+        
+        printf("=> Test1: get/set timeout\n");
+        {
+                assert((fd = File_open(DATA, "r")) >= 0);
+                in = InputStream_new(fd);
+                printf("\tCurrent timeout: %ldms\n", InputStream_getTimeout(in));
+                InputStream_setTimeout(in, TIMEOUT);
+                assert(InputStream_getTimeout(in) == TIMEOUT);
+                printf("\tTimeout set to:  %dms\n", TIMEOUT);
+                File_close(fd);
+                InputStream_free(&in);
+        }
+        printf("=> Test1: OK\n\n");
+
+        printf("=> Test2: read file by characters\n");
+        {
+                int byte;
+                int byteno = 0;
+                char content[][1] = {"l", "i", "n", "e", "1", "\n",
+                                     "l", "i", "n", "e", "2", "\n",
+                                     "l", "i", "n", "e", "3", "\n"};
+                assert((fd = File_open(DATA, "r")) >= 0);
+                in = InputStream_new(fd);
+                while ((byte = InputStream_read(in)) > 0) {
+                        assert(byte == *content[byteno++]);
+                }
+                File_close(fd);
+                InputStream_free(&in);
+        }
+        printf("=> Test2: OK\n\n");
+
+        printf("=> Test3: read file by lines\n");
+        {
+                int lineno = 0;
+                char line[STRLEN];
+                char content[][STRLEN] = {"line1\n", "line2\n", "line3\n"};
+                assert((fd = File_open(DATA, "r")) >= 0);
+                in = InputStream_new(fd);
+                while (InputStream_readLine(in, line, sizeof(line))) {
+                        assert(Str_isEqual(content[lineno++], line));
+                }
+                File_close(fd);
+                InputStream_free(&in);
+        }
+        printf("=> Test3: OK\n\n");
+
+        printf("=> Test4: read file by bytes\n");
+        {
+                char array[STRLEN];
+                char content[] = "line1\nline2\nline3\n";
+                memset(array, 0, STRLEN);
+                assert((fd = File_open(DATA, "r")) >= 0);
+                in = InputStream_new(fd);
+                while (InputStream_readBytes(in, array, sizeof(array)-1)) {
+                        assert(Str_isEqual(content, array));
+                }
+                File_close(fd);
+                InputStream_free(&in);
+        }
+        printf("=> Test4: OK\n\n");
+
+        printf("=> Test5: read a large file\n");
+        {
+                if ((fd = File_open("/usr/share/dict/words", "r")) >= 0) {
+                        int n = 0;
+                        char array[2][STRLEN + 1];
+                        in = InputStream_new(fd);
+                        for (int i = 0; ((n = InputStream_readBytes(in, array[i], STRLEN)) > 0); i = i ? 0 : 1)
+                                assert(strncmp(array[0], array[1], STRLEN/2) != 0); // ensure that InputStream buffer is filled anew
+                        File_rewind(fd);
+                        // Test read data larger than InputStream's internal buffer
+                        int filesize = (int)File_size("/usr/share/dict/words");
+                        char *bigarray = CALLOC(1, filesize + 1);
+                        n = InputStream_readBytes(in, bigarray, filesize);
+                        assert(n == filesize);
+                        File_close(fd);
+                        InputStream_free(&in);
+                        FREE(bigarray);
+                } else 
+                        ERROR("\t/usr/share/dict/words not available -- skipping test\n");
+        }
+        printf("=> Test5: OK\n\n");
+        
+        printf("=> Test6: wrong descriptor - expecting read fail\n");
+        {
+                in = InputStream_new(999);
+                TRY
+                assert(InputStream_read(in) != -1);
+                assert(false); // Should not come here
+                CATCH(AssertException)
+                // Passed
+                END_TRY;
+                InputStream_free(&in);
+        }
+        printf("=> Test6: OK\n\n");
+
+
+        printf("============> InputStream Tests: OK\n\n");
+
+        return 0;
+}
+
diff --git a/monit-5.4/libmonit/test/ListTest.c b/monit-5.4/libmonit/test/ListTest.c
new file mode 100644
index 0000000..7963281
--- /dev/null
+++ b/monit-5.4/libmonit/test/ListTest.c
@@ -0,0 +1,277 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "List.h"
+
+/**
+ * List.c unity tests.
+ */
+
+
+static void apply(void *value, void *ap) {
+        *(int *)ap += 1;
+}
+
+
+
+int main(void) {
+        List_T L = NULL;
+
+        Bootstrap(); // Need to initialize library
+
+        printf("============> Start List Tests\n\n");
+
+        printf("=> Test0: create\n");
+        {
+                L = List_new();
+                assert(L);
+                List_free(&L);
+        }
+        printf("=> Test0: OK\n\n");
+
+        printf("=> Test1: List_push() & List_length()\n");
+        {
+                L = List_new();
+                List_push(L, "1");
+                List_push(L, "2");
+                List_push(L, "3");
+                List_push(L, "4");
+                List_push(L, "5");
+                List_push(L, "6");
+                List_push(L, "7");
+                List_push(L, "8");
+                List_push(L, "9");
+                List_push(L, "10");
+                List_push(L, "11");
+                List_push(L, "12");
+                List_push(L, "13");
+                List_push(L, "14");
+                List_push(L, "15");
+                assert(Str_isEqual(L->tail->e, "1"));
+                assert(Str_isEqual(L->head->e, "15"));
+                assert(List_length(L) == 15);
+        }
+        printf("=> Test1: OK\n\n");
+
+        printf("=> Test2: List_pop()\n");
+        {
+                int i= 0;
+                list_t p;
+                while (List_pop(L)) ;
+                assert(List_length(L) == 0);
+                // Ensure that nodes are retained in the freelist
+                for (p= L->freelist; p; p= p->next) i++;
+                assert(i == 15);
+                List_free(&L);
+        }
+        printf("=> Test2: OK\n\n");
+
+        printf("=> Test3: List_append()\n");
+        {
+                L = List_new();
+                List_append(L, "1");
+                List_append(L, "2");
+                List_append(L, "3");
+                List_append(L, "4");
+                List_append(L, "5");
+                List_append(L, "6");
+                List_append(L, "7");
+                List_append(L, "8");
+                List_append(L, "9");
+                List_append(L, "10");
+                List_append(L, "11");
+                List_append(L, "12");
+                List_append(L, "13");
+                List_append(L, "14");
+                List_append(L, "15");
+                assert(Str_isEqual(L->tail->e, "15"));
+                assert(Str_isEqual(L->head->e, "1"));
+                assert(List_length(L) == 15);
+        }
+        printf("=> Test3: OK\n\n");
+
+        printf("=> Test4: List_cat()\n");
+        {
+                List_T t= List_new();
+                List_append(t, "a");
+                List_append(t, "b");
+                List_append(t, "c");
+                List_append(t, "d");
+                List_cat(L, t);
+                assert(Str_isEqual(L->tail->e, "d"));
+                assert(Str_isEqual(L->head->e, "1"));
+                assert(List_length(L) == 19);
+        }
+        printf("=> Test4: OK\n\n");
+
+        printf("=> Test5: List_reverse()\n");
+        {
+                list_t p;
+                List_T l= List_new();
+                List_append(l, "a");
+                List_append(l, "b");
+                List_append(l, "c");
+                List_append(l, "d");
+                printf("\tList before reverse: ");
+                for (p= l->head; p; p= p->next)
+                        printf("%s%s", (char*)p->e, p->next?"->":"\n");
+                assert(Str_isEqual(l->head->e, "a"));
+                assert(Str_isEqual(l->tail->e, "d"));
+                List_reverse(l);
+                printf("\tList after reverse: ");
+                for (p= l->head; p; p= p->next)
+                        printf("%s%s", (char*)p->e, p->next?"->":"\n");
+                assert(Str_isEqual(l->head->e, "d"));
+                assert(Str_isEqual(l->tail->e, "a"));
+                List_free(&l);
+        }
+        printf("=> Test5: OK\n\n");
+
+        printf("=> Test6: List_map()\n");
+        {
+                int i = 0;
+                List_map(L, apply, &i);
+                assert(i == 19);
+        }
+        printf("=> Test6: OK\n\n");
+
+        printf("=> Test7: List_clear()\n");
+        {
+                List_clear(L);
+                assert(List_length(L) == 0);
+                assert(L->freelist);
+        }
+        printf("=> Test7: OK\n\n");
+        
+        List_free(&L);
+        
+        printf("=> Test8: List malloc\n");
+        {
+                L = List_new();
+                List_push(L, "1");
+                List_push(L, "2");
+                List_push(L, "3");
+                List_push(L, "4");
+                List_push(L, "5");
+                List_push(L, "6");
+                List_push(L, "7");
+                List_push(L, "8");
+                List_push(L, "9");
+                List_push(L, "10");
+                List_push(L, "11");
+                List_push(L, "12");
+                List_push(L, "13");
+                List_push(L, "14");
+                List_push(L, "15");
+                assert(Str_isEqual(L->tail->e, "1"));
+                assert(Str_isEqual(L->head->e, "15"));
+                assert(List_length(L) == 15);
+                List_clear(L);
+                List_append(L, "1");
+                List_append(L, "2");
+                List_append(L, "3");
+                List_append(L, "4");
+                List_append(L, "5");
+                List_append(L, "6");
+                List_append(L, "7");
+                List_append(L, "8");
+                List_append(L, "9");
+                List_append(L, "10");
+                List_append(L, "11");
+                List_append(L, "12");
+                List_append(L, "13");
+                List_append(L, "14");
+                List_append(L, "15");
+                assert(Str_isEqual(L->tail->e, "15"));
+                assert(Str_isEqual(L->head->e, "1"));
+                assert(List_length(L) == 15);
+                List_free(&L);
+        }
+        printf("=> Test8: OK\n\n");
+
+        printf("=> Test9: List remove\n");
+        {
+                char *one = "1";
+                char *two = "2";
+                L = List_new();
+                printf("\tRemove from empty list.. ");
+                assert(List_remove(L, "1") == NULL);
+                printf("OK\n");
+                List_push(L, one);
+                printf("\tRemove from 1 element list.. ");
+                assert(List_remove(L, one) == one);
+                assert(List_length(L) == 0);
+                printf("OK\n");
+                List_push(L, one);
+                List_push(L, two);
+                printf("\tRemove last from list.. ");
+                assert(List_remove(L, two) == two);
+                assert(List_length(L) == 1);
+                printf("OK\n");
+                List_append(L, two);
+                List_append(L, two);
+                List_append(L, two);
+                List_append(L, "5");
+                printf("\tRemove first occurrence.. ");
+                assert(List_remove(L, two) == two);
+                assert(List_length(L) == 4);
+                printf("OK\n");
+                List_free(&L);
+        }
+        printf("=> Test9: OK\n\n");
+        
+        printf("=> Test10: check pointers\n");
+        {
+                L = List_new();
+                printf("\tCheck pop.. ");
+                List_push(L, "1");
+                List_push(L, "2");
+                List_pop(L);
+                List_pop(L);
+                List_push(L, "1");
+                assert(L->head == L->tail);
+                List_pop(L);
+                List_append(L, "1");
+                assert(L->head == L->tail);
+                printf("OK\n");
+                printf("\tCheck remove.. ");
+                List_push(L, "1");
+                List_append(L, "2");
+                List_remove(L, "2");
+                List_remove(L, "1");
+                assert(L->head == L->tail);
+                printf("OK\n");
+                List_free(&L);
+        }
+        printf("=> Test10: OK\n\n");
+        
+        printf("=> Test11: List_toArray()\n");
+        {
+                List_T l = List_new();
+                List_append(l, "a");
+                List_append(l, "b");
+                List_append(l, "c");
+                List_append(l, "d");
+                char **array = (char**)List_toArray(l);
+                assert(Str_isEqual(array[0], "a"));
+                assert(Str_isEqual(array[1], "b"));
+                assert(Str_isEqual(array[2], "c"));
+                assert(Str_isEqual(array[3], "d"));
+                assert(array[4] == NULL);
+                FREE(array);
+                List_free(&l);
+        }
+        printf("=> Test11: OK\n\n");
+        
+        printf("============> List Tests: OK\n\n");
+
+        return 0;
+}
+
+
diff --git a/monit-5.4/libmonit/test/Makefile b/monit-5.4/libmonit/test/Makefile
new file mode 100644
index 0000000..e702b42
--- /dev/null
+++ b/monit-5.4/libmonit/test/Makefile
@@ -0,0 +1,562 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# test/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+
+pkgdatadir = $(datadir)/libmonit
+pkgincludedir = $(includedir)/libmonit
+pkglibdir = $(libdir)/libmonit
+pkglibexecdir = $(libexecdir)/libmonit
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+noinst_PROGRAMS = StrTest$(EXEEXT) SystemTest$(EXEEXT) \
+	ListTest$(EXEEXT) DirTest$(EXEEXT) StringBufferTest$(EXEEXT) \
+	InputStreamTest$(EXEEXT) OutputStreamTest$(EXEEXT) \
+	FileTest$(EXEEXT) ExceptionTest$(EXEEXT) NetTest$(EXEEXT) \
+	TimeTest$(EXEEXT) CommandTest$(EXEEXT)
+subdir = test
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/xconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_CommandTest_OBJECTS = CommandTest.$(OBJEXT)
+CommandTest_OBJECTS = $(am_CommandTest_OBJECTS)
+CommandTest_LDADD = $(LDADD)
+CommandTest_DEPENDENCIES = ../libmonit.la
+am_DirTest_OBJECTS = DirTest.$(OBJEXT)
+DirTest_OBJECTS = $(am_DirTest_OBJECTS)
+DirTest_LDADD = $(LDADD)
+DirTest_DEPENDENCIES = ../libmonit.la
+am_ExceptionTest_OBJECTS = ExceptionTest.$(OBJEXT)
+ExceptionTest_OBJECTS = $(am_ExceptionTest_OBJECTS)
+ExceptionTest_LDADD = $(LDADD)
+ExceptionTest_DEPENDENCIES = ../libmonit.la
+am_FileTest_OBJECTS = FileTest.$(OBJEXT)
+FileTest_OBJECTS = $(am_FileTest_OBJECTS)
+FileTest_LDADD = $(LDADD)
+FileTest_DEPENDENCIES = ../libmonit.la
+am_InputStreamTest_OBJECTS = InputStreamTest.$(OBJEXT)
+InputStreamTest_OBJECTS = $(am_InputStreamTest_OBJECTS)
+InputStreamTest_LDADD = $(LDADD)
+InputStreamTest_DEPENDENCIES = ../libmonit.la
+am_ListTest_OBJECTS = ListTest.$(OBJEXT)
+ListTest_OBJECTS = $(am_ListTest_OBJECTS)
+ListTest_LDADD = $(LDADD)
+ListTest_DEPENDENCIES = ../libmonit.la
+am_NetTest_OBJECTS = NetTest.$(OBJEXT)
+NetTest_OBJECTS = $(am_NetTest_OBJECTS)
+NetTest_LDADD = $(LDADD)
+NetTest_DEPENDENCIES = ../libmonit.la
+am_OutputStreamTest_OBJECTS = OutputStreamTest.$(OBJEXT)
+OutputStreamTest_OBJECTS = $(am_OutputStreamTest_OBJECTS)
+OutputStreamTest_LDADD = $(LDADD)
+OutputStreamTest_DEPENDENCIES = ../libmonit.la
+am_StrTest_OBJECTS = StrTest.$(OBJEXT)
+StrTest_OBJECTS = $(am_StrTest_OBJECTS)
+StrTest_LDADD = $(LDADD)
+StrTest_DEPENDENCIES = ../libmonit.la
+am_StringBufferTest_OBJECTS = StringBufferTest.$(OBJEXT)
+StringBufferTest_OBJECTS = $(am_StringBufferTest_OBJECTS)
+StringBufferTest_LDADD = $(LDADD)
+StringBufferTest_DEPENDENCIES = ../libmonit.la
+am_SystemTest_OBJECTS = SystemTest.$(OBJEXT)
+SystemTest_OBJECTS = $(am_SystemTest_OBJECTS)
+SystemTest_LDADD = $(LDADD)
+SystemTest_DEPENDENCIES = ../libmonit.la
+am_TimeTest_OBJECTS = TimeTest.$(OBJEXT)
+TimeTest_OBJECTS = $(am_TimeTest_OBJECTS)
+TimeTest_LDADD = $(LDADD)
+TimeTest_DEPENDENCIES = ../libmonit.la
+DEFAULT_INCLUDES = -I. -I$(top_builddir)/src
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(CommandTest_SOURCES) $(DirTest_SOURCES) \
+	$(ExceptionTest_SOURCES) $(FileTest_SOURCES) \
+	$(InputStreamTest_SOURCES) $(ListTest_SOURCES) \
+	$(NetTest_SOURCES) $(OutputStreamTest_SOURCES) \
+	$(StrTest_SOURCES) $(StringBufferTest_SOURCES) \
+	$(SystemTest_SOURCES) $(TimeTest_SOURCES)
+DIST_SOURCES = $(CommandTest_SOURCES) $(DirTest_SOURCES) \
+	$(ExceptionTest_SOURCES) $(FileTest_SOURCES) \
+	$(InputStreamTest_SOURCES) $(ListTest_SOURCES) \
+	$(NetTest_SOURCES) $(OutputStreamTest_SOURCES) \
+	$(StrTest_SOURCES) $(StringBufferTest_SOURCES) \
+	$(SystemTest_SOURCES) $(TimeTest_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run aclocal-1.11
+AMTAR = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run tar
+AR = ar
+AUTOCONF = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run automake-1.11
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=none
+CFLAGS = -Wno-address -Wno-pointer-sign -g -O2 -D _REENTRANT -Wall -Wunused -Wno-unused-label -funsigned-char -D_GNU_SOURCE -std=c99
+CPP = gcc -E
+CPPFLAGS = 
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DSYMUTIL = 
+DUMPBIN = 
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /bin/grep -E
+EXEEXT = 
+FGREP = /bin/grep -F
+GREP = /bin/grep
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS = 
+LIBOBJS = 
+LIBS = -lpthread 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIPO = 
+LN_S = ln -s
+LTLIBOBJS = 
+MAKEINFO = ${SHELL} /home/martinp/svn/monit/libmonit/config/missing --run makeinfo
+MKDIR_P = /bin/mkdir -p
+NM = /usr/bin/nm -B
+NMEDIT = 
+OBJDUMP = objdump
+OBJEXT = o
+OTOOL = 
+OTOOL64 = 
+PACKAGE = libmonit
+PACKAGE_BUGREPORT = monit-dev@tildeslash.com
+PACKAGE_NAME = libmonit
+PACKAGE_STRING = libmonit 1.0
+PACKAGE_TARNAME = libmonit
+PACKAGE_URL = 
+PACKAGE_VERSION = 1.0
+PATH_SEPARATOR = :
+RANLIB = ranlib
+SED = /bin/sed
+SET_MAKE = 
+SHELL = /bin/bash
+STRIP = strip
+VERSION = 1.0
+abs_builddir = /home/martinp/svn/monit/libmonit/test
+abs_srcdir = /home/martinp/svn/monit/libmonit/test
+abs_top_builddir = /home/martinp/svn/monit/libmonit
+abs_top_srcdir = /home/martinp/svn/monit/libmonit
+ac_ct_CC = gcc
+ac_ct_DUMPBIN = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias = 
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias = 
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/martinp/svn/monit/libmonit/config/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+lt_ECHO = echo
+mandir = ${datarootdir}/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target_alias = 
+top_build_prefix = ../
+top_builddir = ..
+top_srcdir = ..
+AUTOMAKE_OPTIONS = foreign no-dependencies
+LDADD = ../libmonit.la
+INCLUDES = -I../src/ -I../src/util -I../src/net -I../src/io -I../src/exceptions -I../src/thread 
+StrTest_SOURCES = StrTest.c
+CommandTest_SOURCES = CommandTest.c
+SystemTest_SOURCES = SystemTest.c
+ListTest_SOURCES = ListTest.c
+DirTest_SOURCES = DirTest.c
+StringBufferTest_SOURCES = StringBufferTest.c
+InputStreamTest_SOURCES = InputStreamTest.c
+OutputStreamTest_SOURCES = OutputStreamTest.c
+FileTest_SOURCES = FileTest.c
+ExceptionTest_SOURCES = ExceptionTest.c
+NetTest_SOURCES = NetTest.c
+TimeTest_SOURCES = TimeTest.c
+DISTCLEANFILES = *~ 
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+CommandTest$(EXEEXT): $(CommandTest_OBJECTS) $(CommandTest_DEPENDENCIES) 
+	@rm -f CommandTest$(EXEEXT)
+	$(LINK) $(CommandTest_OBJECTS) $(CommandTest_LDADD) $(LIBS)
+DirTest$(EXEEXT): $(DirTest_OBJECTS) $(DirTest_DEPENDENCIES) 
+	@rm -f DirTest$(EXEEXT)
+	$(LINK) $(DirTest_OBJECTS) $(DirTest_LDADD) $(LIBS)
+ExceptionTest$(EXEEXT): $(ExceptionTest_OBJECTS) $(ExceptionTest_DEPENDENCIES) 
+	@rm -f ExceptionTest$(EXEEXT)
+	$(LINK) $(ExceptionTest_OBJECTS) $(ExceptionTest_LDADD) $(LIBS)
+FileTest$(EXEEXT): $(FileTest_OBJECTS) $(FileTest_DEPENDENCIES) 
+	@rm -f FileTest$(EXEEXT)
+	$(LINK) $(FileTest_OBJECTS) $(FileTest_LDADD) $(LIBS)
+InputStreamTest$(EXEEXT): $(InputStreamTest_OBJECTS) $(InputStreamTest_DEPENDENCIES) 
+	@rm -f InputStreamTest$(EXEEXT)
+	$(LINK) $(InputStreamTest_OBJECTS) $(InputStreamTest_LDADD) $(LIBS)
+ListTest$(EXEEXT): $(ListTest_OBJECTS) $(ListTest_DEPENDENCIES) 
+	@rm -f ListTest$(EXEEXT)
+	$(LINK) $(ListTest_OBJECTS) $(ListTest_LDADD) $(LIBS)
+NetTest$(EXEEXT): $(NetTest_OBJECTS) $(NetTest_DEPENDENCIES) 
+	@rm -f NetTest$(EXEEXT)
+	$(LINK) $(NetTest_OBJECTS) $(NetTest_LDADD) $(LIBS)
+OutputStreamTest$(EXEEXT): $(OutputStreamTest_OBJECTS) $(OutputStreamTest_DEPENDENCIES) 
+	@rm -f OutputStreamTest$(EXEEXT)
+	$(LINK) $(OutputStreamTest_OBJECTS) $(OutputStreamTest_LDADD) $(LIBS)
+StrTest$(EXEEXT): $(StrTest_OBJECTS) $(StrTest_DEPENDENCIES) 
+	@rm -f StrTest$(EXEEXT)
+	$(LINK) $(StrTest_OBJECTS) $(StrTest_LDADD) $(LIBS)
+StringBufferTest$(EXEEXT): $(StringBufferTest_OBJECTS) $(StringBufferTest_DEPENDENCIES) 
+	@rm -f StringBufferTest$(EXEEXT)
+	$(LINK) $(StringBufferTest_OBJECTS) $(StringBufferTest_LDADD) $(LIBS)
+SystemTest$(EXEEXT): $(SystemTest_OBJECTS) $(SystemTest_DEPENDENCIES) 
+	@rm -f SystemTest$(EXEEXT)
+	$(LINK) $(SystemTest_OBJECTS) $(SystemTest_LDADD) $(LIBS)
+TimeTest$(EXEEXT): $(TimeTest_OBJECTS) $(TimeTest_DEPENDENCIES) 
+	@rm -f TimeTest$(EXEEXT)
+	$(LINK) $(TimeTest_OBJECTS) $(TimeTest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c $<
+
+.c.obj:
+	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstPROGRAMS ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-local distclean-tags distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am
+
+
+distclean-local: 
+	-rm -f Makefile.in
+
+verify:
+	@/bin/bash ./test.sh
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/monit-5.4/libmonit/test/Makefile.am b/monit-5.4/libmonit/test/Makefile.am
new file mode 100644
index 0000000..b91a317
--- /dev/null
+++ b/monit-5.4/libmonit/test/Makefile.am
@@ -0,0 +1,39 @@
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+LDADD = ../libmonit.la
+INCLUDES = -I../src/ -I../src/util -I../src/net -I../src/io -I../src/exceptions -I../src/thread 
+
+noinst_PROGRAMS = StrTest \
+                  SystemTest \
+                  ListTest \
+                  DirTest \
+                  StringBufferTest \
+                  InputStreamTest \
+                  OutputStreamTest \
+                  FileTest \
+                  ExceptionTest \
+                  NetTest \
+                  TimeTest \
+                  CommandTest
+
+StrTest_SOURCES = StrTest.c
+CommandTest_SOURCES = CommandTest.c
+SystemTest_SOURCES = SystemTest.c
+ListTest_SOURCES = ListTest.c
+DirTest_SOURCES = DirTest.c
+StringBufferTest_SOURCES = StringBufferTest.c
+InputStreamTest_SOURCES = InputStreamTest.c
+OutputStreamTest_SOURCES = OutputStreamTest.c
+FileTest_SOURCES = FileTest.c
+ExceptionTest_SOURCES = ExceptionTest.c
+NetTest_SOURCES = NetTest.c
+TimeTest_SOURCES = TimeTest.c
+
+DISTCLEANFILES = *~ 
+
+distclean-local: 
+	-rm -f Makefile.in
+
+verify:
+	@/bin/bash ./test.sh
+
diff --git a/monit-5.4/libmonit/test/Makefile.in b/monit-5.4/libmonit/test/Makefile.in
new file mode 100644
index 0000000..93f0ef6
--- /dev/null
+++ b/monit-5.4/libmonit/test/Makefile.in
@@ -0,0 +1,562 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = StrTest$(EXEEXT) SystemTest$(EXEEXT) \
+	ListTest$(EXEEXT) DirTest$(EXEEXT) StringBufferTest$(EXEEXT) \
+	InputStreamTest$(EXEEXT) OutputStreamTest$(EXEEXT) \
+	FileTest$(EXEEXT) ExceptionTest$(EXEEXT) NetTest$(EXEEXT) \
+	TimeTest$(EXEEXT) CommandTest$(EXEEXT)
+subdir = test
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/xconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_CommandTest_OBJECTS = CommandTest.$(OBJEXT)
+CommandTest_OBJECTS = $(am_CommandTest_OBJECTS)
+CommandTest_LDADD = $(LDADD)
+CommandTest_DEPENDENCIES = ../libmonit.la
+am_DirTest_OBJECTS = DirTest.$(OBJEXT)
+DirTest_OBJECTS = $(am_DirTest_OBJECTS)
+DirTest_LDADD = $(LDADD)
+DirTest_DEPENDENCIES = ../libmonit.la
+am_ExceptionTest_OBJECTS = ExceptionTest.$(OBJEXT)
+ExceptionTest_OBJECTS = $(am_ExceptionTest_OBJECTS)
+ExceptionTest_LDADD = $(LDADD)
+ExceptionTest_DEPENDENCIES = ../libmonit.la
+am_FileTest_OBJECTS = FileTest.$(OBJEXT)
+FileTest_OBJECTS = $(am_FileTest_OBJECTS)
+FileTest_LDADD = $(LDADD)
+FileTest_DEPENDENCIES = ../libmonit.la
+am_InputStreamTest_OBJECTS = InputStreamTest.$(OBJEXT)
+InputStreamTest_OBJECTS = $(am_InputStreamTest_OBJECTS)
+InputStreamTest_LDADD = $(LDADD)
+InputStreamTest_DEPENDENCIES = ../libmonit.la
+am_ListTest_OBJECTS = ListTest.$(OBJEXT)
+ListTest_OBJECTS = $(am_ListTest_OBJECTS)
+ListTest_LDADD = $(LDADD)
+ListTest_DEPENDENCIES = ../libmonit.la
+am_NetTest_OBJECTS = NetTest.$(OBJEXT)
+NetTest_OBJECTS = $(am_NetTest_OBJECTS)
+NetTest_LDADD = $(LDADD)
+NetTest_DEPENDENCIES = ../libmonit.la
+am_OutputStreamTest_OBJECTS = OutputStreamTest.$(OBJEXT)
+OutputStreamTest_OBJECTS = $(am_OutputStreamTest_OBJECTS)
+OutputStreamTest_LDADD = $(LDADD)
+OutputStreamTest_DEPENDENCIES = ../libmonit.la
+am_StrTest_OBJECTS = StrTest.$(OBJEXT)
+StrTest_OBJECTS = $(am_StrTest_OBJECTS)
+StrTest_LDADD = $(LDADD)
+StrTest_DEPENDENCIES = ../libmonit.la
+am_StringBufferTest_OBJECTS = StringBufferTest.$(OBJEXT)
+StringBufferTest_OBJECTS = $(am_StringBufferTest_OBJECTS)
+StringBufferTest_LDADD = $(LDADD)
+StringBufferTest_DEPENDENCIES = ../libmonit.la
+am_SystemTest_OBJECTS = SystemTest.$(OBJEXT)
+SystemTest_OBJECTS = $(am_SystemTest_OBJECTS)
+SystemTest_LDADD = $(LDADD)
+SystemTest_DEPENDENCIES = ../libmonit.la
+am_TimeTest_OBJECTS = TimeTest.$(OBJEXT)
+TimeTest_OBJECTS = $(am_TimeTest_OBJECTS)
+TimeTest_LDADD = $(LDADD)
+TimeTest_DEPENDENCIES = ../libmonit.la
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(CommandTest_SOURCES) $(DirTest_SOURCES) \
+	$(ExceptionTest_SOURCES) $(FileTest_SOURCES) \
+	$(InputStreamTest_SOURCES) $(ListTest_SOURCES) \
+	$(NetTest_SOURCES) $(OutputStreamTest_SOURCES) \
+	$(StrTest_SOURCES) $(StringBufferTest_SOURCES) \
+	$(SystemTest_SOURCES) $(TimeTest_SOURCES)
+DIST_SOURCES = $(CommandTest_SOURCES) $(DirTest_SOURCES) \
+	$(ExceptionTest_SOURCES) $(FileTest_SOURCES) \
+	$(InputStreamTest_SOURCES) $(ListTest_SOURCES) \
+	$(NetTest_SOURCES) $(OutputStreamTest_SOURCES) \
+	$(StrTest_SOURCES) $(StringBufferTest_SOURCES) \
+	$(SystemTest_SOURCES) $(TimeTest_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign no-dependencies
+LDADD = ../libmonit.la
+INCLUDES = -I../src/ -I../src/util -I../src/net -I../src/io -I../src/exceptions -I../src/thread 
+StrTest_SOURCES = StrTest.c
+CommandTest_SOURCES = CommandTest.c
+SystemTest_SOURCES = SystemTest.c
+ListTest_SOURCES = ListTest.c
+DirTest_SOURCES = DirTest.c
+StringBufferTest_SOURCES = StringBufferTest.c
+InputStreamTest_SOURCES = InputStreamTest.c
+OutputStreamTest_SOURCES = OutputStreamTest.c
+FileTest_SOURCES = FileTest.c
+ExceptionTest_SOURCES = ExceptionTest.c
+NetTest_SOURCES = NetTest.c
+TimeTest_SOURCES = TimeTest.c
+DISTCLEANFILES = *~ 
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+CommandTest$(EXEEXT): $(CommandTest_OBJECTS) $(CommandTest_DEPENDENCIES) 
+	@rm -f CommandTest$(EXEEXT)
+	$(LINK) $(CommandTest_OBJECTS) $(CommandTest_LDADD) $(LIBS)
+DirTest$(EXEEXT): $(DirTest_OBJECTS) $(DirTest_DEPENDENCIES) 
+	@rm -f DirTest$(EXEEXT)
+	$(LINK) $(DirTest_OBJECTS) $(DirTest_LDADD) $(LIBS)
+ExceptionTest$(EXEEXT): $(ExceptionTest_OBJECTS) $(ExceptionTest_DEPENDENCIES) 
+	@rm -f ExceptionTest$(EXEEXT)
+	$(LINK) $(ExceptionTest_OBJECTS) $(ExceptionTest_LDADD) $(LIBS)
+FileTest$(EXEEXT): $(FileTest_OBJECTS) $(FileTest_DEPENDENCIES) 
+	@rm -f FileTest$(EXEEXT)
+	$(LINK) $(FileTest_OBJECTS) $(FileTest_LDADD) $(LIBS)
+InputStreamTest$(EXEEXT): $(InputStreamTest_OBJECTS) $(InputStreamTest_DEPENDENCIES) 
+	@rm -f InputStreamTest$(EXEEXT)
+	$(LINK) $(InputStreamTest_OBJECTS) $(InputStreamTest_LDADD) $(LIBS)
+ListTest$(EXEEXT): $(ListTest_OBJECTS) $(ListTest_DEPENDENCIES) 
+	@rm -f ListTest$(EXEEXT)
+	$(LINK) $(ListTest_OBJECTS) $(ListTest_LDADD) $(LIBS)
+NetTest$(EXEEXT): $(NetTest_OBJECTS) $(NetTest_DEPENDENCIES) 
+	@rm -f NetTest$(EXEEXT)
+	$(LINK) $(NetTest_OBJECTS) $(NetTest_LDADD) $(LIBS)
+OutputStreamTest$(EXEEXT): $(OutputStreamTest_OBJECTS) $(OutputStreamTest_DEPENDENCIES) 
+	@rm -f OutputStreamTest$(EXEEXT)
+	$(LINK) $(OutputStreamTest_OBJECTS) $(OutputStreamTest_LDADD) $(LIBS)
+StrTest$(EXEEXT): $(StrTest_OBJECTS) $(StrTest_DEPENDENCIES) 
+	@rm -f StrTest$(EXEEXT)
+	$(LINK) $(StrTest_OBJECTS) $(StrTest_LDADD) $(LIBS)
+StringBufferTest$(EXEEXT): $(StringBufferTest_OBJECTS) $(StringBufferTest_DEPENDENCIES) 
+	@rm -f StringBufferTest$(EXEEXT)
+	$(LINK) $(StringBufferTest_OBJECTS) $(StringBufferTest_LDADD) $(LIBS)
+SystemTest$(EXEEXT): $(SystemTest_OBJECTS) $(SystemTest_DEPENDENCIES) 
+	@rm -f SystemTest$(EXEEXT)
+	$(LINK) $(SystemTest_OBJECTS) $(SystemTest_LDADD) $(LIBS)
+TimeTest$(EXEEXT): $(TimeTest_OBJECTS) $(TimeTest_DEPENDENCIES) 
+	@rm -f TimeTest$(EXEEXT)
+	$(LINK) $(TimeTest_OBJECTS) $(TimeTest_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+.c.o:
+	$(COMPILE) -c $<
+
+.c.obj:
+	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstPROGRAMS ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-local distclean-tags distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am
+
+
+distclean-local: 
+	-rm -f Makefile.in
+
+verify:
+	@/bin/bash ./test.sh
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/monit-5.4/libmonit/test/NetTest.c b/monit-5.4/libmonit/test/NetTest.c
new file mode 100644
index 0000000..91f7f67
--- /dev/null
+++ b/monit-5.4/libmonit/test/NetTest.c
@@ -0,0 +1,33 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "system/Time.h"
+#include "Thread.h"
+#include "system/Net.h"
+#include "File.h"
+
+/**
+ * Net.c unity tests. 
+ */
+
+
+int main(int argc, char **argv) {
+        
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start Net Tests\n\n");
+
+        
+        printf("============> Net Tests: OK\n\n");
+        
+        return 0;
+}
+
diff --git a/monit-5.4/libmonit/test/OutputStreamTest.c b/monit-5.4/libmonit/test/OutputStreamTest.c
new file mode 100644
index 0000000..61322c9
--- /dev/null
+++ b/monit-5.4/libmonit/test/OutputStreamTest.c
@@ -0,0 +1,165 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <time.h>
+
+#include "Bootstrap.h"
+#include "OutputStream.h"
+#include "File.h"
+#include "Str.h"
+
+/**
+ * OutputStream.c unit tests. 
+ */
+
+#define STDOUT  1
+#define TIMEOUT 50
+
+int main(void) {
+        OutputStream_T out = NULL;
+        
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start OutputStream Tests\n\n");
+        
+        printf("=> Test0: create/destroy the file input stream\n");
+        {
+                out = OutputStream_new(STDOUT);
+                assert(!OutputStream_isClosed(out));
+                OutputStream_free(&out);
+                assert(out == NULL);
+        }
+        printf("=> Test0: OK\n\n");
+        
+        printf("=> Test1: get/set timeout\n");
+        {
+                out = OutputStream_new(STDOUT);
+                printf("\tCurrent timeout: %ldms\n", OutputStream_getTimeout(out));
+                OutputStream_setTimeout(out, TIMEOUT);
+                assert(OutputStream_getTimeout(out) == TIMEOUT);
+                printf("\tTimeout set to:  %dms\n", TIMEOUT);
+                OutputStream_free(&out);
+        }
+        printf("=> Test1: OK\n\n");
+
+        printf("=> Test2: write buffer bytes, test flush and status\n");
+        {
+                int bytes = strlen("line1\nline2\nline3\n");
+                char data[] = "line1\nline2\nline3\n";
+                out = OutputStream_new(STDOUT);
+                assert(0 == OutputStream_buffered(out));
+                assert(bytes == OutputStream_write(out, data, (int)strlen(data)));
+                assert(bytes == OutputStream_buffered(out));
+                assert(0 == OutputStream_getBytesWritten(out));
+                OutputStream_flush(out);
+                assert(bytes == OutputStream_getBytesWritten(out));
+                // Test writing lower bytes
+                OutputStream_clear(out);
+                char b[] = {0,0,0,0};
+                assert(OutputStream_write(out, b, 4) == 4);
+                OutputStream_free(&out);
+        }
+        printf("=> Test2: OK\n\n");
+        
+        printf("=> Test3: printf format\n");
+        {
+                out = OutputStream_new(STDOUT);
+                // Test supported format specifiers
+                assert(OutputStream_print(out, "%s", "hello") == 5);
+                assert(OutputStream_print(out, "%c", 'h') == 1);
+                assert(OutputStream_print(out, "%d", 12345) == 5);
+                assert(OutputStream_print(out, "%i", -12345) == 6);
+                assert(OutputStream_print(out, "%u", 12345) == 5);
+                assert(OutputStream_print(out, "%o", 8) == 2);          //10
+                assert(OutputStream_print(out, "%x", 255) == 2);        //ff
+                assert(OutputStream_print(out, "%e", 12.34) == 12);     //1.234000e+01
+                assert(OutputStream_print(out, "%f", -12.34) == 10);    //-12.340000
+                assert(OutputStream_print(out, "%g", 12.34) == 6);      //012.34
+                OutputStream_print(out, "%p", out);
+                assert(OutputStream_print(out, "%%hello%%") == 7);
+                // Length modifier
+                assert(OutputStream_print(out, "%ld", 32767L) == 5);
+                assert(OutputStream_print(out, "%li", -32767L) == 6);
+                assert(OutputStream_print(out, "%lu", 32767L) == 5);
+                assert(OutputStream_print(out, "%lo", 32767L) == 5); //77777
+                assert(OutputStream_print(out, "%lx", 32767L) == 4); //7fff
+                // Test width and precision 
+                assert(OutputStream_print(out, "%16.16s\n%16.16s\n", "hello", "world") == 34);
+                assert(OutputStream_print(out, "%-16.16s\n%-16.16s\n", "hello", "world") == 34);
+                assert(OutputStream_print(out, "%.2f", 12.3456789) == 5); //12.35
+                assert(OutputStream_print(out, "%02d", 3) == 2); // 03
+                OutputStream_clear(out);
+                OutputStream_free(&out);
+        }
+        printf("=> Test3: OK\n\n");
+        
+        printf("=> Test4: write two concatenated lines\n");
+        {
+                int i = 0;
+                out = OutputStream_new(STDOUT);
+                while (i++ < 2) {
+                        OutputStream_print(out, "line%d", i);
+                }
+                OutputStream_print(out, "\n");
+                OutputStream_flush(out);
+                OutputStream_free(&out);
+        }
+        printf("=> Test4: OK\n\n");
+
+        printf("=> Test5: output reset - just the line[5-9] should show\n");
+        {
+                int i = 0;
+                out = OutputStream_new(STDOUT);
+                while (i++ < 9) {
+                        OutputStream_print(out, "line%d\n", i);
+                        if (i == 4) {
+                                OutputStream_clear(out);
+                        }
+                }
+                OutputStream_flush(out);
+                OutputStream_free(&out);
+        }
+        printf("=> Test5: OK\n\n");
+
+        printf("=> Test6: wrong descriptor - expecting write fail\n");
+        {
+                out = OutputStream_new(999);
+                TRY
+                        OutputStream_print(out, "Should not show");
+                        assert(OutputStream_flush(out) != -1);
+                        assert(false); // Should not come here
+                CATCH(AssertException)
+                        // Passed
+                END_TRY;
+                OutputStream_free(&out);
+        }
+        printf("=> Test6: OK\n\n");
+                
+        printf("=> Test7: printf large buffer\n");
+        {
+                // Note, test assume OutputStream buffer is 1500
+                char a[1024];
+                memset(a, 'x', 1024);
+                a[1023]= 0;
+                out = OutputStream_new(STDOUT);
+                // Test fit into buffer
+                assert(OutputStream_print(out, "data: %s\n", a) == 1030);
+                assert(OutputStream_flush(out) == 1030);
+                // Test when data is larger than OutputStream buffer
+                char b[2048];
+                memset(b, 'y', 2048);
+                b[2047] = 0;
+                assert(OutputStream_print(out, "data: %s\n", b) == 2054);
+                OutputStream_free(&out);
+        }
+        printf("=> Test7: OK\n\n");
+
+        printf("============> OutputStream Tests: OK\n\n");
+
+        return 0;
+}
+
diff --git a/monit-5.4/libmonit/test/StrTest.c b/monit-5.4/libmonit/test/StrTest.c
new file mode 100644
index 0000000..f212635
--- /dev/null
+++ b/monit-5.4/libmonit/test/StrTest.c
@@ -0,0 +1,423 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+
+
+/**
+ * Str.c unity tests
+ */
+
+
+int main(void) {
+        
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start Str Tests\n\n");
+        
+        printf("=> Test1: copy\n");
+        {
+                char s3[STRLEN];
+                printf("\tResult: %s\n", Str_copy(s3, "The abc house", 7));
+                assert(Str_isEqual(s3, "The abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_copy(NULL, NULL, 7));
+        }
+        printf("=> Test1: OK\n\n");
+        
+        printf("=> Test2: dup\n");
+        {
+                char *s4= Str_dup("abc123");
+                printf("\tResult: %s\n", s4);
+                assert(Str_isEqual(s4, "abc123"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_dup(NULL));
+                FREE(s4);
+        }
+        printf("=> Test2: OK\n\n");
+        
+        printf("=> Test3: ndup\n");
+        {
+                char *s5= Str_ndup("abc123", 3);
+                printf("\tResult: %s\n", s5);
+                assert(Str_isEqual(s5, "abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_ndup(NULL, 3));
+                FREE(s5);
+        }
+        printf("=> Test3: OK\n\n");
+        
+        printf("=> Test4: Str_cat & Str_vcat\n");
+        {
+                char *s6;
+                s6= Str_cat("%s://%s%s?%s", "https", "foo.bar", 
+                                   "/uri", "abc=123");
+                printf("\tResult: %s\n", s6);
+                assert(Str_isEqual(s6, "https://foo.bar/uri?abc=123"));
+                FREE(s6);
+                printf("\tTesting for NULL arguments\n");
+                s6= Str_cat(NULL);
+                assert(s6==NULL);
+                FREE(s6);
+        }
+        printf("=> Test4: OK\n\n");
+        
+        printf("=> Test5: chomp\n");
+        {
+                char s3[]= "abc\r\n123";
+                printf("\tResult: %s\n", Str_chomp(s3));
+                assert(Str_isEqual(s3, "abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_chomp(NULL));
+        }
+        printf("=> Test5: OK\n\n");
+        
+        printf("=> Test6: trim\n");
+        {
+                char e[] = "   ";
+                char o[] = " a ";
+                char s[] = "   abcdef";
+                char s4[] = "  \t abc \r\n\t ";
+                assert(Str_isEqual(Str_ltrim(s), "abcdef"));
+                printf("\tResult: %s\n", Str_trim(s4));
+                assert(Str_isEqual(s4, "abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_trim(NULL));
+                assert(Str_isEqual(Str_ltrim(e), ""));
+                memcpy(e, "   ", sizeof("   ") - 1);
+                assert(Str_isEqual(Str_rtrim(e), ""));
+                memcpy(e, "   ", sizeof("   ") - 1);
+                assert(Str_isEqual(Str_trim(e), ""));
+                assert(Str_isEqual(Str_ltrim(o), "a "));
+                memcpy(o, " a ", sizeof(" a ") - 1);
+                assert(Str_isEqual(Str_rtrim(o), " a"));
+                memcpy(o, " a ", sizeof(" a ") - 1);
+                assert(Str_isEqual(Str_trim(o), "a"));
+                assert(Str_isEqual(Str_trim(o), "a"));
+        }
+        printf("=> Test6: OK\n\n");
+        
+        printf("=> Test7: trim quotes\n");
+        {
+                char s5[]= "\"'abc'\"";
+                char s5a[]= "\"'abc";
+                char s5b[]= "abc'\"";
+                char s5c[]= "'\"";
+                char s5d[]= " \t abc def '\"  ";
+                printf("\tResult: %s\n", Str_unquote(s5));
+                assert(Str_isEqual(s5, "abc"));
+                printf("\tResult: %s\n", Str_unquote(s5a));
+                assert(Str_isEqual(s5, "abc"));
+                printf("\tResult: %s\n", Str_unquote(s5b));
+                assert(Str_isEqual(s5, "abc"));
+                printf("\tResult: %s\n", Str_unquote(s5b));
+                assert(Str_isEqual(s5, "abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_unquote(NULL));
+                printf("\tTesting for quotes-only argument\n");
+                assert(Str_isEqual("", Str_unquote(s5c)));
+                printf("\tTesting for quotes and white-space removal\n");
+                assert(Str_isEqual("abc def", Str_unquote(s5d)));
+        }
+        printf("=> Test7: OK\n\n");
+        
+        printf("=> Test8: toLowerCase\n");
+        {
+                char s6[]= "AbC";
+                printf("\tResult: %s\n", Str_toLower(s6));
+                assert(Str_isEqual(s6, "abc"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_toLower(NULL));
+        }
+        printf("=> Test8: OK\n\n");
+        
+        printf("=> Test9: toUpperCase\n");
+        {
+                char s7[]= "aBc";
+                printf("\tResult: %s\n", Str_toUpper(s7));
+                assert(Str_isEqual(s7, "ABC"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_toUpper(NULL));
+        }
+        printf("=> Test9: OK\n\n");
+                
+        printf("=> Test10: parseInt, parseLLong, parseDouble\n");
+        {
+                char i[STRLEN]= "   -2812 bla";
+                char ll[STRLEN]= "  2147483642 blabla";
+                char d[STRLEN]= "  2.718281828 this is e";
+                char de[STRLEN]= "1.495E+08 kilometer = An Astronomical Unit";
+                char ie[STRLEN]= " 9999999999999999999999999999999999999999";
+                printf("\tResult:\n");
+                printf("\tParsed int = %d\n", Str_parseInt(i));
+                assert(Str_parseInt(i)==-2812);
+                printf("\tParsed long long = %lld\n", Str_parseLLong(ll));
+                assert(Str_parseLLong(ll)==2147483642);
+                printf("\tParsed double = %.9f\n", Str_parseDouble(d));
+                assert(Str_parseDouble(d)==2.718281828);
+                printf("\tParsed double exp = %.3e\n", Str_parseDouble(de));
+                assert(Str_parseDouble(de)==1.495e+08);
+                TRY
+                        Str_parseInt(ie);
+                        assert(false);
+                CATCH(NumberFormatException)
+                        printf("=> Test11: OK\n\n");
+                END_TRY;
+        }
+        printf("=> Test10: OK\n\n");
+
+        printf("=> Test11: replace\n");
+        {
+                char s9[]= "abccba";
+                printf("\tResult: %s\n", Str_replaceChar(s9, 'b', 'X'));
+                assert(Str_isEqual(s9, "aXccXa"));
+                printf("\tTesting for NULL argument\n");
+                assert(!Str_replaceChar(NULL, 'b', 'X'));
+        }
+        printf("=> Test11: OK\n\n");
+        
+        printf("=> Test12: startsWith\n");
+        {
+                char *a= "mysql://localhost:3306/zild?user=root&password=swordfish";
+                printf("\tResult: starts with mysql - %s\n", 
+                       Str_startsWith(a, "mysql")?"yes":"no");
+                assert(Str_startsWith(a, "mysql"));
+                assert(!Str_startsWith(a, "sqlite"));
+                assert(Str_startsWith("sqlite", "sqlite"));
+                printf("\tTesting for NULL and NUL argument\n");
+                assert(!Str_startsWith(a, NULL));
+                assert(!Str_startsWith(a, ""));
+                assert(!Str_startsWith(NULL, "mysql"));
+                assert(!Str_startsWith("", NULL));
+                assert(!Str_startsWith(NULL, NULL));
+                assert(Str_startsWith("", ""));
+                assert(!Str_startsWith("/", "/WEB-INF"));
+        }
+        printf("=> Test12: OK\n\n");
+        
+        printf("=> Test13: endsWith\n");
+        {
+                char *a= "mysql://localhost:3306";
+                printf("\tResult: ends with 3306 - %s\n", 
+                       Str_endsWith(a, "3306")?"yes":"no");
+                assert(Str_endsWith(a, "3306"));
+                assert(!Str_endsWith(a, "sqlite"));
+                assert(Str_endsWith("sqlite", "sqlite"));
+                printf("\tTesting for NULL and NUL argument\n");
+                assert(!Str_endsWith(a, NULL));
+                assert(Str_endsWith(a, "")); // a ends with 0
+                assert(!Str_endsWith(NULL, "mysql"));
+                assert(!Str_endsWith("", NULL));
+                assert(!Str_endsWith(NULL, NULL));
+                assert(Str_endsWith("", ""));
+                assert(!Str_endsWith("abc", "defabc"));
+        }
+        printf("=> Test13: OK\n\n");
+        
+        printf("=> Test14: isEqual\n");
+        {
+                char *a= "mysql://localhost:3306";
+                printf("\tResult: is equal - %s\n", 
+                       Str_isEqual(a, "mysql://localhost:3306")?"yes":"no");
+                assert(Str_isEqual("sqlite", "sqlite"));
+                printf("\tTesting for NULL and NUL argument\n");
+                assert(!Str_isEqual(a, NULL));
+                assert(!Str_isEqual(a, ""));
+                assert(!Str_isEqual(NULL, "mysql"));
+                assert(!Str_isEqual("", NULL));
+                assert(!Str_isEqual(NULL, NULL));
+                assert(Str_isEqual("", ""));
+        }
+        printf("=> Test14: OK\n\n");
+        
+        printf("=> Test15: trail\n");
+        {
+                char s[]= "This string will be trailed someplace";
+                assert(Str_trunc(NULL, 100) == NULL);
+                assert(Str_isEqual(Str_trunc("", 0), ""));
+                assert(Str_isEqual(Str_trunc(s, (int)strlen(s)), "This string will be trailed someplace"));
+                printf("\tResult: %s\n", Str_trunc(s, 27));
+                assert(Str_isEqual(s, "This string will be trailed..."));
+                printf("\tResult: %s\n", Str_trunc(s, 0));
+                assert(Str_isEqual(s, "..."));
+        }
+        printf("=> Test15: OK\n\n");
+
+        printf("=> Test16: hash\n");
+        {
+                char *x= "a";
+                char *y= "b";
+                char *a= "abc";
+                char *b= "bca";
+                char *c= "this is a long string";
+                char *d= "this is a longer string";
+                printf("\tResult: %s -> %d\n", x, Str_hash(x));
+                printf("\tResult: %s -> %d\n", y, Str_hash(y));
+                assert(Str_hash(x) != Str_hash(y));
+                assert(Str_hash(x) == Str_hash(x));
+                assert(Str_hash(y) == Str_hash(y));
+                printf("\tResult: %s -> %d\n", a, Str_hash(a));
+                printf("\tResult: %s -> %d\n", b, Str_hash(b));
+                assert(Str_hash(a) != Str_hash(b));
+                assert(Str_hash(a) == Str_hash(a));
+                assert(Str_hash(b) == Str_hash(b));
+                printf("\tResult: %s -> %d\n", c, Str_hash(c));
+                printf("\tResult: %s -> %d\n", d, Str_hash(d));
+                assert(Str_hash(c) != Str_hash(d));
+                assert(Str_hash(c) == Str_hash(c));
+                assert(Str_hash(d) == Str_hash(d));
+        }
+        printf("=> Test16: OK\n\n");
+        
+        printf("=> Test17: regular expression match\n");
+        {
+                char *phone_pattern= "^[-0-9+( )]{7,40}$";
+                char *email_pattern= "^[^@ ]+@([-a-zA-Z0-9]+\\.)+[a-zA-Z]{2,}$";
+                char *valid_phone1= "+4797141255";
+                char *valid_phone2= "(47)-97-14-12-55";
+                char *invalid_phone1= "141255";
+                char *invalid_phone2= "(47)971412551234567890123456789012345678901234567890";
+                char *invalid_phone3= "";
+                char *invalid_phone4= "abc123";
+                char *valid_email1= "hauk@TILDESLASH.com";
+                char *valid_email2= "jan-henrik.haukeland@haukeland.co.uk";
+                char *invalid_email1= "hauktildeslash.com";
+                char *invalid_email2= "";
+                char *invalid_email3= "hauk@tildeslashcom";
+                char *invalid_email4= "hauk@æøåtildeslash.com";
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, valid_phone1);
+                assert(Str_match(phone_pattern, valid_phone1));
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, valid_phone2);
+                assert(Str_match(phone_pattern, valid_phone2));
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, invalid_phone1);
+                assert(! Str_match(phone_pattern, invalid_phone1));
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, invalid_phone2);
+                assert(! Str_match(phone_pattern, invalid_phone2));
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, invalid_phone3);
+                assert(! Str_match(phone_pattern, invalid_phone3));
+                printf("\tResult: match(%s, %s)\n", 
+                       phone_pattern, invalid_phone4);
+                assert(! Str_match(phone_pattern, invalid_phone4));
+                
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, valid_email1);
+                assert(Str_match(email_pattern, valid_email1));
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, valid_email2);
+                assert(Str_match(email_pattern, valid_email2));
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, invalid_email1);
+                assert(! Str_match(email_pattern, invalid_email1));
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, invalid_email2);
+                assert(! Str_match(email_pattern, invalid_email2));
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, invalid_email3);
+                assert(! Str_match(email_pattern, invalid_email3));
+                printf("\tResult: match(%s, %s)\n", 
+                       email_pattern, invalid_email4);
+                assert(! Str_match(email_pattern, invalid_email4));
+        }
+        printf("=> Test17: OK\n\n");
+        
+        printf("=> Test18: lim\n");
+        {
+                char *zero = "";
+                char *one = "1";
+                char *ten = "1234567890";
+                assert(Str_lim(zero, 0));
+                assert(!Str_lim(zero, 1));
+                assert(Str_lim(one, 0));
+                assert(Str_lim(one, 1));
+                assert(!Str_lim(one, 2));
+                assert(Str_lim(ten, 0));
+                assert(Str_lim(ten, 5));
+                assert(Str_lim(ten, 9));
+                assert(Str_lim(ten, 10));
+                assert(! Str_lim(ten, 11));
+                assert(! Str_lim(ten, 100));
+        }
+        printf("=> Test18: OK\n\n");
+        
+        printf("=> Test19: substring\n");
+        {
+                assert(Str_sub("foo bar baz", "bar"));
+                assert(!  Str_sub("foo bar baz", "barx"));
+                assert(Str_isEqual(Str_sub("foo bar baz", "baz"), "baz"));
+                assert(Str_sub("foo bar baz", "foo bar baz"));
+                assert(Str_sub("a", "a"));
+                assert(! Str_sub("a", "b"));
+                assert(! Str_sub("", ""));
+                assert(! Str_sub("foo", ""));
+                assert(! Str_sub("abc", "abcdef"));
+                assert(! Str_sub("foo", "foo bar"));
+                assert(Str_isEqual(Str_sub("foo foo bar", "foo bar"), "foo bar"));
+                assert(Str_sub("foo foo bar foo bar baz fuu", "foo bar baz"));
+                assert(Str_isEqual(Str_sub("abcd abcc", "abcc"), "abcc"));
+        }
+        printf("=> Test19: OK\n\n");
+
+        printf("=> Test20: Str_join\n");
+        {
+                char *p = NULL;
+                char dest[10+1] = "xxxxxxxxx";
+                char a[] = "abc";
+                char *b  = "def";
+                char *c  = "xxx123";
+                assert(Str_isEqual(Str_join(dest, 10, a, b, "ghi"), "abcdefghi"));
+                assert(Str_isEqual(Str_join(dest, 10, p), ""));
+                assert(Str_isEqual(Str_join(dest, 10), ""));
+                assert(Str_isEqual(Str_join(dest, 10, "012", "3456789", "0123456789"), "0123456789"));
+                assert(Str_isEqual(Str_join(dest, 4, "a", "b", "cd", "ghi", "jklmnopq"), "abcd"));
+                assert(Str_isEqual(Str_join(dest, 10, a, c + 3), "abc123"));
+                Str_join(dest, 0);
+                assert(dest[0]==0);
+        }
+        printf("=> Test20: OK\n\n");
+      
+        printf("=> Test21: Str_has\n");
+        {
+                char *foo = "'bar' (baz)"; 
+                assert(Str_has("(')", foo));
+                assert(! Str_has(",;", foo));
+        }
+        printf("=> Test21: OK\n\n");
+                
+        printf("=> Test22: Str_curtail\n");
+        {
+                char s[]= "<text>Hello World</text>"; 
+                assert(Str_isByteEqual(Str_curtail(s, "</text>"), "<text>Hello World"));
+                assert(Str_isByteEqual(Str_curtail(s, ">"), "<text"));
+                assert(Str_isByteEqual(Str_curtail(s, "@"), "<text"));
+        }
+        printf("=> Test22: OK\n\n");
+        
+        printf("=> Test23: Str_ton\n");
+        {
+                char str[43];
+                long l1 = 42, l2 = 0, l3 = -42, l4 = LONG_MAX, l5 = LONG_MIN;
+                assert(Str_isByteEqual("42", Str_ton(42, (char[43]){0})));
+                assert(Str_isByteEqual("42", Str_ton(l1, str)));
+                assert(Str_isByteEqual("0", Str_ton(l2, str)));
+                assert(Str_isByteEqual("-42", Str_ton(l3, str)));
+                assert(l4 == Str_parseLLong(Str_ton(l4, str)));
+                assert(l5 == Str_parseLLong(Str_ton(l5, str)));
+        }
+        printf("=> Test23: OK\n\n");
+        
+        
+        printf("============> Str Tests: OK\n\n");
+        return 0;
+}
+
+
diff --git a/monit-5.4/libmonit/test/StringBufferTest.c b/monit-5.4/libmonit/test/StringBufferTest.c
new file mode 100644
index 0000000..34628f4
--- /dev/null
+++ b/monit-5.4/libmonit/test/StringBufferTest.c
@@ -0,0 +1,290 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "StringBuffer.h"
+
+/**
+ * StringBuffer.c unity tests. 
+ */
+
+
+static void append(StringBuffer_T B, const char *s, ...) {
+ 	va_list ap;
+	va_start(ap, s);
+        StringBuffer_vappend(B, s, ap);
+	va_end(ap);
+}
+
+
+int main(void) {
+        StringBuffer_T sb;
+
+        Bootstrap(); // Need to initialize library
+
+        printf("============> Start StringBuffer Tests\n\n");
+        
+        printf("=> Test1: create/destroy\n");
+        {
+                sb= StringBuffer_new("");
+                assert(sb);
+                assert(StringBuffer_length(sb)==0);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                sb= StringBuffer_create(1024);
+                assert(sb);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test1: OK\n\n");
+        
+        printf("=> Test2: Append NULL value\n");
+        {
+                sb= StringBuffer_new("");
+                assert(sb);
+                StringBuffer_append(sb, NULL);
+                assert(StringBuffer_length(sb)==0);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test2: OK\n\n");
+        
+        printf("=> Test3: Create with string\n");
+        {
+                sb= StringBuffer_new("abc");
+                assert(sb);
+                assert(StringBuffer_length(sb)==3);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test3: OK\n\n");
+        
+        printf("=> Test4: Append string value\n");
+        {
+                sb= StringBuffer_new("abc");
+                assert(sb);
+                printf("\tTesting StringBuffer_append:..");
+                StringBuffer_append(sb, "def");
+                assert(StringBuffer_length(sb)==6);
+                printf("ok\n");
+                printf("\tTesting StringBuffer_vappend:..");
+                append(sb, "%c%s", 'g', "hi");
+                assert(StringBuffer_length(sb)==9);
+                assert(Str_isEqual(StringBuffer_toString(sb), "abcdefghi"));
+                printf("ok\n");
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test4: OK\n\n");
+        
+        printf("=> Test5: getCharAt\n");
+        {
+                sb= StringBuffer_new("abcdefgh");
+                assert(sb);
+                assert(StringBuffer_charAt(sb, 7)=='h');
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test5: OK\n\n");
+        
+        printf("=> Test6: setCharAt\n");
+        {
+                sb= StringBuffer_new("abcdefgh");
+                assert(sb);
+                StringBuffer_setCharAt(sb,2,'v');
+                assert(StringBuffer_charAt(sb, 2)=='v');
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test6: OK\n\n");
+        
+        printf("=> Test7: trim\n");
+        {
+                sb= StringBuffer_new("\t 'foo bar' \n ");
+                assert(Str_isEqual(StringBuffer_toString(StringBuffer_trim(sb)), "'foo bar'"));
+                StringBuffer_clear(sb);
+                StringBuffer_append(sb, "'foo bar'");
+                StringBuffer_trim(sb);
+                assert(Str_isEqual(StringBuffer_toString(sb), "'foo bar'"));
+                StringBuffer_clear(sb);
+                StringBuffer_append(sb, "\t \r \n  ");
+                assert(Str_isEqual(StringBuffer_toString(StringBuffer_trim(sb)), ""));
+                StringBuffer_free(&sb);
+                sb = StringBuffer_create(10);
+                StringBuffer_trim(sb);
+                assert(StringBuffer_toString(sb)[0] == 0);
+                StringBuffer_free(&sb);
+        }
+        printf("=> Test7: OK\n\n");
+        
+        printf("=> Test8: deleteFrom\n");
+        {
+                sb= StringBuffer_new("abcdefgh");
+                assert(sb);
+                StringBuffer_delete(sb,3);
+                assert(StringBuffer_length(sb)==3);
+                assert(StringBuffer_charAt(sb, StringBuffer_length(sb)-1)=='c');
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test8: OK\n\n");
+        
+        printf("=> Test9: indexOf and lastIndexOf\n");
+        {
+                sb= StringBuffer_new("jan-henrik haukeland");
+                assert(sb);
+                assert(StringBuffer_indexOf(sb, "henrik")==4);
+                assert(StringBuffer_indexOf(sb, "an")==1);
+                assert(StringBuffer_indexOf(sb, "-")==3);
+                assert(StringBuffer_lastIndexOf(sb, "an")==17);
+                assert(StringBuffer_indexOf(sb, "")==-1);
+                assert(StringBuffer_indexOf(sb, 0)==-1);
+                assert(StringBuffer_indexOf(sb, "d")==19);
+                assert(StringBuffer_indexOf(sb, "j")==0);
+                assert(StringBuffer_lastIndexOf(sb, "d")==19);
+                assert(StringBuffer_lastIndexOf(sb, "j")==0);
+                assert(StringBuffer_lastIndexOf(sb, "x")==-1);
+                assert(StringBuffer_indexOf(sb, "jane")==-1);
+                assert(StringBuffer_indexOf(sb, "jan-henrik haukeland")==0);
+                assert(StringBuffer_indexOf(sb, "haukeland")==11);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test9: OK\n\n");
+        
+        printf("=> Test10: length and clear\n");
+        {
+                sb= StringBuffer_new("jan-henrik haukeland");
+                assert(sb);
+                assert(StringBuffer_length(sb)==20);
+                StringBuffer_clear(sb);
+                assert(StringBuffer_length(sb)==0);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test10: OK\n\n");
+        
+        printf("=> Test11: out-of-index exception\n");
+        {
+                sb= StringBuffer_new("abc");
+                assert(sb);
+                TRY {
+                        StringBuffer_charAt(sb, 42);
+                        printf("Test 11 failed\n");
+                        exit(1); // Should not come here
+                } CATCH(AssertException)
+                        printf("=> Test11: OK\n\n");
+                END_TRY;
+                StringBuffer_free(&sb);
+        }
+        
+        printf("=> Test12: toString value\n");
+        {
+                sb= StringBuffer_new("abc");
+                assert(sb);
+                StringBuffer_append(sb, "def");
+                assert(Str_isEqual(StringBuffer_toString(sb), "abcdef"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test12: OK\n\n");
+        
+        printf("=> Test13: internal resize\n");
+        {
+                int i;
+                sb= StringBuffer_new("");
+                assert(sb);
+                for (i= 0; i<1024; i++)
+                        StringBuffer_append(sb, "a");
+                assert(StringBuffer_length(sb)==1024);
+                assert(StringBuffer_toString(sb)[1023]=='a');
+                assert(StringBuffer_toString(sb)[1024]==0);
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test13: OK\n\n");
+                
+        printf("=> Test14: substring\n");
+        {
+                sb= StringBuffer_new("jan-henrik haukeland");
+                assert(sb);
+                assert(Str_isEqual(StringBuffer_substring(sb, StringBuffer_indexOf(sb, "-")),
+                                                 "-henrik haukeland"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test14: OK\n\n");
+        
+        printf("=> Test15: replace\n");
+        {
+                printf("\tNothing to replace\n");
+                sb= StringBuffer_new("abc?def?");
+                assert(sb);
+                StringBuffer_replace(sb, "x", "$x");
+                assert(Str_isEqual(StringBuffer_toString(sb), "abc?def?"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace and expand\n");
+                sb= StringBuffer_new("abc?def?");
+                assert(sb);
+                StringBuffer_replace(sb, "?", "$x");
+                assert(Str_isEqual(StringBuffer_toString(sb), "abc$xdef$x"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace and shrink\n");
+                sb= StringBuffer_new("abc$xdef$x");
+                assert(sb);
+                StringBuffer_replace(sb, "$x", "?");
+                assert(Str_isEqual(StringBuffer_toString(sb), "abc?def?"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace with empty string\n");
+                sb= StringBuffer_new("abc$xdef$x");
+                assert(sb);
+                StringBuffer_replace(sb, "$x", "");
+                assert(Str_isEqual(StringBuffer_toString(sb), "abcdef"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace with same length\n");
+                sb= StringBuffer_new("foo bar baz foo bar baz");
+                assert(sb);
+                StringBuffer_replace(sb, "baz", "bar");
+                assert(Str_isEqual(StringBuffer_toString(sb), "foo bar bar foo bar bar"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tRemove words and test traceback\n");
+                sb= StringBuffer_new("foo bar baz foo foo bar baz");
+                assert(sb);
+                StringBuffer_replace(sb, "baz", "bar");
+                assert(Str_isEqual(StringBuffer_toString(sb), "foo bar bar foo foo bar bar"));
+                StringBuffer_replace(sb, "foo bar ", "");
+                assert(Str_isEqual(StringBuffer_toString(sb), "bar foo bar"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace all elements\n");
+                sb= StringBuffer_new("aaaaaaaaaaaaaaaaaaaaaaaa");
+                assert(sb);
+                StringBuffer_replace(sb, "a", "b");
+                assert(Str_isEqual(StringBuffer_toString(sb), "bbbbbbbbbbbbbbbbbbbbbbbb"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+                printf("\tReplace and expand with resize of StringBuffer\n");
+                sb= StringBuffer_new("insert into(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) values (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,01,2,3);");
+                assert(sb);
+                StringBuffer_replace(sb, "?", "$x");
+                assert(Str_isEqual(StringBuffer_toString(sb), "insert into($x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x, $x) values (1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,01,2,3);"));
+                StringBuffer_free(&sb);
+                assert(sb==NULL);
+        }
+        printf("=> Test15: OK\n\n");
+        
+        printf("============> StringBuffer Tests: OK\n\n");
+        
+        return 0;
+}
diff --git a/monit-5.4/libmonit/test/SystemTest.c b/monit-5.4/libmonit/test/SystemTest.c
new file mode 100644
index 0000000..58afb82
--- /dev/null
+++ b/monit-5.4/libmonit/test/SystemTest.c
@@ -0,0 +1,43 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "system/System.h"
+#include "Thread.h"
+
+/**
+ * System.c unity tests.
+ */
+
+
+
+int main(void) {
+
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start System Tests\n\n");
+
+        printf("=> Test0: check error description\n");
+        {
+                const char *error;
+                assert((error = System_getError(EINVAL)) != NULL);
+                printf("\tEINVAL description: %s\n", error);
+                errno = EINVAL;
+                assert(Str_isEqual(System_getLastError(), error));
+
+        }
+        printf("=> Test0: OK\n\n");
+
+        printf("============> System Tests: OK\n\n");
+
+        return 0;
+}
diff --git a/monit-5.4/libmonit/test/TimeTest.c b/monit-5.4/libmonit/test/TimeTest.c
new file mode 100644
index 0000000..07eaaf0
--- /dev/null
+++ b/monit-5.4/libmonit/test/TimeTest.c
@@ -0,0 +1,213 @@
+#include "Config.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <time.h>
+#include <sys/time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "Bootstrap.h"
+#include "Str.h"
+#include "system/Time.h"
+
+/**
+ * Time.c unity tests.
+ */
+
+
+int main(void) {
+
+        Bootstrap(); // Need to initialize library
+        
+        printf("============> Start Time Tests\n\n");
+        
+        printf("=> Test1: Parse String\n");
+        {
+                long r;
+                char d1[STRLEN];
+                char s[] = " Thu, 17 Oct 2002 19:10:01; ";
+                char y[] = "Year: 2011 Day: 14 Month: June";
+                printf("\tParsing a null date string: %ld\n", Time_parse(NULL));
+                assert(Time_parse(NULL) == -1);
+                r = Time_parse(s);
+                printf("\tParsed datestring has value: %ld\n", r);
+                assert(r == 1034874601);
+                printf("\tWhich transform to the local date: %s\n", Time_fmt(d1, STRLEN, "%a, %d %b %Y %H:%M:%S %z", r));
+                r = Time_parse(y);
+                printf("\tSecond parsed datestring has value: %ld\n", r);
+                assert(r == 1308002400);
+                printf("\tWhich transform to the local date: %s\n", Time_fmt(d1, STRLEN, "%a, %d %b %Y %H:%M:%S %z", r));
+        }
+        printf("=> Test1: OK\n\n");
+        
+        printf("=> Test2: check string ouput\n");
+        {
+                char result[30];
+                Time_string(1267441200, result); /* 01 Mar 2010 12:00:00 */
+                printf("\tResult: local unix time 1267441200 to localtime:\n\t %s\n", result);
+                assert(Str_isEqual(result, "Mon, 01 Mar 2010 12:00:00"));
+                Time_gmtstring(1267441200, result); /* 01 Mar 2010 12:00:00 GMT */
+                printf("\tResult: local unix time 1267441200 to UTC:\n\t %s\n", result);
+                assert(Str_isEqual("Mon, 01 Mar 2010 11:00:00 GMT", result));
+        }
+        printf("=> Test2: OK\n\n");
+        
+        printf("=> Test3: check current time\n");
+        {
+                struct timeval tv;
+                assert(!gettimeofday(&tv, NULL));
+                assert(Time_now() == tv.tv_sec);
+        }
+        printf("=> Test3: OK\n\n");
+        
+        printf("=> Test4: convert CEST time_t to GMT\n");
+        {
+                assert(Time_gmt(1267441200) == 1267437600);
+        }
+        printf("=> Test4: OK\n\n");
+        
+        printf("=> Test5: sleep 1s\n");
+        {
+                time_t now;
+                now = Time_now();
+                Time_usleep(1000000);
+                assert((now + 1) == Time_now());
+        }
+        printf("=> Test5: OK\n\n");
+                
+        printf("=> Test6: uptime\n");
+        {
+                time_t days = 668040;
+                time_t hours = 63240;
+                time_t min = 2040;
+                char result[24];
+                printf("\tResult: uptime days: %s\n", Time_uptime(days, result));
+                assert(Str_isEqual(result, "7d, 17h, 34m"));
+                printf("\tResult: uptime hours: %s\n", Time_uptime(hours, result));
+                assert(Str_isEqual(result, "17h, 34m"));
+                printf("\tResult: uptime min: %s\n", Time_uptime(min, result));
+                assert(Str_isEqual(result, "34m"));
+                printf("\tResult: uptime 0: %s\n", Time_uptime(0, result));
+                assert(Str_isEqual(result, ""));
+                assert(Time_uptime(0, NULL) == NULL);
+        }
+        printf("=> Test6: OK\n\n");
+        
+        printf("=> Test7: fmt\n");
+        {
+                
+                char result[STRLEN];
+                Time_fmt(result, STRLEN, "%D %T", 1267441200);
+                printf("\tResult: 1267441200 -> %s\n", result);
+                assert(Str_isEqual(result, "03/01/10 12:00:00"));
+                Time_fmt(result, STRLEN, "%D", 1267441200);
+                printf("\tResult: 1267441200 -> %s\n", result);
+                assert(Str_startsWith(result, "03/01/10"));
+        }
+        printf("=> Test7: OK\n\n");
+        
+        printf("=> Test8: Time attributes\n");
+        {
+                char b[STRLEN];
+                time_t time = 730251059; // Sun, 21. Feb 1993 00:30:59
+                printf("\tResult: %s (winter time)\n", Time_string(time, b));
+                assert(Time_seconds(time) == 59);
+                assert(Time_minutes(time) == 30);
+                assert(Time_hour(time) == 0);
+                assert(Time_weekday(time) == 0);
+                assert(Time_day(time) == 21);
+                assert(Time_month(time) == 2);
+                assert(Time_year(time) == 1993);
+                time = 1253045894; // Tue, 15 Sep 2009 22:18:14 +0200
+                printf("\tResult: %s (DTS/summer time)\n", Time_string(time, b));
+                assert(Str_startsWith(b, "Tue, 15 Sep 2009 22:18:14"));
+        }
+        printf("=> Test8: OK\n\n");
+
+        printf("=> Test9: Time_add\n");
+        {
+                char b[STRLEN];
+                time_t t = 730251059; // Sun, 21. Feb 1993 00:30:59
+                time_t time = Time_add(t, -1, -1, 8); // Wed, 29 Jan 1992 00:30:59
+                printf("\tResult: %s\n", Time_string(time, b));
+                assert(Time_seconds(time) == 59);
+                assert(Time_minutes(time) == 30);
+                assert(Time_hour(time) == 0);
+                assert(Time_day(time) == 29);
+                assert(Time_month(time) == 1);
+                assert(Time_year(time) == 1992);
+        }
+        printf("=> Test9: OK\n\n");
+        
+        printf("=> Test10: Time_build\n");
+        {
+                time_t time = Time_build(2001, 1, 29, 12, 0, 0);
+                assert(Time_seconds(time) == 0);
+                assert(Time_minutes(time) == 0);
+                assert(Time_hour(time) == 12);
+                assert(Time_day(time) == 29);
+                assert(Time_month(time) == 1);
+                assert(Time_year(time) == 2001);
+                // Verify assert on out of range
+                TRY
+                {
+                        Time_build(1969, 1, 29, 12, 0, 0);
+                        printf("Test failed\n");
+                        exit(1);
+                }
+                CATCH (AssertException)
+                END_TRY;
+                TRY
+                {
+                        Time_build(1970, 0, 29, 12, 0, 0);
+                        printf("Test failed\n");
+                        exit(1);
+                }
+                CATCH (AssertException)
+                END_TRY;
+        }
+        printf("=> Test10: OK\n\n");
+        
+        printf("=> Test11: Time_daysBetween\n");
+        {
+                time_t from = Time_build(2001, 1, 29, 0, 0, 0);
+                time_t to = from;
+                assert(Time_daysBetween(from, to) == 0);
+                assert(Time_daysBetween(from, Time_build(2001, 1, 30, 0, 0, 0)) == 1);
+                assert(Time_daysBetween(from, Time_build(2001, 1, 28, 0, 0, 0)) == 1);
+                assert(Time_daysBetween(Time_build(2001, 1, 1, 0, 0, 0), Time_build(2002, 1, 1, 0, 0, 0)) == 365);
+        }
+        printf("=> Test11: OK\n\n");
+        
+        printf("=> Test12: Time_incron\n");
+        {
+                const char *exactmatch = "27 11 5 7 2";
+                const char *matchall = "* * * * *";
+                const char *invalid1 = "a bc d";
+                const char *invalid2 = "* * * *  "; // Too few fields
+                const char *invalid3 = "* * * * * * "; // Too many fields
+                const char *range1 = "* 10-11 1-5 * 1-5";
+                const char *rangeoutside = "1-10 9-10 1-5 * 1-5";
+                const char *sequence = "* 10,11 1-3,5,6 * *";
+                const char *sequenceoutside = "* 10,11,12 4,5,6 * 0,6";
+                time_t time = Time_build(2011, 7, 5, 11, 27, 5);
+                assert(Time_incron(exactmatch, time));
+                assert(Time_incron(matchall, time));
+                assert(! Time_incron(invalid1, time));
+                assert(! Time_incron(invalid2, time));
+                assert(! Time_incron(invalid3, time));
+                assert(Time_incron(range1, time));
+                assert(! Time_incron(rangeoutside, time));
+                assert(Time_incron(sequence, time));
+                assert(! Time_incron(sequenceoutside, time));
+        }
+        printf("=> Test12: OK\n\n");
+
+        printf("============> Time Tests: OK\n\n");
+
+        return 0;
+}
+
+
diff --git a/monit-5.4/libmonit/test/data/stream.data b/monit-5.4/libmonit/test/data/stream.data
new file mode 100644
index 0000000..83db48f
--- /dev/null
+++ b/monit-5.4/libmonit/test/data/stream.data
@@ -0,0 +1,3 @@
+line1
+line2
+line3
diff --git a/monit-5.4/libmonit/test/test.sh b/monit-5.4/libmonit/test/test.sh
new file mode 100755
index 0000000..c1eef79
--- /dev/null
+++ b/monit-5.4/libmonit/test/test.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+export PATH=$PATH:.
+
+StrTest && \
+TimeTest && \
+SystemTest && \
+ListTest && \
+StringBufferTest && \
+DirTest && \
+InputStreamTest && \
+OutputStreamTest && \
+FileTest && \
+ExceptionTest && \
+NetTest && \
+CommandTest
diff --git a/monit-5.4/monit.1 b/monit-5.4/monit.1
new file mode 100644
index 0000000..2077d01
--- /dev/null
+++ b/monit-5.4/monit.1
@@ -0,0 +1,4103 @@
+.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.el \{\
+.    de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "MONIT 1"
+.TH MONIT 1 "www.mmonit.com" "May 06. 2012" "User Commands"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+Monit \- utility for monitoring services on a Unix system
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBmonit\fR [options] {arguments}
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBmonit\fR is a utility for managing and monitoring processes,
+programs, files, directories and filesystems on a Unix system.
+Monit conducts automatic maintenance and repair and can execute
+meaningful causal actions in error situations. E.g. Monit can
+start a process if it does not run, restart a process if it does
+not respond and stop a process if it uses too much resources. You
+can use Monit to monitor files, directories and filesystems for
+changes, such as timestamps changes, checksum changes or size
+changes.
+.PP
+Monit is controlled via an easy to configure control file based
+on a free-format, token-oriented syntax. Monit logs to syslog or
+to its own log file and notifies you about error conditions via
+customizable alert messages. Monit can perform various \s-1TCP/IP\s0
+network checks, protocol checks and can utilize \s-1SSL\s0 for such
+checks. Monit provides a http(s) interface and you may use a
+browser to access the Monit program.
+.SH "GENERAL OPERATION"
+.IX Header "GENERAL OPERATION"
+The behavior of Monit is controlled by command-line options
+\&\fIand\fR a run control file, monitrc,
+the syntax of which we describe in a later section. Command-line
+options override \fI.monitrc\fR declarations.
+.PP
+The default location for \fImonitrc\fR is \fI~/.monitrc\fR. If this
+file does not exist, Monit will try \fI/etc/monitrc\fR and a few
+other places. See \s-1FILES\s0 for details. You can also
+specify the control file directly by using the \fI\-c\fR command-line
+switch to monit. For instance,
+.PP
+.Vb 1
+\& $ monit \-c /var/monit/monitrc
+.Ve
+.PP
+Before Monit is started the first time, you can test the control
+file for syntax errors:
+.PP
+.Vb 2
+\& $ monit \-t 
+\& $ Control file syntax OK
+.Ve
+.PP
+If there was an error, Monit will print an error message to the
+console, including the line number in the control file from where
+the error was found.
+.PP
+Once you have a working Monit control file you can start Monit
+from the console, like so:
+.PP
+.Vb 1
+\& $ monit
+.Ve
+.PP
+You can change some configuration directives via command-line
+switches, but for simplicity it is recommended that you put these
+in the control file.
+.PP
+If all goes well, Monit will now detach from the terminal and run
+as a background process, i.e. as a daemon process. As a daemon,
+Monit runs in cycles; It monitor services, then goes to sleep for
+a configured period, then wakes up and start monitoring again in
+an endless loop.
+.SS "Options"
+.IX Subsection "Options"
+The following options are recognized by Monit. However, it is
+recommended that you set options (when applicable) directly in
+the \fI.monitrc\fR control file.
+.PP
+\&\fB\-c\fR \fIfile\fR
+   Use this control file
+.PP
+\&\fB\-d\fR \fIn\fR
+   Run Monit as a daemon once per \fIn\fR seconds. Or use \fI\*(L"set
+   daemon\*(R"\fR in monitrc.
+.PP
+\&\fB\-g\fR \fIname\fR
+   Set group name for start, stop, restart, monitor and
+   unmonitor action.
+.PP
+\&\fB\-l\fR \fIlogfile\fR
+   Print log information to this file. Or use \fI\*(L"set logfile\*(R"\fR
+    in monitrc.
+.PP
+\&\fB\-p\fR \fIpidfile\fR
+   Use this lock file in daemon mode. Or use \fI\*(L"set pidfile\*(R"\fR
+    in monitrc.
+.PP
+\&\fB\-s\fR \fIstatefile\fR
+   Write state information to this file. Or use \fI\*(L"set
+   statefile\*(R"\fR in monitrc.
+.PP
+\&\fB\-I\fR
+   Do not run in background (needed for run from init)
+.PP
+\&\fB\-t\fR
+   Run syntax check for the control file
+.PP
+\&\fB\-v\fR
+   Verbose mode, work noisy (diagnostic output)
+.PP
+\&\fB\-vv\fR
+   Very verbose mode, same as \-v plus log stack-trace on error
+.PP
+\&\fB\-H\fR \fI[filename]\fR
+   Print \s-1MD5\s0 and \s-1SHA1\s0 hashes of the file or of stdin if the 
+   filename is omitted; Monit will exit afterwards
+.PP
+\&\fB\-V\fR
+   Print version number and patch level
+.PP
+\&\fB\-h\fR
+   Print a help text
+.SS "Arguments"
+.IX Subsection "Arguments"
+Once you have Monit running as a daemon process, you can call
+Monit with one of the following arguments. Monit will then
+connect to the Monit daemon (on \s-1TCP\s0 port 127.0.0.1:2812 by
+default) and ask the Monit daemon to perform the requested
+action. In other words; calling monit without arguments starts
+the Monit daemon, and calling monit \fIwith\fR arguments enables you
+to communicate with the Monit daemon process.
+.IP "start all" 4
+.IX Item "start all"
+Start all services listed in the control file and enable
+monitoring for them. If the group option is set (\fI\-g\fR), only
+start and enable monitoring of services in the named group (\*(L"all\*(R"
+is not required in this case).
+.IP "start name" 4
+.IX Item "start name"
+Start the named service and enable monitoring for it. The name is
+a service entry name from the monitrc file.
+.IP "stop all" 4
+.IX Item "stop all"
+Stop all services listed in the control file and disable their
+monitoring. If the group option is set, only stop and disable
+monitoring of the services in the named group (all" is not
+required in this case).
+.IP "stop name" 4
+.IX Item "stop name"
+Stop the named service and disable its monitoring. The name is a
+service entry name from the monitrc file.
+.IP "restart all" 4
+.IX Item "restart all"
+Stop and start \fIall\fR services. If the group option is set, only
+restart the services in the named group (\*(L"all\*(R" is not required in
+this case).
+.IP "restart name" 4
+.IX Item "restart name"
+Restart the named service. The name is a service entry name from
+the monitrc file.
+.IP "monitor all" 4
+.IX Item "monitor all"
+Enable monitoring of all services listed in the control file. If
+the group option is set, only start monitoring of services in the
+named group (\*(L"all\*(R" is not required in this case).
+.IP "monitor name" 4
+.IX Item "monitor name"
+Enable monitoring of the named service. The name is a service
+entry name from the monitrc file. Monit will also enable
+monitoring of all services this service depends on.
+.IP "unmonitor all" 4
+.IX Item "unmonitor all"
+Disable monitoring of all services listed in the control file. If
+the group option is set, only disable monitoring of services in
+the named group (\*(L"all\*(R" is not required in this case).
+.IP "unmonitor name" 4
+.IX Item "unmonitor name"
+Disable monitoring of the named service. The name is a service
+entry name from the monitrc file. Monit will also disable
+monitoring of all services that depends on this service.
+.IP "status" 4
+.IX Item "status"
+Print status information of each service.
+.IP "summary" 4
+.IX Item "summary"
+Print a short status summary.
+.IP "reload" 4
+.IX Item "reload"
+Reinitialize a running Monit daemon, the daemon will reread its
+configuration, close and reopen log files.
+.IP "quit" 4
+.IX Item "quit"
+Kill the Monit daemon process
+.IP "validate" 4
+.IX Item "validate"
+Check all services listed in the control file. This action is
+also the default behavior when Monit runs in daemon mode.
+.IP "procmatch regex" 4
+.IX Item "procmatch regex"
+Allows for easy testing of pattern for process match check. The
+command takes regular expression as an argument and displays all
+running processes matching the pattern.
+.SH "WHAT TO MONITOR?"
+.IX Header "WHAT TO MONITOR?"
+You can use Monit to monitor daemon \fBprocesses\fR or similar
+programs running on localhost. Monit is particular useful for
+monitoring daemon processes, such as those started at system boot
+time from /etc/init.d/. For instance sendmail, sshd, apache and
+mysql. In contrast to many other monitoring systems, Monit can act if
+an error situation should occur, e.g.; if sendmail is not
+running, monit can start sendmail again automatically or if
+apache is using too many resources (e.g. if a DoS attack is in
+progress) Monit can stop or restart apache and send you an alert
+message. Monit can also monitor process characteristics, such as
+how much memory or cpu cycles a process is using.
+.PP
+You can also use Monit to monitor \fBfiles\fR, \fBdirectories\fR and
+\&\fBfilesystems\fR on localhost. Monit can monitor these items for
+changes, such as timestamps changes, checksum changes or size
+changes. This is also useful for security reasons \- you can
+monitor the md5 or sha1 checksum of files that should not change
+and get an alert or perform an action if they should change.
+.PP
+Monit can monitor \fBnetwork connections\fR to various servers,
+either on localhost or on remote hosts. \s-1TCP\s0, \s-1UDP\s0 and Unix Domain
+Sockets are supported. Network test can be performed on a
+protocol level; Monit has built-in tests for the main Internet
+protocols, such as \s-1HTTP\s0, \s-1SMTP\s0 etc. Even if a protocol is not
+supported you can still test the server because you can configure
+Monit to send any data and test the response from the server.
+.PP
+Monit can be used to test \fBprograms\fR or scripts at certain
+times, much like cron, but in addition, you can test the exit
+value of a program and perform an action or send an alert if the
+exit value indicate an error. This means that you can use Monit
+to perform any type of check you can write a script for.
+.PP
+Finally, Monit can be used to monitor general \fBsystem\fR resources
+on localhost such as overall \s-1CPU\s0 usage, Memory and Load Average.
+.SH "THE MONIT CONTROL FILE"
+.IX Header "THE MONIT CONTROL FILE"
+Monit is configured and controlled via a control file called
+\&\fImonitrc\fR. The default location for this file is ~/.monitrc. If
+this file does not exist, Monit will try /etc/monitrc, then
+\&\f(CW@sysconfdir\fR@/monitrc and finally ./monitrc. The value of
+\&\f(CW@sysconfdir\fR@ is given at configure time as ./configure
+\&\-\-sysconfdir. For instance, using  \fI./configure \-\-sysconfdir
+/var/monit/etc\fR will make Monit search for \fImonitrc\fR in
+\&\fI/var/monit/etc\fR
+.PP
+Monit uses its own Domain Specific Language (\s-1DSL\s0); The control
+file consists of a series of service entries and global option
+statements in a free-format, token-oriented syntax.
+.PP
+Comments begin with a \fB#\fR and extend through the end of the
+line. There are three kinds of tokens in the control file:
+\&\fIkeywords\fR, \fInumbers\fR and \fIstrings\fR. On a semantic level, the
+control file consists of only three type of entries:
+.IP "1. Global set-statements" 4
+.IX Item "1. Global set-statements"
+A global set-statement starts with the keyword \fIset\fR and the
+item to configure.
+.IP "2. Global include-statement" 4
+.IX Item "2. Global include-statement"
+The include statement consists of the keyword \fIinclude\fR and
+a glob string.
+.IP "3. One or more service entry statements." 4
+.IX Item "3. One or more service entry statements."
+A service entry starts with the keyword \fIcheck\fR followed by the
+service type.
+.PP
+The meaning of the various statements will be explained in the
+following sections.
+.SH "LOGGING"
+.IX Header "LOGGING"
+Monit will log status and error messages to a log file. Use the
+\&\fIset logfile\fR statement in the monitrc control file. To setup
+Monit to log to its own logfile, use e.g. \fIset logfile
+/var/log/monit.log\fR. If \fBsyslog\fR is given as a value for the
+\&\fI\-l\fR command-line switch (or the keyword \fIset logfile syslog\fR
+is found in the control file) Monit will use the \fBsyslog\fR system
+daemon to log messages with a priority assigned to each message
+based on the context. To turn off logging, simply do not set the
+logfile in the control file (and of course, do not use the \-l
+switch)
+.SH "DAEMON MODE"
+.IX Header "DAEMON MODE"
+Use
+.PP
+.Vb 1
+\& set daemon n (where n is a number in seconds)
+.Ve
+.PP
+to specify Monit's poll cycle length and run Monit in daemon
+mode. You must specify a numeric argument which is a polling
+interval in seconds. In daemon mode, Monit detaches from the
+console, puts itself in the background and runs continuously,
+monitoring each specified service and then goes to sleep for the
+given poll interval, wakes up and start monitoring again in an
+endless cycle.
+.PP
+Alternatively, you can use the \fI\-d\fR command line switch to set
+the poll interval, but it is strongly recommended to set the poll
+interval in your \fI~/.monitrc\fR file, by using \fIset daemon\fR.
+.PP
+Monit will then always start in daemon mode. If you do not use
+this statement and do not start monit with the \-d option, Monit
+will just run through the service checks once and then exit. This
+may be useful in some situations, but Monit is primarily designed
+to run as a daemon process.
+.PP
+Calling monit with a Monit daemon running in the background sends
+a wake-up signal to the daemon, forcing it to check services
+immediately. Calling monit with the quit argument will kill a
+running Monit daemon process instead of waking it up.
+.SH "INIT SUPPORT"
+.IX Header "INIT SUPPORT"
+The \fIset init\fR statement prevents Monit from transforming itself
+into a daemon process. Instead Monit will run as a foreground
+process. (You should still use set daemon to specify the poll
+cycle).
+.PP
+This is required to run Monit from init. Using init to start
+Monit is probably the best way to run Monit if you want to be
+certain that you always have a running Monit daemon on your
+system. Another option is to run Monit from crontab. In any case,
+you should make sure that the control file does not have any
+syntax errors before you start Monit from init or crontab.
+.PP
+To setup Monit to run from init, you can either use the set init
+statement in Monit's control file or use the \-I option from the
+command line. Here is what you must add to /etc/inittab:
+.PP
+.Vb 2
+\&  # Run Monit in standard run\-levels
+\&  mo:2345:respawn:/usr/local/bin/monit \-Ic /etc/monitrc
+.Ve
+.PP
+After you have modified init's configuration file, you can run
+the following command to re-examine /etc/inittab and start Monit:
+.PP
+.Vb 1
+\&  telinit q
+.Ve
+.PP
+For systems without telinit:
+.PP
+.Vb 1
+\&  kill \-1 1
+.Ve
+.PP
+If Monit is used to monitor services that are also started at
+boot time (e.g. services started via \s-1SYSV\s0 init rc scripts or via
+inittab) then, in some cases, a race condition could occur. That
+is; if a service is slow to start, Monit can assume that the
+service is not running and possibly try to start it and raise an
+alert, while, in fact the service is already about to start or
+already in its startup sequence. Please see the \s-1FAQ\s0 for a
+solution to this problem.
+.SH "INCLUDE FILES"
+.IX Header "INCLUDE FILES"
+The Monit control file, \fImonitrc\fR, can include additional
+configuration files. This feature helps one to maintain a certain
+structure or to place repeating settings into one file. Include
+statements can be placed at virtually any spot. The syntax is the
+following:
+.PP
+.Vb 1
+\&  include globstring
+.Ve
+.PP
+The globstring is any kind of string as defined in \fIglob\fR\|(7). Thus,
+you can refer to a single file or you can load several files at
+once. If you want to use whitespace in your string the globstring
+need to be embedded into quotes (') or double quotes ("). If the
+globstring matches a directory instead of a file, it is silently
+ignored.
+.PP
+Any \fIinclude\fR statements in included files are parsed as in the
+main control file.
+.PP
+If the globstring matches several results, the files are included
+in a non sorted manner. If you need to rely on a certain order,
+you might need to use single \fIinclude\fR statements.
+.PP
+An example,
+.PP
+.Vb 1
+\& include /etc/monit.d/*.cfg
+.Ve
+.PP
+This will load any file matching the globstring. That is, all
+files in \fI/etc/monit.d\fR that ends with the prefix \fI.cfg\fR.
+.SH "GROUP SUPPORT"
+.IX Header "GROUP SUPPORT"
+Service entries in the control file, \fImonitrc\fR, can be grouped
+together by the \fIgroup\fR statement. The syntax is simply (keyword
+in capital):
+.PP
+.Vb 1
+\&  GROUP groupname
+.Ve
+.PP
+With this statement it is possible to group similar service
+entries together and manage them as a whole. Monit provides
+functions to start, stop, restart, monitor and unmonitor a
+group of services, like so:
+.PP
+To start a group of services from the console:
+.PP
+.Vb 1
+\&  Monit \-g <groupname> start
+.Ve
+.PP
+To stop a group of services:
+.PP
+.Vb 1
+\&  Monit \-g <groupname> stop
+.Ve
+.PP
+To restart a group of services:
+.PP
+.Vb 1
+\&  Monit \-g <groupname> restart
+.Ve
+.PP
+Note:
+the \fIstatus\fR and \fIsummary\fR commands don't support the \-g
+option and will print the state of all services.
+.PP
+Service can be added to multiple groups by adding group statement
+multiple times:
+.PP
+.Vb 2
+\&  group www
+\&  group filesystem
+.Ve
+.SH "MONITORING MODE"
+.IX Header "MONITORING MODE"
+Monit supports three monitoring modes per service: \fIactive\fR,
+\&\fIpassive\fR and \fImanual\fR. See also the example section below for
+usage of the mode statement.
+.PP
+In \fIactive\fR mode, Monit will monitor a service and in case of
+problems Monit will act and raise alerts, start, stop or restart
+the service. Active mode is the default mode.
+.PP
+In \fIpassive\fR mode, Monit will passively monitor a service and
+specifically \fBnot\fR try to fix a problem, but it will still raise
+alerts in case of a problem.
+.PP
+For use in clustered environments there is also a \fImanual\fR
+mode. In this mode, Monit will enter \fIactive\fR mode \fBonly\fR if a
+service was brought under monit's control, for example by
+executing the following command in the console:
+.PP
+.Vb 2
+\&  Monit start sybase 
+\&  (Monit will call sybase\*(Aqs start method and enable monitoring)
+.Ve
+.PP
+If a service was not started by Monit or was stopped or disabled
+for example by:
+.PP
+.Vb 2
+\&  Monit stop sybase 
+\&  (Monit will call sybase\*(Aqs stop method and disable monitoring)
+.Ve
+.PP
+Monit will then not monitor the service. This allows for having
+services configured in monitrc and start it with Monit only if it
+should run. This feature can be used to build a simple failsafe
+cluster.
+.PP
+A service's monitoring state is persistent across Monit restart.
+This means that you probably would like to make certain that
+services in manual mode are stopped or in unmonitored mode at
+server shutdown. Do for instance the following in a server
+shutdown script:
+.PP
+.Vb 1
+\&  Monit stop sybase
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\&  Monit unmonitor sybase
+.Ve
+.PP
+If you use Monit in a HA-cluster you should place the state file
+in a temporary filesystem so if the machine should crash and the
+stand-by machine take over services, any manual monitoring mode
+services that were started on the crashed machine won't be
+started on reboot. Use for example:
+.PP
+.Vb 1
+\&  set statefile /tmp/monit.state
+.Ve
+.SH "ALERT MESSAGES"
+.IX Header "ALERT MESSAGES"
+Monit will raise an email alert in the following situations:
+.PP
+.Vb 10
+\& o A service timed out
+\& o A service does not exist
+\& o A service related data access problem
+\& o A service related program execution problem
+\& o A service is of invalid object type
+\& o A program status failed
+\& o A icmp problem
+\& o A port connection problem
+\& o A resource statement match
+\& o A file checksum problem
+\& o A file size problem
+\& o A file/directory timestamp problem
+\& o A file/directory/filesystem permission problem
+\& o A file/directory/filesystem uid problem
+\& o A file/directory/filesystem gid problem
+\& o An action is done per administrator\*(Aqs request
+.Ve
+.PP
+Monit will send an alert each time a monitored object changed.
+This involves:
+.PP
+.Vb 8
+\& o Monit started, stopped or reloaded
+\& o A file checksum changed
+\& o A file size changed
+\& o A file content match
+\& o A file/directory timestamp changed
+\& o A filesystem mount flags changed
+\& o A process PID changed
+\& o A process PPID changed
+.Ve
+.PP
+You use the alert statement to notify Monit that you want alert
+messages sent to an email address. If you do not specify an alert
+statement, Monit will not send alert messages.
+.PP
+There are two forms of alert statement:
+.PP
+.Vb 2
+\& o Global \- common for all services
+\& o Local  \- per service
+.Ve
+.PP
+In both cases you can use more than one alert statement. In other
+words, you can send many different emails to many different
+addresses.
+.PP
+Recipients in the global and in the local lists are alerted when
+a service failed, recovered or changed. If the same email address
+is in the global and in the local list, Monit will only send one
+alert. Local (per service) defined alert email addresses override
+global addresses in case of a conflict. Finally, you may choose
+to only use a global alert list (recommended), a local per
+service list or both.
+.PP
+It is also possible to disable the global alerts locally for
+particular service(s) and recipients.
+.SS "Setting a global alert statement"
+.IX Subsection "Setting a global alert statement"
+If a change occurred on a monitored services, Monit will send an
+alert to all recipients in the global list who has registered
+interest for the event type. Here is the syntax for the global
+alert statement:
+.IP "\s-1SET\s0 \s-1ALERT\s0 mail-address [ [\s-1NOT\s0] {events}] [\s-1MAIL\-FORMAT\s0 {mail\-format}] [\s-1REMINDER\s0 number]" 4
+.IX Item "SET ALERT mail-address [ [NOT] {events}] [MAIL-FORMAT {mail-format}] [REMINDER number]"
+.PP
+Simply using the following in the global section of monitrc:
+.PP
+.Vb 1
+\& set alert foo@bar
+.Ve
+.PP
+will send a default email to the address foo@bar whenever an
+event occurred on any service. Such an event may be that a
+service timed out, a service doesn't exist and so on. If you want
+to send alert messages to more email addresses, add a \fIset alert
+\&'email'\fR statement for each address.
+.PP
+For explanations of the \fIevents, MAIL-FORMAT and \s-1REMINDER\s0\fR
+keywords above, please see below.
+.PP
+You can also use the \s-1NOT\s0 option ahead of the events list which
+will reverse the meaning of the list. That is, only send alerts
+for events \fInot\fR in the list. This can save you some
+configuration bytes if you are interested in most events except a
+few.
+.SS "Setting a local alert statement"
+.IX Subsection "Setting a local alert statement"
+Each service can also have its own recipient list.
+.IP "\s-1ALERT\s0 mail-address [ [\s-1NOT\s0] {events}] [\s-1MAIL\-FORMAT\s0 {mail\-format}] [\s-1REMINDER\s0 number]" 4
+.IX Item "ALERT mail-address [ [NOT] {events}] [MAIL-FORMAT {mail-format}] [REMINDER number]"
+.PP
+or
+.IP "\s-1NOALERT\s0 mail-address" 4
+.IX Item "NOALERT mail-address"
+.PP
+If you only want an alert message sent for certain events and for
+certain service(s), for example only for timeout events or only
+if a service died, then postfix the alert-statement with a filter
+block:
+.PP
+.Vb 3
+\& check process myproc with pidfile /var/run/my.pid
+\&   alert foo@bar only on { timeout, nonexist } 
+\&   ...
+.Ve
+.PP
+(\fIonly\fR and \fIon\fR are noise keywords, ignored by Monit. As a
+side note; Noise keywords are used in the control file grammar to
+make an entry resemble English and thus make it easier to read
+(or, so goes the philosophy). The full set of available noise
+keywords are listed below in the Control File section).
+.PP
+You can also setup to send alerts for all events except some by
+putting the word \fInot\fR ahead of the list. For example, if you
+want to receive alerts for all events except Monit instance
+events, you can write (note that the noise words 'but' and 'on'
+are optional):
+.PP
+.Vb 3
+\& check system myserver
+\&   alert foo@bar but not on { instance } 
+\&   ...
+.Ve
+.PP
+instead of:
+.PP
+.Vb 10
+\&   alert foo@bar on { action
+\&                      checksum
+\&                      connection
+\&                      content
+\&                      data
+\&                      exec
+\&                      fsflags
+\&                      gid
+\&                      icmp
+\&                      invalid
+\&                      nonexist
+\&                      permission
+\&                      pid
+\&                      ppid
+\&                      resource
+\&                      size
+\&                      status
+\&                      timeout
+\&                      timestamp
+\&                      uid
+\&                      uptime }
+.Ve
+.PP
+This will send alerts for all events to foo@bar, except Monit
+instance events. An instance event \s-1BTW\s0, is an event fired
+whenever the Monit program start or stop.
+.PP
+Event filtering can be used to send an email to different email
+addresses depending on the events that occurred. For instance:
+.PP
+.Vb 3
+\& alert foo@bar { nonexist, timeout, resource, icmp, connection }
+\& alert security@bar on { checksum, permission, uid, gid }
+\& alert manager@bar
+.Ve
+.PP
+This will send an alert message to foo@bar whenever a nonexist,
+timeout, resource or connection problem occurs and a message to
+security@bar if a checksum, permission, uid or gid problem
+occurs. And finally, a message to manager@bar whenever any error
+event occurs.
+.PP
+Here is the list of events you can use in a mail-filter: \fIaction,
+checksum, connection, content, data, exec, fsflags, gid, icmp,
+instance, invalid, nonexist, permission, pid, ppid, resource, size, 
+status, timeout, timestamp, uid, uptime\fR
+.PP
+You can also disable the alerts locally using the \s-1NOALERT\s0
+statement. This is useful if you have lots of services monitored
+and are using the global alert statement, but don't want to
+receive alerts for some minor subset of services:
+.PP
+.Vb 1
+\& noalert appadmin@bar
+.Ve
+.PP
+For example, if you stick the noalert statement in a 'check
+system' entry, you won't receive system related alerts (such as
+Monit instance started/stopped/reloaded alert, system overloaded
+alert, etc.) but will receive alerts for all other monitored
+services.
+.PP
+The following example will alert foo@bar on all events on all
+services by default, except the service mybar which will send an
+alert only on timeout. The trick is based on the fact that local
+definition of the same recipient overrides the global setting
+(including registered events and mail format):
+.PP
+.Vb 1
+\& set alert foo@bar
+\& 
+\& check process myfoo with pidfile /var/run/myfoo.pid
+\&   ...
+\& check process mybar with pidfile /var/run/mybar.pid
+\&   alert foo@bar only on { timeout }
+.Ve
+.SS "Alert message layout"
+.IX Subsection "Alert message layout"
+Monit provides a default mail message layout that is short and to
+the point. Here's an example of a standard alert mail sent by
+monit:
+.PP
+.Vb 4
+\& From: monit@tildeslash.com
+\& Subject: Monit alert \-\- Does not exist apache 
+\& To: hauk@tildeslash.com
+\& Date: Thu, 04 Sep 2003 02:33:03 +0200
+\&
+\& Does not exist Service apache
+\&
+\&        Date:   Thu, 04 Sep 2003 02:33:03 +0200
+\&        Action: restart
+\&        Host:   www.tildeslash.com
+\&
+\& Your faithful employee,
+\& monit
+.Ve
+.PP
+If you want to, you can change the format of this message with
+the optional \fImail-format\fR statement. The syntax for this
+statement is as follows:
+.PP
+.Vb 8
+\& mail\-format {
+\&      from: monit@localhost
+\&  reply\-to: support@domain.com
+\&   subject: $SERVICE $EVENT at $DATE
+\&   message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
+\&            Yours sincerely,
+\&            monit
+\& }
+.Ve
+.PP
+Where the keyword \fIfrom:\fR is the email address Monit should
+pretend it is sending from. It does not have to be a real mail
+address, but it must be a proper formatted mail address, on the
+form: name@domain. The \fIreply-to:\fR keyword can be used to set
+the reply-to mail header. The keyword \fIsubject:\fR is for the
+email subject line. The subject must be on only \fIone\fR line. The
+\&\fImessage:\fR keyword denotes the mail body. If used, this keyword
+should always be the last in a mail-format statement. The mail
+body can be as long as you want, but must \fBnot\fR contain the '}'
+character.
+.PP
+All of these format keywords are optional, but if used, you must
+provide at least one. Thus if you only want to change the from
+address Monit is using you can do:
+.PP
+.Vb 1
+\& set alert foo@bar with mail\-format { from: bofh@bar.baz }
+.Ve
+.PP
+From the previous example you will notice that some special \f(CW$XXX\fR
+variables were used. If used, they will be substituted and
+expanded into the text with these values:
+.IP "\(bu" 4
+\&\fI\f(CI$EVENT\fI\fR
+.Sp
+.Vb 2
+\& A string describing the event that occurred. The values are
+\& fixed and are:
+\&
+\& Event:    | Failure state:           | Success state:              
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& ACTION    | "Action done"            | "Action done"               
+\& CHECKSUM  | "Checksum failed"        | "Checksum succeeded"        
+\& CONNECTION| "Connection failed"      | "Connection succeeded"      
+\& CONTENT   | "Content failed",        | "Content succeeded"
+\& DATA      | "Data access error"      | "Data access succeeded"     
+\& EXEC      | "Execution failed"       | "Execution succeeded"       
+\& FSFLAG    | "Filesystem flags failed"| "Filesystem flags succeeded"
+\& GID       | "GID failed"             | "GID succeeded"             
+\& ICMP      | "ICMP failed"            | "ICMP succeeded"            
+\& INSTANCE  | "Monit instance changed" | "Monit instance changed not"
+\& INVALID   | "Invalid type"           | "Type succeeded"            
+\& NONEXIST  | "Does not exist"         | "Exists"                    
+\& PERMISSION| "Permission failed"      | "Permission succeeded"      
+\& PID       | "PID failed"             | "PID succeeded"
+\& PPID      | "PPID failed"            | "PPID succeeded"
+\& RESOURCE  | "Resource limit matched" | "Resource limit succeeded"  
+\& SIZE      | "Size failed"            | "Size succeeded"            
+\& STATUS    | "Status failed"          | "Status succeeded"            
+\& TIMEOUT   | "Timeout"                | "Timeout recovery"          
+\& TIMESTAMP | "Timestamp failed"       | "Timestamp succeeded"       
+\& UID       | "UID failed"             | "UID succeeded"             
+\& UPTIME    | "Uptime failed"          | "Uptime succeeded"
+.Ve
+.IP "\(bu" 4
+\&\fI\f(CI$SERVICE\fI\fR
+.Sp
+.Vb 1
+\& The service entry name in monitrc
+.Ve
+.IP "\(bu" 4
+\&\fI\f(CI$DATE\fI\fR
+.Sp
+.Vb 1
+\& The current time and date (RFC 822 date style).
+.Ve
+.IP "\(bu" 4
+\&\fI\f(CI$HOST\fI\fR
+.Sp
+.Vb 1
+\& The name of the host Monit is running on
+.Ve
+.IP "\(bu" 4
+\&\fI\f(CI$ACTION\fI\fR
+.Sp
+.Vb 2
+\& The name of the action which was done. Action names are fixed
+\& and are:
+\&
+\& Action:  | Name:
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& ALERT    | "alert"
+\& EXEC     | "exec"
+\& RESTART  | "restart"
+\& START    | "start"
+\& STOP     | "stop"
+\& UNMONITOR| "unmonitor"
+.Ve
+.IP "\(bu" 4
+\&\fI\f(CI$DESCRIPTION\fI\fR
+.Sp
+.Vb 1
+\& The description of the error condition
+.Ve
+.SS "Setting a global mail format"
+.IX Subsection "Setting a global mail format"
+It is possible to set a standard mail format with the following
+global set-statement (keywords are in capital):
+.IP "\s-1SET\s0 MAIL-FORMAT {mail\-format}" 4
+.IX Item "SET MAIL-FORMAT {mail-format}"
+.PP
+Format set with this statement will apply to every alert
+statement that does \fInot\fR have its own specified mail-format.
+This statement is most useful for setting a default from address
+for messages sent by monit, like so:
+.PP
+.Vb 1
+\& set mail\-format { from: monit@foo.bar.no }
+.Ve
+.SS "Setting an error reminder"
+.IX Subsection "Setting an error reminder"
+Monit by default sends just one error notification if a service
+failed and another when it recovered. If you want to be notified
+more then once if a service remains in a failed state, you can
+use the reminder option to the alert statement (keywords are in
+capital):
+.IP "\s-1ALERT\s0 ... [\s-1WITH\s0] \s-1REMINDER\s0 [\s-1ON\s0] number [\s-1CYCLES\s0]" 4
+.IX Item "ALERT ... [WITH] REMINDER [ON] number [CYCLES]"
+.PP
+For example if you want to be notified each tenth cycle if a
+service remains in a failed state, you can use:
+.PP
+.Vb 1
+\&  alert foo@bar with reminder on 10 cycles
+.Ve
+.PP
+Likewise if you want to be notified on each failed cycle, you can
+use:
+.PP
+.Vb 1
+\&  alert foo@bar with reminder on 1 cycle
+.Ve
+.SS "Setting a mail server for alert messages"
+.IX Subsection "Setting a mail server for alert messages"
+The mail server Monit should use to send alert messages is
+defined with a global set statement (keywords are in capital and
+optional statements in [brackets]):
+.PP
+.Vb 5
+\& SET MAILSERVER {hostname|ip\-address [PORT port]
+\&                [USERNAME username] [PASSWORD password]
+\&                [using SSLV2|SSLV3|TLSV1] [CERTMD5 checksum]}+ 
+\&                [with TIMEOUT X SECONDS]
+\&                [using HOSTNAME hostname]
+.Ve
+.PP
+The port statement allows one to use \s-1SMTP\s0 servers other then those
+listening on port 25. If omitted, port 25 is used unless ssl or
+tls is used, in which case port 465 is used by default.
+.PP
+Monit support plain smtp authentication \- you can set a username
+and a password using the \s-1USERNAME\s0 and \s-1PASSWORD\s0 options.
+.PP
+To use secure communication, use the \s-1SSLV2\s0, \s-1SSLV3\s0 or \s-1TLSV1\s0
+options, you can also specify the server certificate checksum
+using \s-1CERTMD5\s0 option.
+.PP
+As you can see, it is possible to set several \s-1SMTP\s0 servers. If
+Monit cannot connect to the first server in the list it will try
+the second server and so on. Monit has a default 5 seconds
+connection timeout and if the \s-1SMTP\s0 server is slow, Monit could
+timeout when connecting or reading from the server. If this is
+the case, you can use the optional timeout statement to explicit
+set the timeout to a higher value if needed. Here is an example
+for setting several mail servers:
+.PP
+.Vb 3
+\& set mailserver mail.tildeslash.com, mail.foo.bar port 10025
+\&     username "Rabbi" password "Loew" using tlsv1, localhost
+\&     with timeout 15 seconds
+.Ve
+.PP
+Here Monit will first try to connect to the server
+\&\*(L"mail.tildeslash.com\*(R", if this server is down Monit will try
+\&\*(L"mail.foo.bar\*(R" on port 10025 using the given credentials via tls
+and finally \*(L"localhost\*(R". We also set an explicit connect and read
+timeout; If Monit cannot connect to the first \s-1SMTP\s0 server in the
+list within 15 seconds it will try the next server and so on. The
+\&\fIset mailserver ..\fR statement is optional and if not defined
+Monit will not send email alerts. Not setting a mail server is
+recommended only if alert notification is delegated to M/Monit.
+.PP
+Monit, by default, use the local host name in \s-1SMTP\s0 \s-1HELO/EHLO\s0 and
+in the Message-ID header. Some mail servers check this
+information against \s-1DNS\s0 for spam protection and can reject the
+email if the \s-1DNS\s0 and the hostname used in the transaction does
+not match. If this is the case, you can override the default
+local host name by using the \s-1HOSTNAME\s0 option:
+.PP
+.Vb 2
+\& set mailserver mail.tildeslash.com using hostname
+\&     "myhost.example.org"
+.Ve
+.SS "Event queue"
+.IX Subsection "Event queue"
+If the \s-1MTA\s0 (mail server) for sending alerts is not available,
+Monit \fIcan\fR queue events on the local file-system until the \s-1MTA\s0
+recover. Monit will then post queued events in order with their
+original timestamp so the events are not lost. This feature is
+most useful if Monit is used together with M/Monit and when event
+history is important.
+.PP
+The event queue is persistent across Monit restarts and provided
+that the back-end filesystem is persistent too, across system
+restart as well.
+.PP
+By default, the queue is disabled and if the alert handler fails,
+Monit will simply drop the alert message. To enable the event
+queue, add the following statement to the Monit control file:
+.PP
+.Vb 1
+\& SET EVENTQUEUE BASEDIR <path> [SLOTS <number>]
+.Ve
+.PP
+The <path> is the path to the directory where events will be
+stored. Optionally if you want to limit the queue size, use the
+slots option to only store up to \fInumber\fR event messages. If the
+slots option is not used, Monit will store as many events as the
+backend filesystem allows.
+.PP
+Example:
+.PP
+.Vb 3
+\&  set eventqueue
+\&      basedir /var/monit
+\&      slots 5000
+.Ve
+.PP
+Events are stored in a binary format, with one file per event.
+The file size is ca. 130 bytes or a bit more (depending on the
+message length). The file name is composed of the unix timestamp,
+underscore and the service name, for example:
+.PP
+.Vb 1
+\& /var/monit/1131269471_apache
+.Ve
+.PP
+If you are running more then one Monit instance on the same
+machine, you \fBmust\fR use separated event queue directories to
+avoid sending wrong alerts to the wrong addresses.
+.PP
+If you want to purge the queue by hand, that is, remove queued
+event-files, Monit should be stopped before the removal.
+.SH "SERVICE TIMEOUT"
+.IX Header "SERVICE TIMEOUT"
+\&\fBMonit\fR provides a service timeout mechanism for situations
+where a service simply refuses to start or respond over a longer
+period.
+.PP
+The timeout mechanism is based on number of service restarts and
+number of poll-cycles. For example, if a service had \fIx\fR
+restarts within \fIy\fR poll-cycles (where \fIx\fR <= \fIy\fR) then Monit
+will perform an action (for example unmonitor the service). If a
+timeout occurs, Monit will send an alert message if you have
+register interest for this event.
+.PP
+The syntax for the timeout statement is as follows (keywords are
+in capital):
+.IP "\s-1IF\s0 <number> \s-1RESTART\s0 <number> \s-1CYCLE\s0(S) \s-1THEN\s0 <action>" 4
+.IX Item "IF <number> RESTART <number> CYCLE(S) THEN <action>"
+.PP
+Here is an example where Monit will unmonitor the service if it
+was restarted 2 times within 3 cycles:
+.PP
+.Vb 1
+\& if 2 restarts within 3 cycles then unmonitor
+.Ve
+.PP
+To have Monit check the service again after a monitoring was
+disabled, run 'monit monitor <servicename>' from the command
+line.
+.PP
+Example for setting custom exec on timeout:
+.PP
+.Vb 1
+\& if 5 restarts within 5 cycles then exec "/foo/bar"
+.Ve
+.PP
+Example for stopping the service:
+.PP
+.Vb 1
+\& if 7 restarts within 10 cycles then stop
+.Ve
+.SH "SERVICE TESTS"
+.IX Header "SERVICE TESTS"
+Monit provides several tests you can use in a 'check service'
+entry to test a service. There are two classes of tests:
+variable and constant tests. That is, the condition we test
+is either constant e.g. a number or it can vary.
+.PP
+A constant test has this general format:
+.IP "\s-1IF\s0 <\s-1TEST\s0> [[<X>] [\s-1TIMES\s0 \s-1WITHIN\s0] <Y> \s-1CYCLES\s0] \s-1THEN\s0 \s-1ACTION\s0 [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] [\s-1TIMES\s0 \s-1WITHIN\s0] <Y> \s-1CYCLES\s0] \s-1THEN\s0 \s-1ACTION\s0]" 4
+.IX Item "IF <TEST> [[<X>] [TIMES WITHIN] <Y> CYCLES] THEN ACTION [ELSE IF SUCCEEDED [[<X>] [TIMES WITHIN] <Y> CYCLES] THEN ACTION]"
+.PP
+If the <\s-1TEST\s0> condition should evaluate to true, then the
+selected action is executed each cycle the test condition remains
+true. The comparison value is constant. Recovery action is
+evaluated only once (on a failed to succeeded state change only).
+The '\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0' part is optional, if omitted, Monit will
+still send an alert on recovery. The alert is sent only once for
+each state change unless overridden by the 'reminder' alert
+option.
+.PP
+A variable test has this general format:
+.IP "\s-1IF\s0 \s-1CHANGED\s0 <\s-1TEST\s0> [[<X>] [\s-1TIMES\s0 \s-1WITHIN\s0] <Y> \s-1CYCLES\s0] \s-1THEN\s0 \s-1ACTION\s0" 4
+.IX Item "IF CHANGED <TEST> [[<X>] [TIMES WITHIN] <Y> CYCLES] THEN ACTION"
+.PP
+If the <\s-1TEST\s0> should evaluate to true, then the selected action
+is executed once. The comparison value is a variable where the
+last result becomes the new value and is used for comparisons in
+future cycles. An alert is delivered each time the condition
+becomes true.
+.PP
+You can use this test for alerts or for some automatic action,
+for example to reload monitored process after its configuration
+file was changed. Variable tests are supported for 'checksum',
+\&'size', 'pid, 'ppid' and 'timestamp' tests only.
+.IP "... [[<X>] [\s-1TIMES\s0 \s-1WITHIN\s0] <Y> \s-1CYCLES\s0] ..." 4
+.IX Item "... [[<X>] [TIMES WITHIN] <Y> CYCLES] ..."
+.PP
+If a test match, its action is executed at once. This behavior
+can optionally be changed and you can for instance require that a
+test must match over several poll cycles before the action is
+executed by using the statement above. You can use this in
+several ways. For example:
+.PP
+.Vb 1
+\& if failed port 80 for 3 times within 5 cycles then alert
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\& if failed port 80 for 10 cycles then unmonitor
+.Ve
+.PP
+If you don't specify <X> times, it equals <Y> by default, thus
+the test match if it evaluate to true for <Y> consecutive cycles.
+.PP
+It is possible to use this option to tune and prevent a rush of
+notifications. You can use this option for failed, succeeded,
+recovered or changed rules. Here is a more complex example:
+.PP
+.Vb 5
+\& check filesystem rootfs with path /dev/hda1
+\&  if space usage > 80% for 5 times within 15 cycles 
+\&     then alert else if succeeded for 10 cycles then alert
+\&  if space usage > 90% for 5 cycles then 
+\&     exec \*(Aq/try/to/free/the/space\*(Aq
+.Ve
+.PP
+In each test you must select the action to be executed from this
+list:
+.IP "\(bu" 4
+\&\fB\s-1ALERT\s0\fR sends the user an alert event on each state change (for
+constant tests) or on each change (for variable tests).
+.IP "\(bu" 4
+\&\fB\s-1RESTART\s0\fR restarts the service \fIand\fR sends an alert. Restart is
+conducted by first calling the service's registered stop method
+and then the service's start method.
+.IP "\(bu" 4
+\&\fB\s-1START\s0\fR starts the service by calling the service's registered
+start method \fIand\fR send an alert.
+.IP "\(bu" 4
+\&\fB\s-1STOP\s0\fR stops the service by calling the service's registered
+stop method \fIand\fR send an alert. If Monit stops a service it
+will not be checked by Monit anymore nor restarted again later.
+To reactivate monitoring of the service again you must explicitly
+enable monitoring from the web interface or from the console,
+e.g. 'monit monitor apache'.
+.IP "\(bu" 4
+\&\fB\s-1EXEC\s0\fR can be used to execute an arbitrary program \fIand\fR send
+an alert. If you choose this action you must state the program to
+be executed and if the program require arguments you must enclose
+the program and its arguments in a quoted string. You may
+optionally specify the uid and gid the executed program should
+switch to upon start. For instance:
+.Sp
+.Vb 2
+\& exec "/usr/local/tomcat/bin/startup.sh"
+\&      as uid nobody and gid nobody
+.Ve
+.Sp
+The uid and gid switch can be useful if the program to be started
+cannot change to a lesser privileged user and group. This is
+typically needed for Java Servers. Remember, if Monit is run by
+the superuser, then all programs executed by Monit will be
+started with superuser privileges unless the uid and gid
+extension was used.
+.IP "\(bu" 4
+\&\fB\s-1UNMONITOR\s0\fR will disable monitoring of the service \fIand\fR send
+an alert. The service will not be checked by Monit anymore nor
+restarted again later.  To reactivate monitoring of the service
+you must explicitly enable monitoring from monit's web interface
+or from the console using the monitor argument.
+.SS "\s-1EXISTENCE\s0 \s-1TESTING\s0"
+.IX Subsection "EXISTENCE TESTING"
+Monit's default action when services does not exist (for example
+a process is not running, a file doesn't exist, etc.) is to
+perform service restart action.
+.PP
+The default action can be overrided with following statement:
+.IP "\s-1IF\s0 [\s-1DOES\s0] \s-1NOT\s0 \s-1EXIST\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF [DOES] NOT EXIST [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+Example:
+.PP
+.Vb 2
+\& check file with path /cifs/mydata
+\&   if does not exist for 5 cycles then exec "/usr/bin/mount_cifs.sh"
+.Ve
+.SS "\s-1RESOURCE\s0 \s-1TESTING\s0"
+.IX Subsection "RESOURCE TESTING"
+Monit can examine how much system resources a service is using.
+This test can only be used within a system or process service
+entry in the Monit control file.
+.PP
+Depending on system or process characteristics, services can be
+stopped or restarted and alerts can be generated. Thus it is
+possible to utilize systems which are idle and to spare system
+under high load.
+.PP
+The full syntax for a resource-statement used for resource
+testing is as follows (keywords are in capital and optional
+statements in [brackets]),
+.IP "\s-1IF\s0 resource operator value [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF resource operator value [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIresource\fR is a choice of \*(L"\s-1CPU\s0\*(R", \*(L"\s-1TOTALCPU\s0\*(R",
+\&\*(L"\s-1CPU\s0([user|system|wait])\*(R", \*(L"\s-1MEMORY\s0\*(R", \*(L"\s-1SWAP\s0\*(R", \*(L"\s-1CHILDREN\s0\*(R", \*(L"\s-1TOTALMEMORY\s0\*(R",
+\&\*(L"\s-1LOADAVG\s0([1min|5min|15min])\*(R". Some resource tests can be used
+inside a check system entry, some in a check process entry and
+some in both:
+.PP
+System only resource tests:
+.PP
+\&\s-1CPU\s0([user|system|wait]) is the percent of time the system spend
+in user or system/kernel space. Some systems such as linux 2.6
+supports a 'wait' indicator as well.
+.PP
+\&\s-1SWAP\s0 is the swap usage of the system in either percent (of the
+systems total) or as an amount (Byte, kB, \s-1MB\s0, \s-1GB\s0).
+.PP
+Process only resource tests:
+.PP
+\&\s-1CPU\s0 is the \s-1CPU\s0 usage of the process itself (percent).
+.PP
+\&\s-1TOTALCPU\s0 is the total \s-1CPU\s0 usage of the process and its children
+in (percent). You will want to use \s-1TOTALCPU\s0 typically for
+services like Apache web server where one master process forks the
+child processes as workers.
+.PP
+\&\s-1CHILDREN\s0 is the number of child processes of the process.
+.PP
+\&\s-1TOTALMEMORY\s0 is the memory usage of the process and its child
+processes in either percent or as an amount (Byte, kB, \s-1MB\s0, \s-1GB\s0).
+.PP
+System and process resource tests:
+.PP
+\&\s-1MEMORY\s0 is the memory usage of the system or of a process (without
+children) in either percent (of the systems total) or as an
+amount (Byte, kB, \s-1MB\s0, \s-1GB\s0).
+.PP
+\&\s-1LOADAVG\s0([1min|5min|15min]) refers to the system's load average.
+The load average is the number of processes in the system run
+queue, averaged over the specified time period.
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R", \*(L">\*(R", \*(L"!=\*(R", \*(L"==\*(R" in C notation,
+\&\*(L"gt\*(R", \*(L"lt\*(R", \*(L"eq\*(R", \*(L"ne\*(R" in shell sh notation and \*(L"greater\*(R",
+\&\*(L"less\*(R", \*(L"equal\*(R", \*(L"notequal\*(R" in human readable form (if not
+specified, default is \s-1EQUAL\s0).
+.PP
+\&\fIvalue\fR is either an integer or a real number (except for
+\&\s-1CHILDREN\s0). For \s-1CPU\s0, \s-1TOTALCPU\s0, \s-1MEMORY\s0 and \s-1TOTALMEMORY\s0 you need to
+specify a \fIunit\fR. This could be \*(L"%\*(R" or if applicable \*(L"B\*(R" (Byte),
+\&\*(L"kB\*(R" (1024 Byte), \*(L"\s-1MB\s0\*(R" (1024 KiloByte) or \*(L"\s-1GB\s0\*(R" (1024 MegaByte).
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+To calculate the cycles, a counter is raised whenever the
+expression above is true and it is lowered whenever it is false
+(but not below 0). All counters are reset in case of a restart.
+.PP
+The following is an example to check that the \s-1CPU\s0 usage of a
+service is not going beyond 50% during five poll cycles. If it
+does, Monit will restart the service:
+.PP
+.Vb 1
+\& if cpu is greater than 50% for 5 cycles then restart
+.Ve
+.PP
+See also the example section below.
+.SS "\s-1FILE\s0 \s-1CHECKSUM\s0 \s-1TESTING\s0"
+.IX Subsection "FILE CHECKSUM TESTING"
+The checksum statement may only be used in a file service
+entry. If specified in the control file, Monit will compute
+a md5 or sha1 checksum for a file.
+.PP
+The checksum test in constant form is used to verify that a
+file does not change. Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1FAILED\s0 [MD5|SHA1] \s-1CHECKSUM\s0 [\s-1EXPECT\s0 checksum] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED [MD5|SHA1] CHECKSUM [EXPECT checksum] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+The checksum test in variable form is used to watch for
+file changes. Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1CHANGED\s0 [MD5|SHA1] \s-1CHECKSUM\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED [MD5|SHA1] CHECKSUM [[<X>] <Y> CYCLES] THEN action"
+.PP
+The choice of \s-1MD5\s0 or \s-1SHA1\s0 is optional. \s-1MD5\s0 features a 256 bit 
+and \s-1SHA1\s0 a 320 bit checksum. If this option is omitted Monit 
+tries to guess the method from the \s-1EXPECT\s0 string or uses \s-1MD5\s0 as
+default.
+.PP
+\&\fIexpect\fR is optional and if used it specifies a md5 or sha1
+string Monit should expect when testing a file's checksum. If
+\&\fIexpect\fR is used, Monit will not compute an initial checksum for
+the file, but instead use the string you submit. For example:
+.PP
+.Vb 3
+\& if failed checksum and 
+\&    expect the sum 8f7f419955cefa0b33a2ba316cba3659
+\& then alert
+.Ve
+.PP
+You can, for example, use the \s-1GNU\s0 utility \fI\fImd5sum\fI\|(1)\fR or 
+\&\fI\fIsha1sum\fI\|(1)\fR to create a checksum string for a file and 
+use this string in the expect-statement.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The checksum statement in variable form may be used to check a
+file for changes and if changed, do a specified action. For
+instance to reload a server if its configuration file was
+changed. The following illustrates this for the apache web
+server:
+.PP
+.Vb 3
+\& check file httpd.conf path /usr/local/apache/conf/httpd.conf
+\&     if changed sha1 checksum 
+\&        then exec "/usr/local/apache/bin/apachectl graceful"
+.Ve
+.PP
+If you plan to use the checksum statement for security reasons,
+(a very good idea, by the way) and to monitor a file or files
+which should not change, then please use the constant form and
+also read the \s-1DEPENDENCY\s0 \s-1TREE\s0 section below to see a detailed
+example on how to do this properly.
+.PP
+Monit can also test the checksum for files on a remote host via
+the \s-1HTTP\s0 protocol. See the \s-1CONNECTION\s0 \s-1TESTING\s0 section below.
+.SS "\s-1TIMESTAMP\s0 \s-1TESTING\s0"
+.IX Subsection "TIMESTAMP TESTING"
+The timestamp statement may only be used in a file, fifo or
+directory service entry.
+.PP
+The timestamp test in constant form is used to verify various
+timestamp conditions. Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1TIMESTAMP\s0 [[operator] value [unit]] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF TIMESTAMP [[operator] value [unit]] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+The timestamp statement in variable form is simply to test an
+existing file or directory for timestamp changes and if changed,
+execute an action. Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1CHANGED\s0 \s-1TIMESTAMP\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED TIMESTAMP [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R", \*(L">\*(R", \*(L"!=\*(R", \*(L"==\*(R" in C notation,
+\&\*(L"\s-1GT\s0\*(R", \*(L"\s-1LT\s0\*(R", \*(L"\s-1EQ\s0\*(R", \*(L"\s-1NE\s0\*(R" in shell sh notation and \*(L"\s-1GREATER\s0\*(R",
+\&\*(L"\s-1LESS\s0\*(R", \*(L"\s-1EQUAL\s0\*(R", \*(L"\s-1NOTEQUAL\s0\*(R" in human readable form (if not
+specified, default is \s-1EQUAL\s0).
+.PP
+\&\fIvalue\fR is a time watermark.
+.PP
+\&\fIunit\fR is either \*(L"\s-1SECOND\s0\*(R", \*(L"\s-1MINUTE\s0\*(R", \*(L"\s-1HOUR\s0\*(R" or \*(L"\s-1DAY\s0\*(R" (it is also
+possible to use \*(L"\s-1SECONDS\s0\*(R", \*(L"\s-1MINUTES\s0\*(R", \*(L"\s-1HOURS\s0\*(R", or \*(L"\s-1DAYS\s0\*(R").
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The variable timestamp statement is useful for checking a file
+for changes and then execute an action. This version was written
+particularly with configuration files in mind. For instance, if
+you monitor the apache web server you can use this statement to
+reload apache if the \fIhttpd.conf\fR (apache's configuration file)
+was changed. Like so:
+.PP
+.Vb 3
+\& check file httpd.conf with path /usr/local/apache/conf/httpd.conf
+\&   if changed timestamp
+\&      then exec "/usr/local/apache/bin/apachectl graceful"
+.Ve
+.PP
+The constant timestamp version is useful for monitoring systems
+able to report its state by changing the timestamp of certain
+state files. For instance the \fIiPlanet Messaging server stored
+process\fR system updates the timestamp of the following files:
+.PP
+.Vb 3
+\& o stored.ckp
+\& o stored.lcu
+\& o stored.per
+.Ve
+.PP
+If a task should fail, the system keeps the timestamp. To report
+stored problems you can use the following statements:
+.PP
+.Vb 2
+\& check file stored.ckp with path /msg\-foo/config/stored.ckp
+\&   if timestamp > 1 minute then alert
+\&
+\& check file stored.lcu with path /msg\-foo/config/stored.lcu
+\&   if timestamp > 5 minutes then alert
+\&
+\& check file stored.per with path /msg\-foo/config/stored.per
+\&   if timestamp > 1 hour then alert
+.Ve
+.PP
+As mentioned above, you can also use the timestamp statement for
+monitoring directories for changes. If files are added or removed
+from a directory, its timestamp is changed:
+.PP
+.Vb 2
+\& check directory mydir path /foo/directory
+\&  if timestamp > 1 hour then alert
+.Ve
+.PP
+or
+.PP
+.Vb 2
+\& check directory myotherdir path /foo/secure/directory
+\&  if timestamp < 1 hour then alert
+.Ve
+.PP
+The following example is a hack for restarting a process after a
+certain time. Sometimes this is a necessary workaround for some
+third-party applications, until the vendor fix a problem:
+.PP
+.Vb 3
+\& check file server.pid path /var/run/server.pid
+\&       if timestamp > 7 days 
+\&          then exec "/usr/local/server/restart\-server"
+.Ve
+.SS "\s-1FILE\s0 \s-1SIZE\s0 \s-1TESTING\s0"
+.IX Subsection "FILE SIZE TESTING"
+The size statement may only be used in a check file service
+entry. If specified in the control file, Monit will compute
+a size for a file.
+.PP
+The size test in constant form is used to verify various size
+conditions. Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1SIZE\s0 [[operator] value [unit]] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF SIZE [[operator] value [unit]] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+The size statement in variable form is simply to test an existing
+file for size changes and if changed, execute an action. Syntax
+(keywords are in capital):
+.IP "\s-1IF\s0 \s-1CHANGED\s0 \s-1SIZE\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED SIZE [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R", \*(L">\*(R", \*(L"!=\*(R", \*(L"==\*(R" in C notation,
+\&\*(L"\s-1GT\s0\*(R", \*(L"\s-1LT\s0\*(R", \*(L"\s-1EQ\s0\*(R", \*(L"\s-1NE\s0\*(R" in shell sh notation and \*(L"\s-1GREATER\s0\*(R",
+\&\*(L"\s-1LESS\s0\*(R", \*(L"\s-1EQUAL\s0\*(R", \*(L"\s-1NOTEQUAL\s0\*(R" in human readable form (if not
+specified, default is \s-1EQUAL\s0).
+.PP
+\&\fIvalue\fR is a size watermark.
+.PP
+\&\fIunit\fR is a choice of \*(L"B\*(R",\*(L"\s-1KB\s0\*(R",\*(L"\s-1MB\s0\*(R",\*(L"\s-1GB\s0\*(R" or long alternatives
+\&\*(L"byte\*(R", \*(L"kilobyte\*(R", \*(L"megabyte\*(R", \*(L"gigabyte\*(R". If it is not
+specified, \*(L"byte\*(R" unit is assumed by default.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The variable size test form is useful for checking a file for
+changes and send an alert or execute an action. Monit will
+register the size of the file at startup and monitor the file for
+changes. As soon as the value changes, Monit will perform the
+specified action, reset the registered value to the new value and
+continue monitoring and test if the size changes again.
+.PP
+One example of use for this statement is to conduct security
+checks, for instance:
+.PP
+.Vb 2
+\& check file su with path /bin/su
+\&       if changed size then exec "/sbin/ifconfig eth0 down"
+.Ve
+.PP
+which will \*(L"cut the cable\*(R" and stop a possible intruder from
+compromising the system further. This test is just one of many
+you may use to increase the security awareness on a system. If
+you plan to use Monit for security reasons we recommend that you
+use this test in combination with other supported tests like
+checksum, timestamp, and so on.
+.PP
+The constant form of this test can be useful in similar or
+different contexts. It can, for instance, be used to test if a
+certain file size was exceeded and then alert you or Monit may
+execute a certain action specified by you. An example is to use
+this statement to rotate log files after they have reached a
+certain size or to check that a database file does not grow
+beyond a specified threshold.
+.PP
+To rotate a log file:
+.PP
+.Vb 3
+\& check file myapp.log with path /var/log/myapp.log
+\&    if size > 50 MB then 
+\&       exec "/usr/local/bin/rotate /var/log/myapp.log myapp"
+.Ve
+.PP
+where /usr/local/bin/rotate may be a simple script, such as:
+.PP
+.Vb 3
+\& #/bin/bash
+\& /bin/mv $1 $1.\`date +%y\-%m\-%d\`
+\& /usr/bin/pkill \-HUP $2
+.Ve
+.PP
+Or you may use this statement to trigger the \fIlogrotate\fR\|(8)
+program, to do an \*(L"emergency\*(R" rotate. Or to send an alert if a
+file becomes a known bottleneck if it grows behind a certain size
+because of limits in a database engine:
+.PP
+.Vb 2
+\& check file mydb with path /data/mydatabase.db
+\&       if size > 1 GB then alert
+.Ve
+.PP
+This is a more restrictive form of the first example where the
+size is explicitly defined (note that the real su size is system
+dependent):
+.PP
+.Vb 2
+\& check file su with path /bin/su
+\&       if size != 95564 then exec "/sbin/ifconfig eth0 down"
+.Ve
+.SS "\s-1FILE\s0 \s-1CONTENT\s0 \s-1TESTING\s0"
+.IX Subsection "FILE CONTENT TESTING"
+The match statement allows you to test the content of a text file
+by using regular expressions. This is a great feature if you need
+to periodically test files, such as log files, for certain
+patterns. If a pattern match, Monit defaults to raise an alert,
+other actions are also possible.
+.PP
+The syntax (keywords in capital) for using this test is:
+.IP "\s-1IF\s0 [\s-1NOT\s0] \s-1MATCH\s0 {regex|path} [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF [NOT] MATCH {regex|path} [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIregex\fR is a string containing the extended regular expression.
+See also \fIregex\fR\|(7).
+.PP
+\&\fIpath\fR is an absolute path to a file containing extended
+regular expression on every line. See also \fIregex\fR\|(7).
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+You can use the \fI\s-1NOT\s0\fR statement to invert a match.
+.PP
+The content is only being checked every cycle. If content is
+being added and removed between two checks they are unnoticed.
+.PP
+On startup the read position is set to the end of the file 
+and Monit continue to scan to the end of file on each cycle. 
+But if the file size should decrease or inode change the read 
+position is set to the start of the file.
+.PP
+Only lines ending with a newline character are inspected. Thus,
+lines are being ignored until they have been completed with this
+character. Also note that only the first 511 characters of a line
+are inspected.
+.IP "\s-1IGNORE\s0 [\s-1NOT\s0] \s-1MATCH\s0 {regex|path}" 4
+.IX Item "IGNORE [NOT] MATCH {regex|path}"
+.PP
+Lines matching an \fI\s-1IGNORE\s0\fR are not inspected during later 
+evaluations. \fI\s-1IGNORE\s0 \s-1MATCH\s0\fR has always precedence over 
+\&\fI\s-1IF\s0 \s-1MATCH\s0\fR.
+.PP
+All \fI\s-1IGNORE\s0 \s-1MATCH\s0\fR statements are evaluated first, in the 
+order of their appearance. Thereafter, all the \fI\s-1IF\s0 \s-1MATCH\s0\fR 
+statements are evaluated.
+.PP
+A real life example might look like this:
+.PP
+.Vb 7
+\&  check file syslog with path /var/log/syslog
+\&    ignore match 
+\&        "^\ew{3} [ :0\-9]{11} [._[:alnum:]\-]+ monit\e[[0\-9]+\e]:"
+\&    ignore match /etc/monit/ignore.regex
+\&    if match 
+\&        "^\ew{3} [ :0\-9]{11} [._[:alnum:]\-]+ mrcoffee\e[[0\-9]+\e]:"
+\&    if match /etc/monit/active.regex then alert
+.Ve
+.SS "\s-1FILESYSTEM\s0 \s-1FLAGS\s0 \s-1TESTING\s0"
+.IX Subsection "FILESYSTEM FLAGS TESTING"
+Monit can test the flags of a filesystem for changes. This test
+is implicit and Monit will send alert in case of failure by
+default.
+.PP
+This test is useful for detecting changes of the filesystem flags
+such as when the filesystem became read-only based on disk errors
+or the mount flags were changed (such as nosuid). Each platform
+provides different set of flags. \s-1POSIX\s0 define the \s-1RDONLY\s0 and
+\&\s-1NOSUID\s0 flags which should work on all platforms. Some platforms
+(such as FreeBSD) has additonal flags.
+.PP
+The syntax for the fsflags statement is:
+.IP "\s-1IF\s0 \s-1CHANGED\s0 \s-1FSFLAGS\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED FSFLAGS [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+Example:
+.PP
+.Vb 3
+\& check filesystem rootfs with path /
+\&       if changed fsflags then exec "/my/script"
+\&       alert root@localhost
+.Ve
+.SS "\s-1SPACE\s0 \s-1TESTING\s0"
+.IX Subsection "SPACE TESTING"
+Monit can test file systems for space usage. This test may
+only be used within a check filesystem service entry in the
+Monit control file.
+.PP
+Monit will check a filesystem's total space usage. If you only
+want to check available space for non-superuser, you must set the
+watermark appropriately (i.e. total space minus reserved blocks
+for the superuser).
+.PP
+You can obtain (and set) the superuser's reserved blocks size,
+for example by using the tune2fs utility on Linux. On Linux 5% of
+available blocks are reserved for the superuser by default. On
+solaris 10% of the blocks are reserved. You can also use tunefs
+on solaris to change values on a live filesystem.
+.PP
+The full syntax for the space statement is:
+.IP "\s-1IF\s0 \s-1SPACE\s0 operator value unit [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF SPACE operator value unit [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R",\*(L">\*(R",\*(L"!=\*(R",\*(L"==\*(R" in c notation, \*(L"gt\*(R",
+\&\*(L"lt\*(R", \*(L"eq\*(R", \*(L"ne\*(R" in shell sh notation and \*(L"greater\*(R", \*(L"less\*(R",
+\&\*(L"equal\*(R", \*(L"notequal\*(R" in human readable form (if not specified,
+default is \s-1EQUAL\s0).
+.PP
+\&\fIunit\fR is a choice of \*(L"B\*(R",\*(L"\s-1KB\s0\*(R",\*(L"\s-1MB\s0\*(R",\*(L"\s-1GB\s0\*(R", \*(L"%\*(R" or long
+alternatives \*(L"byte\*(R", \*(L"kilobyte\*(R", \*(L"megabyte\*(R", \*(L"gigabyte\*(R",
+\&\*(L"percent\*(R".
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.SS "\s-1INODE\s0 \s-1TESTING\s0"
+.IX Subsection "INODE TESTING"
+If supported by the file-system, you can use Monit to test
+for inodes usage. This test may only be used within a check
+filesystem service entry in the Monit control file.
+.PP
+If the filesystem becomes unavailable, Monit will call the
+service's registered start method, if it is defined and if Monit
+is running in active mode. If Monit runs in passive mode or the
+start methods is not defined, Monit will just send an error
+alert.
+.PP
+The syntax for the inode statement is:
+.IP "\s-1IF\s0 \s-1INODE\s0(S) operator value [unit] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF INODE(S) operator value [unit] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R",\*(L">\*(R",\*(L"!=\*(R",\*(L"==\*(R" in c notation, \*(L"gt\*(R",
+\&\*(L"lt\*(R", \*(L"eq\*(R", \*(L"ne\*(R" in shell sh notation and \*(L"greater\*(R", \*(L"less\*(R",
+\&\*(L"equal\*(R", \*(L"notequal\*(R" in human readable form (if not specified,
+default is \s-1EQUAL\s0).
+.PP
+\&\fIunit\fR is optional. If not specified, the value is an absolute
+count of inodes. You can use the \*(L"%\*(R" character or the longer
+alternative \*(L"percent\*(R" as a unit.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.SS "\s-1PERMISSION\s0 \s-1TESTING\s0"
+.IX Subsection "PERMISSION TESTING"
+Monit can monitor the permission of file objects. This test may
+only be used within a file, fifo, directory or filesystem service
+entry in the Monit control file.
+.PP
+The syntax for the permission statement is:
+.IP "\s-1IF\s0 \s-1FAILED\s0 \s-1PERM\s0(\s-1ISSION\s0) octalnumber [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED PERM(ISSION) octalnumber [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIoctalnumber\fR defines permissions for a file, a directory or a
+filesystem as four octal digits (0\-7). Valid range: 0000 \- 7777 (you
+can omit the leading zeros, Monit will add the zeros to the left
+thus for example \*(L"640\*(R" is valid value and matches \*(L"0640\*(R").
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The web interface will show a permission warning if the test
+failed.
+.PP
+We recommend that you use the \s-1UNMONITOR\s0 action in a permission
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+.PP
+.Vb 2
+\& check file monit.bin with path "/usr/local/bin/monit"
+\&       if failed permission 0555 then unmonitor
+.Ve
+.PP
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+.SS "\s-1UID\s0 \s-1TESTING\s0"
+.IX Subsection "UID TESTING"
+Monit can monitor the owner user id (uid) of a file object.
+This test may only be used within a check \- file, fifo,
+directory or filesystem service entry in the Monit control
+file.
+.PP
+The syntax for the uid statement is:
+.IP "\s-1IF\s0 \s-1FAILED\s0 \s-1UID\s0 user [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED UID user [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIuser\fR defines a user id either in numeric or in string form.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The web interface will show a uid warning if the test should
+fail.
+.PP
+We recommend that you use the \s-1UNMONITOR\s0 action in a uid
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+.PP
+.Vb 2
+\& check file passwd with path /etc/passwd
+\&       if failed uid root then unmonitor
+.Ve
+.PP
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+.SS "\s-1GID\s0 \s-1TESTING\s0"
+.IX Subsection "GID TESTING"
+Monit can monitor the owner group id (gid) of file objects. This
+test may only be used within a file, fifo, directory or
+filesystem service entry in the Monit control file.
+.PP
+The syntax for the gid statement is:
+.IP "\s-1IF\s0 \s-1FAILED\s0 \s-1GID\s0 user [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED GID user [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIuser\fR defines a group id either in numeric or in string form.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+The web interface will show a gid warning if the test should
+fail.
+.PP
+We recommend that you use the \s-1UNMONITOR\s0 action in a gid
+statement. The rationale for this feature is security and that
+Monit does not start a possible cracked program or script.
+Example:
+.PP
+.Vb 2
+\& check file shadow with path /etc/shadow
+\&       if failed gid root then unmonitor
+.Ve
+.PP
+If the test fails, Monit will simply send an alert and stop
+monitoring the file and propagate an unmonitor action upward in
+a depend tree.
+.SS "\s-1PID\s0 \s-1TESTING\s0"
+.IX Subsection "PID TESTING"
+Monit can test the process identification number (pid) of a
+process for changes. This test is implicit and Monit will send a
+alert in the case of failure by default.
+.PP
+The syntax for the pid statement is:
+.IP "\s-1IF\s0 \s-1CHANGED\s0 \s-1PID\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED PID [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+This test is useful to detect possible process restarts which has
+occurred in the timeframe between two Monit testing cycles. In
+the case that the restart was fast and the process provides
+expected service (i.e. all tests succeeded) you will be notified
+that the process was replaced.
+.PP
+For example sshd daemon can restart very quickly, thus if someone
+changes its configuration and do sshd restart outside of Monit's
+control you will be notified that the process was replaced by a
+new instance (or you can optionally do some other action such as
+preventively stop sshd).
+.PP
+Another example is a MySQL Cluster which has its own watchdog
+with process restart ability. You can use Monit for redundant
+monitoring.
+.PP
+Example:
+.PP
+.Vb 2
+\& check process sshd with pidfile /var/run/sshd.pid
+\&       if changed pid then exec "/my/script"
+.Ve
+.SS "\s-1PPID\s0 \s-1TESTING\s0"
+.IX Subsection "PPID TESTING"
+Monit can test the process parent process identification number
+(ppid) of a process for changes. This test is implicit and Monit
+will send alert in the case of failure by default.
+.PP
+The syntax for the ppid statement is:
+.IP "\s-1IF\s0 \s-1CHANGED\s0 \s-1PPID\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action" 4
+.IX Item "IF CHANGED PPID [[<X>] <Y> CYCLES] THEN action"
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+This test is useful for detecting changes of a process parent.
+.PP
+Example:
+.PP
+.Vb 2
+\& check process myproc with pidfile /var/run/myproc.pid
+\&       if changed ppid then exec "/my/script"
+.Ve
+.SS "\s-1UPTIME\s0 \s-1TESTING\s0"
+.IX Subsection "UPTIME TESTING"
+The uptime statement may only be used in a check process service
+entry. If specified in the control file, Monit will test the
+process uptime.
+.PP
+Syntax (keywords are in capital):
+.IP "\s-1IF\s0 \s-1UPTIME\s0 [[operator] value [unit]] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF UPTIME [[operator] value [unit]] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R", \*(L">\*(R", \*(L"!=\*(R", \*(L"==\*(R" in C notation,
+\&\*(L"\s-1GT\s0\*(R", \*(L"\s-1LT\s0\*(R", \*(L"\s-1EQ\s0\*(R", \*(L"\s-1NE\s0\*(R" in shell sh notation and \*(L"\s-1GREATER\s0\*(R",
+\&\*(L"\s-1LESS\s0\*(R", \*(L"\s-1EQUAL\s0\*(R", \*(L"\s-1NOTEQUAL\s0\*(R" in human readable form (if not
+specified, default is \s-1EQUAL\s0).
+.PP
+\&\fIvalue\fR is a uptime watermark.
+.PP
+\&\fIunit\fR is either \*(L"\s-1SECOND\s0\*(R", \*(L"\s-1MINUTE\s0\*(R", \*(L"\s-1HOUR\s0\*(R" or \*(L"\s-1DAY\s0\*(R" (it is also
+possible to use \*(L"\s-1SECONDS\s0\*(R", \*(L"\s-1MINUTES\s0\*(R", \*(L"\s-1HOURS\s0\*(R", or \*(L"\s-1DAYS\s0\*(R").
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+Example of restarting the process if the uptime exceeded 3 days:
+.PP
+.Vb 4
+\& check process myapp with pidfile /var/run/myapp.pid
+\&    start program = "/etc/init.d/myapp start"
+\&    stop program = "/etc/init.d/myapp stop"
+\&    if uptime > 3 days then restart
+.Ve
+.SS "\s-1CONNECTION\s0 \s-1TESTING\s0"
+.IX Subsection "CONNECTION TESTING"
+Monit is able to perform connection testing via networked
+ports or via Unix sockets. A connection test may only be
+used within a check process or within a check host service
+entry in the Monit control file.
+.PP
+If a service listens on one or more sockets, Monit can connect to
+the port (using either tcp or udp) and verify that the service
+will accept a connection and that it is possible to write and
+read from the socket. If a connection is not accepted or if there
+is a problem with socket i/o, Monit will assume that something is
+wrong and execute a specified action. If Monit is compiled with
+openssl, then ssl based network services can also be tested.
+.PP
+The full syntax for the statement used for connection testing is
+as follows (keywords are in capital and optional statements in
+[brackets]),
+.IP "\s-1IF\s0 \s-1FAILED\s0 [host] port [type] [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED [host] port [type] [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+or for Unix sockets,
+.IP "\s-1IF\s0 \s-1FAILED\s0 [unixsocket] [type] [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED [unixsocket] [type] [protocol|{send/expect}+] [timeout] [retry] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fBhost:HOST hostname\fR. Optionally specify the host to connect to.
+If the host is not given then localhost is assumed if this test
+is used inside a process entry. If this test was used inside a
+remote host entry then the entry's remote host is assumed.
+Although \fIhost\fR is intended for testing name based virtual host
+in a \s-1HTTP\s0 server running on local or remote host, it does allow
+the connection statement to be used to test a server running on
+another machine. This may be useful; For instance if you use
+Apache httpd as a front-end and an application-server as the
+back-end running on another machine, this statement may be used
+to test that the back-end server is running and if not raise an
+alert.
+.PP
+\&\fBport:PORT number\fR. The port number to connect to
+.PP
+\&\fBunixsocket:UNIXSOCKET \s-1PATH\s0\fR. Specifies the path to a Unix
+socket. Servers based on Unix sockets always run on the local
+machine and do not use a port.
+.PP
+\&\fBtype:TYPE {TCP|UDP|TCPSSL}\fR. Optionally specify the socket type
+Monit should use when trying to connect to the port. The
+different socket types are; \s-1TCP\s0, \s-1UDP\s0 or \s-1TCPSSL\s0, where \s-1TCP\s0 is a
+regular stream based socket, \s-1UDP\s0 is a datagram socket and \s-1TCPSSL\s0
+specifies that Monit should use a \s-1TCP\s0 socket with \s-1SSL\s0 when
+connecting to a port. The default socket type is \s-1TCP\s0. If \s-1TCPSSL\s0
+is used you may optionally specify the \s-1SSL/TLS\s0 protocol to be
+used and the md5 sum of the server's certificate. The \s-1TCPSSL\s0
+options are:
+.PP
+.Vb 1
+\& TCPSSL [SSLAUTO|SSLV2|SSLV3|TLSV1] [CERTMD5 md5sum]
+.Ve
+.PP
+\&\fBproto(col):PROTO {protocols}\fR. Optionally specify the protocol
+Monit should speak when a connection is established. At the
+moment Monit knows how to speak:
+ \fIAPACHE-STATUS\fR
+ \fI\s-1DNS\s0\fR
+ \fI\s-1DWP\s0\fR
+ \fI\s-1FTP\s0\fR
+ \fI\s-1GPS\s0\fR
+ \fI\s-1HTTP\s0\fR
+ \fI\s-1IMAP\s0\fR
+ \fI\s-1CLAMAV\s0\fR
+ \fI\s-1LDAP2\s0\fR
+ \fI\s-1LDAP3\s0\fR
+ \fI\s-1LMTP\s0\fR
+ \fI\s-1MEMCACHE\s0\fR
+ \fI\s-1MYSQL\s0\fR
+ \fI\s-1NNTP\s0\fR
+ \fI\s-1NTP3\s0\fR
+ \fI\s-1POP\s0\fR
+ \fIPOSTFIX-POLICY\fR
+ \fI\s-1RADIUS\s0\fR
+ \fI\s-1RDATE\s0\fR
+ \fI\s-1RSYNC\s0\fR
+ \fI\s-1SIP\s0\fR
+ \fI\s-1SMTP\s0\fR
+ \fI\s-1SSH\s0\fR
+ \fI\s-1TNS\s0\fR
+ \fI\s-1PGSQL\s0\fR
+If you have compiled Monit with ssl support, Monit can also speak
+the \s-1SSL\s0 variants such as:
+ \fI\s-1HTTPS\s0\fR
+ \fI\s-1FTPS\s0\fR
+ \fI\s-1POPS\s0\fR
+ \fI\s-1IMAPS\s0\fR
+To use the \s-1SSL\s0 protocol support you need to define the socket as
+\&\s-1SSL\s0 and use the general protocol name (for example in the case of
+\&\s-1HTTPS\s0) :
+ \s-1TYPE\s0 \s-1TCPSSL\s0 \s-1PROTOCOL\s0 \s-1HTTP\s0
+If the server's protocol is not found in this list, simply do not
+specify the protocol and Monit will utilize a default test,
+including test if it is possible to read and write to the
+port. This default test is in most cases more than good enough to
+deduce if the server behind the port is up or not.
+.PP
+The protocol statement is:
+.PP
+.Vb 1
+\& PROTO(COL) {name}
+.Ve
+.PP
+The \s-1HTTP\s0 protocol supports in addition:
+.IP "\(bu" 4
+\&\s-1REQUEST\s0
+.IP "\(bu" 4
+\&\s-1HOSTHEADER\s0
+.IP "\(bu" 4
+\&\s-1CHECKSUM\s0
+.PP
+.Vb 1
+\& PROTO(COL) HTTP [REQUEST {"/path"} [with CHECKSUM checksum] [with HOSTHEADER "string"]
+.Ve
+.PP
+The Host header option can be used to explicit specify the \s-1HTTP\s0
+host header in the request. If not used, Monit will use the
+hostname or IP-address of the host as specified in the statement.
+Specifying a host header is useful if you want to connect to the
+host using an IP-address, and the web-server handle name based
+virtual hosts. Examples:
+.PP
+.Vb 4
+\&  if failed host 192.168.1.100 port 8080 protocol http 
+\&     and request \*(Aq/testing\*(Aq hostheader \*(Aqexample.com\*(Aq 
+\&     with timeout 20 seconds for 2 cycles 
+\&  then alert
+.Ve
+.PP
+In addition to the standard protocols, the \fIAPACHE-STATUS\fR
+protocol is a test of a specific server type, rather than a
+generic protocol. Server performance is examined using the status
+page generated by Apache's mod_status, which is expected to be at
+its default address of http://www.example.com/server\-status.
+Currently the \fIAPACHE-STATUS\fR protocol examines the percentage
+of Apache child processes which are
+.PP
+.Vb 10
+\& o logging (loglimit)
+\& o closing connections (closelimit)
+\& o performing DNS lookups (dnslimit)
+\& o in keepalive with a client (keepalivelimit)
+\& o replying to a client (replylimit)
+\& o receiving a request (requestlimit)
+\& o initialising (startlimit)
+\& o waiting for incoming connections (waitlimit)
+\& o gracefully closing down (gracefullimit)
+\& o performing cleanup procedures (cleanuplimit)
+.Ve
+.PP
+Each of these quantities can be compared against a value relative
+to the total number of active Apache child processes. If the
+comparison expression is true the chosen action is performed.
+.PP
+The apache-status protocol statement is formally defined as
+(keywords in uppercase):
+.PP
+.Vb 1
+\& PROTO(COL) {limit} OP PERCENT [OR {limit} OP PERCENT]*
+.Ve
+.PP
+where {limit} is one or more of: loglimit, closelimit, dnslimit,
+keepalivelimit, replylimit, requestlimit, startlimit, waitlimit
+gracefullimit or cleanuplimit. The operator \s-1OP\s0 is one of:
+[<|=|>].
+.PP
+You can combine all of these test into one expression or you can
+choose to test a certain limit. If you combine the limits you
+must or' them together using the \s-1OR\s0 keyword.
+.PP
+Here's an example were we test for a loglimit more than 10
+percent, a dnslimit over 25 percent and a wait limit less than 20
+percent of processes. See also more examples below in the example
+section.
+.PP
+.Vb 5
+\& protocol apache\-status 
+\&                loglimit > 10% or
+\&                dnslimit > 50% or
+\&                waitlimit < 20%
+\& then alert
+.Ve
+.PP
+Obviously, do not use this test unless the httpd server you are
+testing is Apache Httpd and mod_status is activated on the
+server.
+.PP
+\&\fBsend/expect: {SEND|EXPECT} \*(L"string\*(R" ...\fR. If Monit does not
+support the protocol spoken by the server, you can write your own
+protocol-test using \fIsend\fR and \fIexpect\fR strings. The \fI\s-1SEND\s0\fR
+statement sends a string to the server port and the \fI\s-1EXPECT\s0\fR
+statement compares a string read from the server with the string
+given in the expect statement. If your system supports \s-1POSIX\s0
+regular expressions, you can use regular expressions in the
+expect string, see \fIregex\fR\|(7) to learn more about the types of
+regular expressions you can use in an expect string. Otherwise
+the string is used as it is. The send/expect statement is:
+.PP
+.Vb 1
+\& [{SEND|EXPECT} "string"]+
+.Ve
+.PP
+Note that Monit will send a string as it is, and you \fBmust\fR
+remember to include \s-1CR\s0 and \s-1LF\s0 in the string sent to the server if
+the protocol expect such characters to terminate a string (most
+text based protocols used over Internet does). Likewise monit
+will read up to 256 bytes from the server and use this string
+when comparing the expect string. If the server sends strings
+terminated by \s-1CRLF\s0, (i.e. \*(L"\er\en\*(R") you \fImay\fR remember to add the
+same terminating characters to the string you expect from the
+server.
+.PP
+As mentioned above, Monit limits the expect input to 255 bytes.
+You can override the default value by using this set statement at
+the top of the Monit configuration file:
+.PP
+.Vb 1
+\& SET EXPECTBUFFER <number> ["b"|"kb"|"mb"]
+.Ve
+.PP
+For example, to set the expect buffer to read 10 kilobytes:
+.PP
+.Vb 1
+\& set expectbuffer 10 kb
+.Ve
+.PP
+Note, if you want to test the number of bytes returned from the
+server you need to work around a bound check limit in \s-1POSIX\s0
+regex. You cannot use something like expect \*(L".{5000}\*(R" as the max
+number in a boundary check usually is {255}. However this should
+work, expect \*(L"(.{250}){20}\*(R"
+.PP
+You can use non-printable characters in a send string if needed.
+Use the hex notation, \e0xHEXHEX to send any char in the range
+\&\e0x00\-\e0xFF, that is, 0\-255 in decimal. This may be useful when
+testing some network protocols, particularly those over \s-1UDP\s0. For
+example, to test a quake 3 server you can use the following,
+.PP
+.Vb 2
+\&      send "\e0xFF\e0xFF\e0xFF\e0xFFgetstatus"
+\&      expect "sv_floodProtect|sv_maxPing"
+.Ve
+.PP
+Finally, send/expect can be used with any socket type, such as
+\&\s-1TCP\s0 sockets, \s-1UNIX\s0 sockets and \s-1UDP\s0 sockets.
+.PP
+\&\fBtimeout:with \s-1TIMEOUT\s0 x \s-1SECONDS\s0\fR. Optionally specifies the
+connect and read timeout for the connection. If Monit cannot
+connect to the server within this time it will assume that the
+connection failed and execute the specified action. The default
+connect timeout is 5 seconds.
+.PP
+\&\fBretry:RETRY x\fR. Optionally specifies the number of consecutive
+retries within the same testing cycle in the case that the
+connection failed. The default is fail on first error.
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.PP
+Connection testing using the \s-1URL\s0 notation
+.IX Subsection "Connection testing using the URL notation"
+.PP
+You can test a \s-1HTTP\s0 server using the compact \s-1URL\s0 syntax. This
+test also allow you to use \s-1POSIX\s0 regular expressions to test the
+content returned by the \s-1HTTP\s0 server.
+.PP
+The full syntax for the \s-1URL\s0 statement is as follows (keywords are
+in capital and optional statements in [brackets]):
+.PP
+.Vb 5
+\&  IF FAILED URL URL\-spec
+\&     [CONTENT {==|!=} "regular\-expression"]
+\&     [TIMEOUT number SECONDS] [[<X>] <Y> CYCLES] 
+\&     THEN action
+\&     [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+.Ve
+.PP
+Where URL-spec is an \s-1URL\s0 on the standard form as specified in \s-1RFC\s0
+2396:
+.PP
+.Vb 1
+\& <protocol>://<authority><path>?<query>
+.Ve
+.PP
+Here is an example of an \s-1URL\s0 where all components are used:
+.PP
+.Vb 1
+\& http://user:password@www.foo.bar:8080/document/?querystring#ref
+.Ve
+.PP
+If a username and password is included in the \s-1URL\s0 Monit will
+attempt to login at the server using \fBBasic Authentication\fR.
+.PP
+Testing the content returned by the server is optional. If used,
+you can test if the content \fBmatch\fR or does \fBnot match\fR a
+regular expression. Here's an example on how the \s-1URL\s0 statement
+can be used in a \fIcheck service\fR:
+.PP
+.Vb 4
+\& check host FOO with address www.foo.bar
+\&      if failed (url http://user:password@www.foo.bar:8080/login?querystring
+\&         and content == \*(Aqup\*(Aq)
+\&      then ...
+.Ve
+.PP
+Note that the content option extends the \s-1URL\s0 by the expected data
+and does not act as standalone failure specification. The syntax is
+\&\*(L"if failed (<\s-1URL\s0> and <content>)\*(R".
+.PP
+Monit will look at the content-length header returned by the
+server and download this amount before testing the content. That
+is, if the content-length is more than 1Mb or this header is not
+set by the server Monit will default to download up to 1 Mb and
+not more.
+.PP
+Only the http(s) protocol is supported in an \s-1URL\s0 statement. If
+the protocol is \fBhttps\fR Monit will use \s-1SSL\s0 when connecting to
+the server.
+.PP
+Remote host ping test
+.IX Subsection "Remote host ping test"
+.PP
+In addition Monit can perform \s-1ICMP\s0 Echo tests in remote host
+checks. The icmp test may only be used in a check host entry and
+Monit must run with super user privileges, that is, the root user
+must run monit. The reason is that the icmp test utilize a raw
+socket to send the icmp packet and only the super user is allowed
+to create a raw socket.
+.PP
+The full syntax for the \s-1ICMP\s0 Echo statement used for ping testing
+is as follows (keywords are in capital and optional statements in
+[brackets]):
+.PP
+.Vb 5
+\&  IF FAILED ICMP TYPE ECHO
+\&     [COUNT number] [WITH] [TIMEOUT number SECONDS] 
+\&       [[<X>] <Y> CYCLES]
+\&     THEN action
+\&     [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]
+.Ve
+.PP
+The rules for action and timeout are the same as those mentioned
+above in the \s-1CONNECTION\s0 \s-1TESTING\s0 section. The count parameter
+specifies how many consecutive echo requests will be send to the
+host in one cycle. In the case that no reply came within timeout
+frame, Monit reports error. When at least one reply was received,
+the test will pass. Monit sends by default three echo requests in
+one cycle to prevent the random packet loss from generating false
+alarm (i.e. up to 66% packet loss is tolerated). You can set the
+count option to a value between 1 and 20, which can serve as an 
+error ratio. For example if you require 100% ping success, set 
+the count to 1 (i.e. just one request will be sent, and if the
+packet was lost an error will be reported).
+.PP
+An icmp ping test is useful for testing if a host is up, before
+testing ports at the host. If an icmp ping test is used in a
+check host entry, this test is run first and if the ping test
+should fail we assume that the connection to the host is down and
+Monit does \fInot\fR continue to test any ports. Here's an example:
+.PP
+.Vb 6
+\& check host xyzzy with address xyzzy.org
+\&       if failed icmp type echo count 5 with timeout 15 seconds 
+\&          then alert
+\&       if failed port 80 proto http then alert
+\&       if failed port 443 type TCPSSL proto http then alert
+\&       alert foo@bar
+.Ve
+.PP
+In this case, if the icmp test should fail you will get \fIone\fR
+alert and only one alert as long as the host is down, and equally
+important, Monit will \fInot\fR test port 80 and port 443. Likewise
+if the icmp ping test should succeed (again) Monit will continue
+to test both port 80 and 443.
+.PP
+Keep in mind though that some firewalls can block icmp packages
+and thus render the test useless.
+.PP
+Examples
+.IX Subsection "Examples"
+.PP
+To check a port connection and receive an alert if Monit cannot
+connect to the port, use the following statement:
+.PP
+.Vb 1
+\&  if failed port 80 then alert
+.Ve
+.PP
+In this case the machine in question is assumed to be the default
+host. For a process entry it's \fIlocalhost\fR and for a remote host
+entry it's the \fIaddress\fR of the remote host. Monit will conduct
+a tcp connection to the host at port 80 and use tcp by default.
+If you want to connect with udp, you can specify this after the
+port-statement;
+.PP
+.Vb 1
+\& if failed port 53 type udp protocol dns then alert
+.Ve
+.PP
+Monit will stop trying to connect to the port after 5 seconds and
+assume that the server behind the port is down. You may increase
+or decrease the connect timeout by explicit add a connection
+timeout. In the following example the timeout is increased to 15
+seconds and if Monit cannot connect to the server within 15
+seconds the test will fail and an alert message is sent.
+.PP
+.Vb 1
+\&  if failed port 80 with timeout 15 seconds then alert
+.Ve
+.PP
+If a server is listening to a Unix socket the following statement
+can be used:
+.PP
+.Vb 1
+\& if failed unixsocket /var/run/sophie then alert
+.Ve
+.PP
+A Unix socket is used by some servers for fast (interprocess)
+communication on localhost only. A Unix socket is specified by a
+path and in the example above the path, /var/run/sophie,
+specifies a Unix socket.
+.PP
+If your machine answers for several virtual hosts you can prefix
+the port statement with a host-statement like so:
+.PP
+.Vb 3
+\& if failed host www.sol.no port 80 then alert
+\& if failed host 80.69.226.133 port 443 then alert
+\& if failed host kvasir.sol.no port 80 then alert
+.Ve
+.PP
+And as mentioned above, if you do not specify a host-statement,
+\&\fIlocalhost\fR or \fIaddress\fR is assumed.
+.PP
+Monit also knows how to speak some of the more popular Internet
+protocols. So, besides testing for connections, Monit can also
+speak with the server in question to verify that the server
+works. For example, the following is used to test a http server:
+.PP
+.Vb 2
+\& if failed host www.tildeslash.com port 80 proto http 
+\&    then restart
+.Ve
+.PP
+Some protocols also support a request statement. This statement
+can be used to ask the server for a special document entity.
+.PP
+Currently \fBonly\fR the \fI\s-1HTTP\s0\fR protocol module supports the
+request statement, such as:
+.PP
+.Vb 3
+\& if failed host www.myhost.com port 80 protocol http 
+\&    and request "/data/show.php?a=b&c=d"
+\& then restart
+.Ve
+.PP
+The request must contain an \s-1URI\s0 string specifying a document from
+the http server. The string will be \s-1URL\s0 encoded by Monit before
+it sends the request to the http server, so it's okay to use \s-1URL\s0
+unsafe characters in the request. If the request statement isn't
+specified, the default web server page will be requested.
+.PP
+You can override default Host header in \s-1HTTP\s0 request:
+.PP
+.Vb 3
+\& if failed host 192.168.1.100 port 80 protocol http 
+\&    hostheader "example.com"
+\& then alert
+.Ve
+.PP
+You can also test the checksum for documents returned by a http
+server.  You can use either \s-1MD5\s0 sums:
+.PP
+.Vb 4
+\& if failed port 80 protocol http 
+\&    and request "/page.html"
+\&        with checksum 8f7f419955cefa0b33a2ba316cba3659 
+\& then alert
+.Ve
+.PP
+Or you can use \s-1SHA1\s0 sums:
+.PP
+.Vb 4
+\& if failed port 80 protocol http 
+\&    and request "/page.html"
+\&        with checksum e428302e260e0832007d82de853aa8edf19cd872 
+\& then alert
+.Ve
+.PP
+Monit will compute a checksum (either \s-1MD5\s0 or \s-1SHA1\s0 is used,
+depending on length of the hash) for the document (in the above
+case, /page.html) and compare the computed checksum with the
+expected checksum. If the sums does not match then the if-tests
+action is performed, in this case alert. Note that Monit will
+\&\fBnot\fR test the checksum for a document if the server does not
+set the \s-1HTTP\s0 \fIContent-Length\fR header. A \s-1HTTP\s0 server should set
+this header when it server a static document (i.e. a file). A
+server will often use chunked transfer encoding instead when
+serving dynamic content (e.g. a document created by a CGI-script
+or a Servlet), but to test the checksum for dynamic content is
+not very useful. There are no limitation on the document size,
+but keep in mind that Monit will use time to download the
+document over the network so it's probably smart not to ask monit
+to compute a checksum for documents larger than 1Mb or so,
+depending on you network connection of course. Tip; If you get a
+checksum error even if the document has the correct sum, the
+reason may be that the download timed out. In this case, explicit
+set a longer timeout than the default 5 seconds.
+.PP
+As mentioned above, if the server protocol is not supported by
+Monit you can write your own protocol test using send/expect
+strings. Here we show a protocol test using send/expect for an
+imaginary \*(L"Ali Baba and the Forty Thieves\*(R" protocol:
+.PP
+.Vb 6
+\& if failed host cave.persia.ir port 4040
+\&    send "Open, Sesame!\er\en"
+\&    expect "Please enter the cave\er\en"
+\&    send "Shut, Sesame!\er\en"
+\&    expect "See you later [A\-Za\-z ]+\er\en"
+\& then restart
+.Ve
+.PP
+The \fI\s-1TCPSSL\s0\fR statement can optionally test the md5 sum of the
+server's certificate. You must state the md5 certificate string
+you expect the server to deliver and upon a connect to the
+server, the server's actual md5 sum certificate string is tested.
+Any other symbol but [A\-Fa\-f0\-9] is being ignored in that sting.
+Thus it is possible to copy and paste the output of e.g. openssl.
+If they do not match, the connection test fails. If the ssl
+version handshake does not work properly you can also force a
+specific ssl version, as we demonstrate in this example:
+.PP
+.Vb 10
+\& if failed host shop.sol.no port 443 
+\&    type TCPSSL SSLV3 # Force Monit to use ssl version 3
+\&    # We expect the server to return this  md5 certificate sum
+\&    # as either 12\-34\-56\-78\-90\-AB\-CD\-EF\-12\-34\-56\-78\-90\-AB\-CD\-EF
+\&    # or e.g.   1234567890ABCDEF1234567890ABCDEF
+\&    # or e.g.   1234567890abcdef1234567890abcdef
+\&    # what ever come in more handy (see text above)
+\&    CERTMD5 12\-34\-56\-78\-90\-AB\-CD\-EF\-12\-34\-56\-78\-90\-AB\-CD\-EF
+\&    protocol http 
+\& then restart
+.Ve
+.PP
+Here's an example where a connection test is used inside a
+process entry:
+.PP
+.Vb 4
+\& check process apache with pidfile /var/run/apache.pid
+\&       start program = "/etc/init.d/httpd start"
+\&       stop program = "/etc/init.d/httpd stop"
+\&       if failed host www.tildeslash.com port 80 then restart
+.Ve
+.PP
+Here, a connection test is used in a remote host entry:
+.PP
+.Vb 2
+\& check host up2date with address ftp.redhat.com
+\&       if failed port 21 and protocol ftp then alert
+.Ve
+.PP
+Since we did not explicit specify a host in the above test, monit
+will connect to port 21 at ftp.redhat.com. Apropos, the host
+address can be specified as a dotted \s-1IP\s0 address string or as
+hostname in the \s-1DNS\s0. The following is exactly[*] the same test,
+but here an ip address is used instead:
+.PP
+.Vb 2
+\& check host up2date with address 66.187.232.30
+\&       if failed port 21 and protocol ftp then alert
+.Ve
+.PP
+[*] Well, not quite, since we specify an ip-address directly we
+will bypass any \s-1DNS\s0 round-robin setup, but that's another story.
+.PP
+Testing the \s-1SIP\s0 protocol
+.IX Subsection "Testing the SIP protocol"
+.PP
+The \s-1SIP\s0 protocol is used by communication platform servers such
+as Asterisk and FreeSWITCH.
+.PP
+The \s-1SIP\s0 test is similar to the other protocol tests, but in
+addition allows extra optional parameters.
+.IP "\s-1IF\s0 \s-1FAILED\s0 [host] [port] [type] \s-1PROTOCOL\s0 sip [\s-1AND\s0] [\s-1TARGET\s0 valid@uri] [\s-1AND\s0] [\s-1MAXFORWARD\s0 n] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED [host] [port] [type] PROTOCOL sip [AND] [TARGET valid@uri] [AND] [MAXFORWARD n] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\s-1TARGET\s0 : 
+you may specify an alternative recipient for the message,
+by adding a valid sip uri after this keyword.
+.PP
+\&\s-1MAXFORWARD\s0 :
+Limit the number of proxies or gateways that can forward the
+request to the next server. It's value is an integer in the range
+0\-255, set by default to 70. If max-forward = 0, the next server
+may respond 200 \s-1OK\s0 (test succeeded) or send a 483 Too Many Hops
+(test failed)
+.PP
+\&\s-1SIP\s0 examples:
+.PP
+.Vb 4
+\& check host openser_all with address 127.0.0.1
+\&   if failed port 5060 type udp protocol sip 
+\&      with target "localhost:5060" and maxforward 6
+\&   then alert
+.Ve
+.PP
+If sips is supported, that is, sip over ssl, specify tcpssl as
+the connection type.
+.PP
+.Vb 4
+\& check host fwd.pulver.com with address fwd.pulver.com
+\&   if failed port 5060 type tcpssl protocol SIP 
+\&      and target 613@fwd.pulver.com maxforward 10 
+\&   then alert
+.Ve
+.PP
+For more examples, see the example section below.
+.PP
+Testing the \s-1RADIUS\s0 protocol
+.IX Subsection "Testing the RADIUS protocol"
+.PP
+The \s-1RADIUS\s0 test is similar to the other protocol tests, but in
+addition allows extra optional parameters.
+.IP "\s-1IF\s0 \s-1FAILED\s0 [host] [port] [type] \s-1PROTOCOL\s0 radius [\s-1SECRET\s0 string] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF FAILED [host] [port] [type] PROTOCOL radius [SECRET string] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\s-1SECRET:\s0
+you may specify an alternative secret, default is \*(L"testing123\*(R".
+.PP
+\&\s-1RADIUS\s0 example:
+.PP
+.Vb 7
+\& check process radiusd with pidfile /var/run/radiusd.pid
+\&       start program = "/etc/init.d/freeradius start"
+\&       stop program = "/etc/init.d/freeradius stop"
+\&       if failed host 127.0.0.1 port 1812 type udp protocol radius 
+\&           secret testing123 
+\&       then alert
+\&       if 5 restarts within 5 cycles then timeout
+.Ve
+.SS "\s-1PROGRAM\s0 \s-1STATUS\s0 \s-1TESTING\s0"
+.IX Subsection "PROGRAM STATUS TESTING"
+You can check the exit status of a program or a script. This test
+may only be used within a check program service entry in the Monit
+control file.
+.PP
+An example:
+.PP
+.Vb 2
+\& check program myscript with path "/usr/local/bin/myscript.sh"
+\&       if status != 0 then alert
+.Ve
+.PP
+Monit will execute the program periodically and if the exit
+status of the program does not match the expected result, Monit
+can perform an action. In the example above, Monit will raise an
+alert if the exit value of \fImyscript\fR is different from 0. By
+convention, 0 means the program exited normally.
+.PP
+Program checks are asynchronous. Meaning that Monit will not wait
+for the program to exit, but instead, Monit will start the
+program in the background and immediately continue checking the
+next service entry in \fImonitrc\fR. At the next cycle, Monit will
+check if the program has finished and if so, collect the programs
+exit status \- if the status indicate a failure, Monit will raise
+an alert message containing the program's error (stderr) output,
+if any. If the program has not exited after the first cycle,
+Monit will wait another cycle and so on. If the program is still
+running after 5 minutes, Monit will kill it and generate a
+program timeout event. It is possible to override the default
+timeout (see the syntax below).
+.PP
+The asynchronous nature of the program check allows for
+non-blocking behavior in the current Monit design, but it comes
+with a side-effect: when the program has finished executing and
+is waiting for Monit to collect the result, it becomes a
+so-called \*(L"zombie\*(R" process. A zombie process does not consume
+any system resources (only the \s-1PID\s0 remains in use) and it is
+under Monit's control; The zombie process is removed from the
+system as soon as Monit collects the exit status. This means that
+every \*(L"check program\*(R" will be associated with either a running
+process or a temporary zombie. This unwanted zombie side-effect
+will be removed in a later release of Monit.
+.PP
+The syntax of the program status statement is:
+.IP "\s-1IF\s0 \s-1STATUS\s0 operator value [\s-1TIMEOUT\s0 <N> \s-1SECONDS\s0] [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action [\s-1ELSE\s0 \s-1IF\s0 \s-1SUCCEEDED\s0 [[<X>] <Y> \s-1CYCLES\s0] \s-1THEN\s0 action]" 4
+.IX Item "IF STATUS operator value [TIMEOUT <N> SECONDS] [[<X>] <Y> CYCLES] THEN action [ELSE IF SUCCEEDED [[<X>] <Y> CYCLES] THEN action]"
+.PP
+\&\fIoperator\fR is a choice of \*(L"<\*(R",\*(L">\*(R",\*(L"!=\*(R",\*(L"==\*(R" in c notation, \*(L"gt\*(R",
+\&\*(L"lt\*(R", \*(L"eq\*(R", \*(L"ne\*(R" in shell sh notation and \*(L"greater\*(R", \*(L"less\*(R",
+\&\*(L"equal\*(R", \*(L"notequal\*(R" in human readable form (if not specified,
+default is \s-1EQUAL\s0).
+.PP
+\&\fIaction\fR is a choice of \*(L"\s-1ALERT\s0\*(R", \*(L"\s-1RESTART\s0\*(R", \*(L"\s-1START\s0\*(R", \*(L"\s-1STOP\s0\*(R",
+\&\*(L"\s-1EXEC\s0\*(R" or \*(L"\s-1UNMONITOR\s0\*(R".
+.SH "SERVICE POLL TIME"
+.IX Header "SERVICE POLL TIME"
+Services are checked in regular intervals given by the \fIset
+daemon n\fR statement. Checks are performed in the same order as
+they are written in the \fI.monitrc\fR file, except if dependencies
+are setup between services, in which case the services hierarchy
+may alternate the order of the checks.
+.PP
+It is possible to modify the check schedule using the \fIevery\fR
+statement.
+.PP
+There are three variants:
+.IP "1. custom interval based on poll cycle length multiple" 4
+.IX Item "1. custom interval based on poll cycle length multiple"
+.Vb 1
+\&      EVERY [number] CYCLES
+.Ve
+.IP "2. test schedule based on cron-style string" 4
+.IX Item "2. test schedule based on cron-style string"
+.Vb 1
+\&      EVERY [cron]
+.Ve
+.IP "3. do-not-test schedule based on cron-style string" 4
+.IX Item "3. do-not-test schedule based on cron-style string"
+.Vb 1
+\&      NOT EVERY [cron]
+.Ve
+.PP
+A cron-style string, consist of 5 fields separated with
+white-space. All fields are required:
+.PP
+.Vb 7
+\& Name:        | Allowed values:            | Special characters:              
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& Minutes      | 0\-59                       | * \- ,
+\& Hours        | 0\-23                       | * \- ,
+\& Day of month | 1\-31                       | * \- ,
+\& Month        | 1\-12 (1=jan, 12=dec)       | * \- ,
+\& Day of week  | 0\-6 (0=sunday, 6=saturday) | * \- ,
+.Ve
+.PP
+The special characters:
+.PP
+.Vb 10
+\& Character:   | Description:
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& * (asterisk) | The asterisk indicates that the expression will
+\&              | match for all values of the field; e.g., using
+\&              | an asterisk in the 4th field (month) would
+\&              | indicate every month.
+\& \- (hyphen)   | Hyphens are used to define ranges. For example,
+\&              | 8\-9 in the hour field indicate between 8AM and
+\&              | 9AM. Note that range is from time1 until and
+\&              | including time2. That is, from 8AM and until
+\&              | 10AM unless minutes are set. Another example,
+\&              | 1\-5 in the weekday field, specify from monday to
+\&              | friday (including friday).
+\& , (comma)    | Comma are used to specify a sequence. For example
+\&              | 17,18 in the day field indicate the 17th and 18th
+\&              | day of the month. A sequence can also include
+\&              | ranges. For example, using 1\-5,0 in the weekday
+\&              | field indicate monday to friday and sunday.
+.Ve
+.PP
+Example 1: Check once per two cycles
+.PP
+.Vb 2
+\& check process nginx with pidfile /var/run/nginx.pid
+\&   every 2 cycles
+.Ve
+.PP
+Example 2: Check every workday 8AM\-7PM
+.PP
+.Vb 3
+\& check program checkOracleDatabase with
+\&       path /var/monit/programs/checkoracle.pl
+\&   every "* 8\-19 * * 1\-5"
+.Ve
+.PP
+Example 3: Do not run the check in the backup window on 
+Sunday 0AM\-3AM
+.PP
+.Vb 2
+\& check process mysqld with pidfile /var/run/mysqld.pid
+\&   not every "* 0\-3 * * 0"
+.Ve
+.PP
+Limitations:
+.PP
+The current test scheduler is poll cycle based. When Monit starts
+testing and the service test is constraint with the \fIevery cron\fR
+statement, it checks whether the current time match the
+cron-string pattern. If it does, the test is done, otherwise it
+is skipped. The cron specification thus does not guarantee when
+exactly the test will run \- that depends on the default poll time
+and the length of the testing cycle. In other words, we cannot
+guarantee that Monit will run on a specific time. Therefor we
+\&\fBstrongly\fR recommend to use an asterix in the minute field or at
+minimum a range, e..g. 0\-15. \fBNever\fR use a specific minute as
+Monit may not run on that minute.
+.PP
+We will address this limitation in a future release and convert
+the test scheduler from serial polling into a parallel
+non-blocking scheduler where checks are guaranteed to run on time
+and with seconds resolution.
+.SH "MONIT HTTPD"
+.IX Header "MONIT HTTPD"
+If specified in the control file, Monit will start a Monit daemon
+with http support. From a Browser you can then start and stop
+services, disable or enable service monitoring as well as view
+the status of each service. Also, if Monit logs to its own file,
+you can view the content of this logfile in a Browser.
+.PP
+The control file statement for starting a Monit daemon with http
+support is a global set-statement:
+.IP "set httpd port 2812" 4
+.IX Item "set httpd port 2812"
+.PP
+And you can use this \s-1URL\s0, \fIhttp://localhost:2812/\fR, to access
+the daemon from a browser. The port number, in this case 2812,
+can be any number that you are allowed to bind to.
+.PP
+If you have compiled Monit with openssl, you can also start the
+httpd server with ssl support, using the following expression:
+.PP
+.Vb 3
+\& set httpd port 2812
+\&     ssl enable
+\&     pemfile /etc/certs/monit.pem
+.Ve
+.PP
+And you can use this \s-1URL\s0, \fIhttps://localhost:2812/\fR, to access
+the Monit web server over an ssl encrypted connection.
+.PP
+The pemfile, in the example above, holds both the server's
+private key and certificate. This file should be stored in a safe
+place on the filesystem and should have strict permissions, that
+is, no more than 0700.
+.PP
+In addition, if you want to check for client certificates you can
+use the \s-1CLIENTPEMFILE\s0 statement. In this case, a connecting
+client has to provided a certificate known by Monit in order to
+connect. This file also needs to have all necessary \s-1CA\s0
+certificates. A configuration could look like:
+.PP
+.Vb 4
+\& set httpd port 2812
+\&     ssl enable
+\&     pemfile /etc/certs/monit.pem
+\&     clientpemfile /etc/certs/monit\-client.pem
+.Ve
+.PP
+By default self signed client certificates are not allowed. If
+you want to use a self signed certificate from a client it has to
+be allowed explicitly with the \s-1ALLOWSELFCERTIFICATION\s0 statement.
+.PP
+For more information on how to use Monit with \s-1SSL\s0 and for more
+information about certificates and generating pem files, please
+consult the \s-1README\s0.SSL file accompanying the software.
+.PP
+If you only want the http server to accept connect requests to
+one host addresses you can specify the bind address either as an
+\&\s-1IP\s0 number string or as a hostname. In the following example we
+bind the http server to the loopback device. In other words the
+http server will only be reachable from localhost:
+.PP
+.Vb 1
+\&  set httpd port 2812 and use the address 127.0.0.1
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\&  set httpd port 2812 and use the address localhost
+.Ve
+.PP
+If you do not use the \s-1ADDRESS\s0 statement the http server will
+accept connections on any/all local addresses.
+.PP
+It is possible to hide monit's httpd server version, which 
+usually is available in httpd header responses and in error 
+pages.
+.PP
+.Vb 3
+\&  set httpd port 2812
+\&    ...
+\&    signature {enable|disable}
+.Ve
+.PP
+Use \fIdisable\fR to hide the server signature \- Monit will only
+report its name (e.g. 'monit' instead of for example 'monit
+4.2'). By default the version signature is enabled. It is worth
+to stress that this option provides no security advantage and 
+falls into the \*(L"security through obscurity\*(R" category.
+.PP
+If you remove the httpd statement from the config file, monit
+will stop the httpd server on configuration reload. Likewise if
+you change the port number, Monit will restart the http server
+using the new specified port number.
+.PP
+The status page displayed by the Monit web server is
+automatically refreshed with the same poll time set for the monit
+daemon.
+.PP
+\&\fBNote:\fR
+.PP
+We strongly recommend that you start Monit with http support (and
+bind the server to localhost, only, unless you are behind a
+firewall). The built-in web-server is small and does not use much
+resources, and more \fIimportantly\fR, Monit can use the http server
+for interprocess communication between a Monit client and a monit
+daemon.
+.PP
+For instance, you \fImust\fR start a Monit daemon with http support
+if you want to be able to use most of the available console
+commands. I.e. 'Monit stop all', 'Monit start all' etc.
+.PP
+If a Monit daemon is running in the background we will ask the
+daemon (via the \s-1HTTP\s0 protocol) to execute the above commands.
+That is, the daemon is requested to start and stop the services.
+This ensures that a daemon will not restart a service that you
+requested to stop and that (any) timeout lock will be removed
+from a service when you start it.
+.SS "\s-1FIPS\s0 support"
+.IX Subsection "FIPS support"
+Monit built-in web-server supports the OpenSSL \s-1FIPS\s0 module. 
+To enable this mode, your OpenSSL library must first be built
+with \s-1FIPS\s0 support. Then in the Monit control file, simply
+add this \fIset\fR statement at the top;
+.PP
+.Vb 1
+\& set fips
+.Ve
+.PP
+Note that the \s-1FIPS\s0 module may not be supported in the latest
+version of OpenSSL. So make sure that your version of OpenSSL
+support the \s-1FIPS\s0 object module before attempting to enable this
+in Monit.
+.SS "Monit \s-1HTTPD\s0 Authentication"
+.IX Subsection "Monit HTTPD Authentication"
+Monit supports two types of authentication schema's for
+connecting to the httpd server, (three, if you count \s-1SSL\s0 client
+certificate validation). Both schema's can be used together or by
+itself. You \fBmust\fR choose at least one.
+.PP
+Host and network allow list
+.IX Subsection "Host and network allow list"
+.PP
+The http server maintains an access-control list of hosts and
+networks allowed to connect to the server. You can add as many
+hosts as you want to, but only hosts with a valid domain name or
+its \s-1IP\s0 address are allowed. Networks require a network \s-1IP\s0 and a
+netmask to be accepted.
+.PP
+The http server will query a name server to check any hosts
+connecting to the server. If a host (client) is trying to connect
+to the server, but cannot be found in the access list or cannot
+be resolved, the server will shutdown the connection to the
+client promptly.
+.PP
+Control file example:
+.PP
+.Vb 6
+\&  set httpd port 2812
+\&      allow localhost
+\&      allow my.other.work.machine.com
+\&      allow 10.1.1.1
+\&      allow 192.168.1.0/255.255.255.0
+\&      allow 10.0.0.0/8
+.Ve
+.PP
+Clients, not mentioned in the allow list, trying to connect to
+the server are logged with their ip-address.
+.PP
+Basic Authentication
+.IX Subsection "Basic Authentication"
+.PP
+This authentication schema is \s-1HTTP\s0 specific and described in more
+detail in \s-1RFC\s0 2617.
+.PP
+In short; a server challenge a client (e.g. a Browser) to send
+authentication information (username and password) and if
+accepted, the server will allow the client access to the
+requested document.
+.PP
+The biggest weakness with Basic Authentication is that the
+username and password is sent in clear-text (i.e. base64 encoded)
+over the network. It is therefor recommended that you do not use
+this authentication method unless you run the Monit http server
+with \fIssl\fR support. With ssl support it is completely safe to
+use Basic Authentication since \fBall\fR http data, including Basic
+Authentication headers will be encrypted.
+.PP
+Monit will use Basic Authentication if an allow statement
+contains a username and a password separated with a single ':'
+character, like so: \fIallow username:password\fR. The username and
+password must be written in clear-text. Special characters
+can be used but the password has to be quoted.
+.PP
+\&\s-1PAM\s0 is supported as well on platforms which provide \s-1PAM\s0 (such
+as Linux, Mac \s-1OS\s0 X, FreeBSD, NetBSD). The syntax is:
+\&\fIallow \f(CI@mygroup\fI\fR which provides access to the user of group
+called \fImygroup\fR. Monit uses \s-1PAM\s0 service called \fImonit\fR for
+\&\s-1PAM\s0 authentication, see \s-1PAM\s0 manual page for detailed instructions
+how to set the \s-1PAM\s0 service and \s-1PAM\s0 authentication plugins.
+Example Monit \s-1PAM\s0 for Mac \s-1OS\s0 X \- /etc/pam.d/monit:
+.PP
+.Vb 5
+\&  # monit: auth account password session
+\&  auth       sufficient     pam_securityserver.so
+\&  auth       sufficient     pam_unix.so
+\&  auth       required       pam_deny.so
+\&  account    required       pam_permit.so
+.Ve
+.PP
+And configuration part for monitrc which allows only group admins
+authenticated using via \s-1PAM\s0 to access the http interface:
+.PP
+.Vb 1
+\&  set httpd port 2812 allow @admin
+.Ve
+.PP
+Alternatively you can use files in \*(L"htpasswd\*(R" format (one
+user:passwd entry per line), like so: \fIallow
+[cleartext|crypt|md5] /path [users]\fR. By default cleartext
+passwords are read. In case the passwords are digested it is
+necessary to specify the cryptographic method. If you do not want
+all users in the password file to have access to Monit you can
+specify only those users that should have access, in the allow
+statement. Otherwise all users are added.
+.PP
+Example1:
+.PP
+.Vb 3
+\&  set httpd port 2812
+\&      allow hauk:password
+\&      allow md5 /etc/httpd/htpasswd john paul ringo george
+.Ve
+.PP
+If you use this method together with a host list, then only
+clients from the listed hosts will be allowed to connect to the
+Monit http server and each client will be asked to provide a
+username and a password.
+.PP
+Example2:
+.PP
+.Vb 4
+\&  set httpd port 2812
+\&      allow localhost
+\&      allow 10.1.1.1
+\&      allow hauk:"password"
+.Ve
+.PP
+If you only want to use Basic Authentication, then just provide
+allow entries with username and password or password files as in
+example 1 above.
+.PP
+Finally it is possible to define some users as read-only. A
+read-only user can read the Monit web pages but will \fInot\fR get
+access to push-buttons and cannot change a service from the web
+interface.
+.PP
+.Vb 5
+\&  set httpd port 2812
+\&      allow admin:password
+\&      allow hauk:password read\-only
+\&      allow @admins
+\&      allow @users read\-only
+.Ve
+.PP
+A user is set to read-only by using the \fIread-only\fR keyword
+\&\fBafter\fR username:password. In the above example the user \fIhauk\fR
+is defined as a read-only user, while the \fIadmin\fR user has all
+access rights.
+.PP
+If you use Basic Authentication it is a good idea to set the
+access permission for the control file (~/.monitrc) to only
+readable and writable for the user running monit, because the
+password is written in clear-text. (Use this command, /bin/chmod
+600 ~/.monitrc). In fact, since Monit \fBversion 3.0\fR, Monit will
+complain and exit if the control file is readable by others.
+.PP
+Clients trying to connect to the server but supply the wrong
+username and/or password are logged with their ip-address.
+.PP
+If the Monit command line interface is being used, at least one
+cleartext password is necessary. Otherwise, the Monit command
+line interface will not be able to connect to the Monit daemon
+server.
+.SH "DEPENDENCIES"
+.IX Header "DEPENDENCIES"
+If specified in the control file, Monit can do dependency
+checking before start, stop, monitoring or unmonitoring of
+services. The dependency statement may be used within any service
+entries in the Monit control file.
+.PP
+The syntax for the depend statement is simply:
+.IP "\s-1DEPENDS\s0 on service[, service [,...]]" 4
+.IX Item "DEPENDS on service[, service [,...]]"
+.PP
+Where \fBservice\fR is a service entry name, for instance \fBapache\fR
+or \fBdatafs\fR.
+.PP
+You may add more than one service name of any type or use more
+than one depend statement in an entry.
+.PP
+Services specified in a \fIdepend\fR statement will be checked
+during stop/start/monitor/unmonitor operations. If a service is
+stopped or unmonitored it will stop/unmonitor any services that
+depends on itself. Likewise, if a service is started, it will
+first stop any services that depends on itself and after it is
+started, start all depending services again. If the service is to
+be monitored (enable monitoring), all services which this service
+depends on will be monitored before enabling monitoring of this
+service.
+.PP
+Here is an example where we set up an apache service entry to
+depend on the underlying apache binary. If the binary should
+change an alert is sent and apache is not monitored anymore. The
+rationale is security and that Monit should not execute a
+possibly cracked apache binary.
+.PP
+.Vb 7
+\& (1) check process apache 
+\& (2)    with pidfile "/usr/local/apache/logs/httpd.pid"
+\& (3)    ...
+\& (4)    depends on httpd
+\& (5)
+\& (6) check file httpd with path /usr/local/apache/bin/httpd
+\& (7)    if failed checksum then unmonitor
+.Ve
+.PP
+The first entry is the process entry for apache shown before
+(abbreviated for clarity). The fourth line sets up a dependency
+between this entry and the service entry named httpd in line 6. A
+depend tree works as follows, if an action is conducted in a
+lower branch it will propagate upward in the tree and for every
+dependent entry execute the same action. In this case, if the
+checksum should fail in line 7 then an unmonitor action is
+executed and the apache binary is not checked anymore. But since
+the apache process entry depends on the httpd entry this entry
+will also execute the unmonitor action. In short, if the checksum
+test for the httpd binary file should fail, both the check file
+httpd entry and the check process apache entry is set in
+un-monitoring mode.
+.PP
+A dependency tree is a general construct and can be used between
+all types of service entries and span many levels and propagate
+any supported action (except the exec action which will not
+propagate upward in a dependency tree for obvious reasons).
+.PP
+Here is another different example. Consider the following common
+server setup:
+.PP
+.Vb 2
+\&  WEB\-SERVER \-> APPLICATION\-SERVER \-> DATABASE \-> FILESYSTEM
+\&      (a)               (b)             (c)          (d)
+.Ve
+.PP
+You can set dependencies so that the web-server depends on the
+application server to run before the web-server starts and the
+application server depends on the database server and the
+database depends on the file-system to be mounted before it
+starts. See also the example section below for examples using the
+depend statement.
+.PP
+Here we describe how Monit will function with the above
+dependencies:
+.IP "If no servers are running" 4
+.IX Item "If no servers are running"
+Monit will start the servers in the following order: \fId\fR, \fIc\fR,
+\&\fIb\fR, \fIa\fR
+.IP "If all servers are running" 4
+.IX Item "If all servers are running"
+When you run 'Monit stop all' this is the stop order: \fIa\fR, \fIb\fR,
+\&\fIc\fR, \fId\fR. If you run 'Monit stop d' then \fIa\fR, \fIb\fR and \fIc\fR
+are also stopped because they depend on \fId\fR and finally \fId\fR is
+stopped.
+.IP "If \fIa\fR does not run" 4
+.IX Item "If a does not run"
+When Monit runs it will start \fIa\fR
+.IP "If \fIb\fR does not run" 4
+.IX Item "If b does not run"
+When Monit runs it will first stop \fIa\fR then start \fIb\fR and
+finally start \fIa\fR again.
+.IP "If \fIc\fR does not run" 4
+.IX Item "If c does not run"
+When Monit runs it will first stop \fIa\fR and \fIb\fR then start \fIc\fR
+and finally start \fIb\fR then \fIa\fR.
+.IP "If \fId\fR does not run" 4
+.IX Item "If d does not run"
+When Monit runs it will first stop \fIa\fR, \fIb\fR and \fIc\fR then start
+\&\fId\fR and finally start \fIc\fR, \fIb\fR then \fIa\fR.
+.IP "If the control file contains a depend loop." 4
+.IX Item "If the control file contains a depend loop."
+A depend loop is for example; a\->b and b\->a or a\->b\->c\->a.
+.Sp
+When Monit starts it will check for such loops and complain and
+exit if a loop was found. It will also exit with a complaint if a
+depend statement was used that does not point to a service in the
+control file.
+.SH "THE RUN CONTROL FILE"
+.IX Header "THE RUN CONTROL FILE"
+The preferred way to set up Monit is to write a \fI.monitrc\fR file
+in your home directory. When there is a conflict between the
+command-line arguments and the arguments in this file, the
+command-line arguments take precedence. To protect the security
+of your control file and passwords the control file must have
+permissions \fIno more than 0700\fR (u=xrw,g=,o=); Monit will
+complain and exit otherwise.
+.SS "Run Control Syntax"
+.IX Subsection "Run Control Syntax"
+Comments begin with a '#' and extend through the end of the line.
+Otherwise the file consists of a series of service entries or
+global option statements in a free-format, token-oriented syntax.
+.PP
+There are three kinds of tokens: grammar  , numbers (i.e.
+decimal digit sequences) and strings. Strings can be either
+quoted or unquoted. A quoted string is bounded by double quotes
+and may contain whitespace (and quoted digits are treated as a
+string). An unquoted string is any whitespace-delimited token,
+containing characters and/or numbers.
+.PP
+On a semantic level, the control file consists of two types of
+entries:
+.IP "1. Global set-statements" 4
+.IX Item "1. Global set-statements"
+A global set-statement starts with the keyword \fIset\fR and the
+item to configure.
+.IP "2. One or more service entry statements." 4
+.IX Item "2. One or more service entry statements."
+Each service entry consists of the keywords `check', followed by
+the service type. Each entry requires a <unique> descriptive
+name, which may be freely chosen. This name is used by monit
+to refer to the service internally and in all interactions
+with the user.
+.PP
+Currently, eight types of check statements are supported:
+.IP "1. \s-1CHECK\s0 \s-1PROCESS\s0 <unique name> <\s-1PIDFILE\s0 <path> | \s-1MATCHING\s0 <regex>>" 4
+.IX Item "1. CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>"
+<path> is the absolute path to the program's pidfile. If the
+pidfile does not exist or does not contain the pid number of a
+running process, Monit will call the entry's start method if
+defined.
+<regex> is alternative process specification using pattern matching
+to process name (command line) from process table instead of pidfile.
+The first match is used so this form of check is useful for unique
+pattern matching \- the pidfile should be used where possible as it
+defines expected pid exactly (pattern matching won't be useful for
+Apache in most cases for example).
+The pattern can be obtained using \fImonit procmatch \*(L".*\*(R"\fR \s-1CLI\s0 command
+which lists all processes visible to Monit or using the \fIps\fR utility.
+The \*(L"procmatch\*(R" \s-1CLI\s0 command can be used to test your pattern as well.
+If Monit runs in passive mode or the start methods is not defined,
+Monit will just send alerts on errors.
+.IP "2. \s-1CHECK\s0 \s-1FILE\s0 <unique name> \s-1PATH\s0 <path>" 4
+.IX Item "2. CHECK FILE <unique name> PATH <path>"
+<path> is the absolute path to the file. If the file does not
+exist or disappeared, Monit will call the entry's start method if
+defined, if <path> does not point to a regular file type (for
+instance a directory), Monit will disable monitoring of this
+entry. If Monit runs in passive mode or the start methods is not
+defined, Monit will just send alerts on errors.
+.IP "3. \s-1CHECK\s0 \s-1FIFO\s0 <unique name> \s-1PATH\s0 <path>" 4
+.IX Item "3. CHECK FIFO <unique name> PATH <path>"
+<path> is the absolute path to the fifo. If the fifo does not
+exist or disappeared, Monit will call the entry's start method if
+defined, if <path> does not point to a fifo type (for
+instance a directory), Monit will disable monitoring of this
+entry. If Monit runs in passive mode or the start methods is not
+defined, Monit will just send alerts on errors.
+.IP "4. \s-1CHECK\s0 \s-1FILESYSTEM\s0 <unique name> \s-1PATH\s0 <path>" 4
+.IX Item "4. CHECK FILESYSTEM <unique name> PATH <path>"
+<path> is the path to the filesystem block special device, mount point,
+file or a directory which is part of a filesystem. It is
+recommended to use a block special file directly (for example
+/dev/hda1 on Linux or /dev/dsk/c0t0d0s1 on Solaris, etc.) If you
+use a mount point (for example /data), be careful, because if the
+filesystem is unmounted the test will still be true because the mount
+point exist.
+.Sp
+If the filesystem becomes unavailable, Monit will call the entry's
+start method if defined. if <path> does not point to a filesystem,
+Monit will disable monitoring of this entry. If Monit runs in
+passive mode or the start methods is not defined, Monit will just
+send alerts on errors.
+.IP "5. \s-1CHECK\s0 \s-1DIRECTORY\s0 <unique name> \s-1PATH\s0 <path>" 4
+.IX Item "5. CHECK DIRECTORY <unique name> PATH <path>"
+<path> is the absolute path to the directory. If the directory
+does not exist or disappeared, Monit will call the entry's start
+method if defined, if <path> does not point to a directory, monit
+will disable monitoring of this entry. If Monit runs in passive
+mode or the start methods is not defined, Monit will just send
+alerts on errors.
+.IP "6. \s-1CHECK\s0 \s-1HOST\s0 <unique name> \s-1ADDRESS\s0 <host address>" 4
+.IX Item "6. CHECK HOST <unique name> ADDRESS <host address>"
+The host address can be specified as a hostname string or as an
+ip-address string on a dotted decimal format. Such as,
+tildeslash.com or \*(L"64.87.72.95\*(R".
+.IP "7. \s-1CHECK\s0 \s-1SYSTEM\s0 <unique name>" 4
+.IX Item "7. CHECK SYSTEM <unique name>"
+The system name is usually hostname, but any descriptive name can be
+used. This test allows one to check general system resources such as
+\&\s-1CPU\s0 usage (percent of time spent in user, system and wait), total
+memory usage or load average.
+.IP "8. \s-1CHECK\s0 \s-1PROGRAM\s0 <unique name> \s-1PATH\s0 <executable file>" 4
+.IX Item "8. CHECK PROGRAM <unique name> PATH <executable file>"
+<path> is the absolute path to the executable program or script.
+The \fIstatus\fR test allows to check the program's exit status.
+.PP
+You can use noise keywords like 'if', `and', `with(in)', `has',
+`using', 'use', 'on(ly)', `usage' and `program(s)' anywhere in an
+entry to make it resemble English. They're ignored, but can make
+entries much easier to read at a glance. The punctuation
+characters ';' ',' and '=' are also ignored. Keywords are case
+insensitive.
+.PP
+.Vb 1
+\& Here are the legal global keywords:
+\&
+\& Keyword         Function
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& set daemon      Set a background poll interval in seconds.
+\& set init        Set Monit to run from init. Monit will not
+\&                 transform itself into a daemon process.
+\& set logfile     Name of a file to dump error\- and status\-
+\&                 messages to. If syslog is specified as the 
+\&                 file, Monit will utilize the syslog daemon
+\&                 to log messages. This can optionally be 
+\&                 followed by \*(Aqfacility <facility>\*(Aq where 
+\&                 facility is \*(Aqlog_local0\*(Aq \- \*(Aqlog_local7\*(Aq or 
+\&                 \*(Aqlog_daemon\*(Aq. If no facility is specified, 
+\&                 LOG_USER is used.
+\& set mailserver  The mailserver used for sending alert
+\&                 notifications. If the mailserver is not 
+\&                 defined, Monit will try to use \*(Aqlocalhost\*(Aq 
+\&                 as the smtp\-server for sending mail. You 
+\&                 can add more mail servers, if Monit cannot
+\&                 connect to the first server it will try the
+\&                 next server and so on.
+\& set mail\-format Set a global mail format for all alert
+\&                 messages emitted by monit.
+\& set idfile      Explicit set the location of the Monit id
+\&                 file. E.g. set idfile /var/monit/id.
+\& set pidfile     Explicit set the location of the Monit lock
+\&                 file. E.g. set pidfile /var/run/xyzmonit.pid.
+\& set statefile   Explicit set the location of the file Monit 
+\&                 will write state data to. If not set, the
+\&                 default is $HOME/.monit.state. 
+\& set httpd port  Activates Monit http server at the given 
+\&                 port number.
+\& ssl enable      Enables ssl support for the httpd server.
+\&                 Requires the use of the pemfile statement.
+\& ssl disable     Disables ssl support for the httpd server.
+\&                 It is equal to omitting any ssl statement.
+\& pemfile         Set the pemfile to be used with ssl.
+\& clientpemfile   Set the pemfile to be used when client
+\&                 certificates should be checked by monit.
+\& address         If specified, the http server will only 
+\&                 accept connect requests to this addresses
+\&                 This statement is an optional part of the
+\&                 set httpd statement.
+\& allow           Specifies a host or IP address allowed to
+\&                 connect to the http server. Can also specify
+\&                 a username and password allowed to connect
+\&                 to the server. More than one allow statement
+\&                 are allowed. This statement is also an 
+\&                 optional part of the set httpd statement.
+\& read\-only       Set the user defined in username:password
+\&                 to read only. A read\-only user cannot change
+\&                 a service from the Monit web interface.
+\& include         include a file or files matching the globstring
+\&
+\& Here are the legal service entry keywords:
+\&
+\& Keyword         Function
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& check           Starts an entry and must be followed by the type
+\&                 of monitored service {filesystem|directory|file|host
+\&                 process|system|program} and a descriptive name for
+\&                 the service.
+\& pidfile         Specify the  process pidfile. Every
+\&                 process must create a pidfile with its
+\&                 current process id. This statement should only
+\&                 be used in a process service entry.
+\& path            Must be followed by a path to the block
+\&                 special file for filesystem, regular
+\&                 file, directory or a process\*(Aqs pidfile.
+\& group           Specify a groupname for a service entry.
+\& start           The program used to start the specified 
+\&                 service. Full path is required. This 
+\&                 statement is optional, but recommended.
+\& stop            The program used to stop the specified
+\&                 service. Full path is required. This 
+\&                 statement is optional, but recommended.
+\& pid and ppid    These keywords may be used as standalone
+\&                 statements in a process service entry to
+\&                 override the alert action for change of
+\&                 process pid and ppid.
+\& uid and gid     These keywords are either 1) an optional part of
+\&                 a start, stop or exec statement. They may be
+\&                 used to specify a user id and a group id the
+\&                 program (process) should switch to upon start.
+\&                 This feature can only be used if the superuser
+\&                 is running monit. 2) uid and gid may also be
+\&                 used as standalone statements in a file service
+\&                 entry to test a file\*(Aqs uid and gid attributes.
+\& host            The hostname or IP address to test the port
+\&                 at. This keyword can only be used together
+\&                 with a port statement or in the check host
+\&                 statement.
+\& port            Specify a TCP/IP service port number which 
+\&                 a process is listening on. This statement
+\&                 is also optional. If this statement is not
+\&                 prefixed with a host\-statement, localhost is
+\&                 used as the hostname to test the port at.
+\& type            Specifies the socket type Monit should use when
+\&                 testing a connection to a port. If the type
+\&                 keyword is omitted, tcp is used. This keyword
+\&                 must be followed by either tcp, udp or tcpssl.
+\& tcp             Specifies that Monit should use a TCP 
+\&                 socket type (stream) when testing a port.
+\& tcpssl          Specifies that Monit should use a TCP socket
+\&                 type (stream) and the secure socket layer (ssl)
+\&                 when testing a port connection.
+\& udp             Specifies that Monit should use a UDP socket
+\&                 type (datagram) when testing a port.
+\& certmd5         The md5 sum of a certificate a ssl forged 
+\&                 server has to deliver.
+\& proto(col)      This keyword specifies the type of service 
+\&                 found at the port. See CONNECTION TESTING
+\&                 for list of supported protocols.
+\&                 You\*(Aqre welcome to write new protocol test
+\&                 modules. If no protocol is specified Monit will
+\&                 use a default test which in most cases are good
+\&                 enough.
+\& request         Specifies a server request and must come
+\&                 after the protocol keyword mentioned above.
+\&                  \- for http it can contain an URL and an
+\&                    optional query string.
+\&                  \- other protocols does not support this
+\&                    statement yet
+\& send/expect     These keywords specify a generic protocol. 
+\&                 Both require a string whether to be sent or
+\&                 to be matched against (as extended regex if 
+\&                 supported).  Send/expect can not be used 
+\&                 together with the proto(col) statement.
+\& unix(socket)    Specifies a Unix socket file and used like 
+\&                 the port statement above to test a Unix 
+\&                 domain network socket connection.
+\& URL             Specify an URL string which Monit will use for
+\&                 connection testing.
+\& content         Optional sub\-statement for the URL statement.
+\&                 Specifies that Monit should test the content
+\&                 returned by the server against a regular 
+\&                 expression.
+\& timeout x sec.  Define a network port connection timeout. Must
+\&                 be followed by a number in seconds and the 
+\&                 keyword, seconds.
+\& timeout         Define a service timeout. Must be followed by
+\&                 two digits. The first digit is max number of
+\&                 restarts for the service. The second digit
+\&                 is the cycle interval to test restarts. 
+\&                 This statement is optional.
+\& alert           Specifies an email address for notification
+\&                 if a service event occurs. Alert can also
+\&                 be postfixed, to only send a message for
+\&                 certain events. See the examples above. More
+\&                 than one alert statement is allowed in an
+\&                 entry. This statement is also optional.
+\& noalert         Specifies an email address which don\*(Aqt want
+\&                 to receive alerts. This statement is also
+\&                 optional.
+\& restart, stop   These keywords may be used as actions for 
+\& unmonitor,      various test statements. The exec statement is
+\& start and       special in that it requires a following string
+\& exec            specifying the program to be execute. You may
+\&                 also specify an UID and GID for the exec 
+\&                 statement. The program executed will then run
+\&                 using the specified user id and group id.
+\& mail\-format     Specifies a mail format for an alert message 
+\&                 This statement is an optional part of the
+\&                 alert statement.
+\& checksum        Specify that Monit should compute and monitor a
+\&                 file\*(Aqs md5/sha1 checksum. May only be used in a 
+\&                 check file entry.
+\& expect          Specifies a md5/sha1 checksum string Monit 
+\&                 should expect when testing the checksum. This 
+\&                 statement is an optional part of the checksum 
+\&                 statement.
+\& timestamp       Specifies an expected timestamp for a file
+\&                 or directory. More than one timestamp statement
+\&                 are allowed. May only be used in a check file or
+\&                 check directory entry.
+\& changed         Part of a timestamp statement and used as an
+\&                 operator to simply test for a timestamp change.
+\& every           Validate this entry only at every n poll cycle
+\&                 or per cron specification. Useful in daemon mode
+\&                 when the cycle is short and a service takes some
+\&                 time to start or to suppress monitoring during
+\&                 backup windows.
+\& mode            Must be followed either by the keyword active,
+\&                 passive or manual. If active, Monit will restart
+\&                 the service if it is not running (this is the
+\&                 default behavior). If passive, Monit will not
+\&                 (re)start the service if it is not running \- it
+\&                 will only monitor and send alerts (resource
+\&                 related restart and stop options are ignored
+\&                 in this mode also). If manual, Monit will enter
+\&                 active mode only if a service was started under
+\&                 monit\*(Aqs control otherwise the service isn\*(Aqt
+\&                 monitored.
+\& cpu             Must be followed by a compare operator, a number 
+\&                 with "%" and an action. This statement is used
+\&                 to check the cpu usage in percent of a process
+\&                 with its children over a number of cycles. If
+\&                 the compare expression matches then the 
+\&                 specified action is executed.
+\& mem             The equivalent to the cpu token for memory of a 
+\&                 process (w/o children!).  This token must be 
+\&                 followed by a compare operator a number with 
+\&                 unit {B|KB|MB|GB|%|byte|kilobyte|megabyte|
+\&                 gigabyte|percent} and an action.
+\& swap            Token for system swap usage monitoring. This token
+\&                 must be followed by a compare operator a number with 
+\&                 unit {B|KB|MB|GB|%|byte|kilobyte|megabyte|gigabyte|percent}
+\&                 and an action.
+\& loadavg         Must be followed by [1min,5min,15min] in (), a 
+\&                 compare operator, a number and an action. This
+\&                 statement is used to check the system load 
+\&                 average over a number of cycles. If the compare 
+\&                 expression matches then the specified action is 
+\&                 executed.
+\& children        This is the number of child processes spawn by a
+\&                 process. The syntax is the same as above.
+\& totalmem        The equivalent of mem, except totalmem is an
+\&                 aggregation of memory, not only used by a
+\&                 process but also by all its child
+\&                 processes. The syntax is the same as above.
+\& space           Must be followed by a compare operator, a
+\&                 number, unit {B|KB|MB|GB|%|byte|kilobyte|
+\&                 megabyte|gigabyte|percent} and an action.
+\& inode(s)        Must be followed by a compare operator, integer
+\&                 number, optionally by percent sign (if not, the
+\&                 limit is absolute) and an action.
+\& perm(ission)    Must be followed by an octal number describing
+\&                 the permissions.
+\& size            Must be followed by a compare operator, a
+\&                 number, unit {B|KB|MB|GB|byte|kilobyte|
+\&                 megabyte|gigabyte} and an action.
+\& uptime          Must be followed by a compare operator, a
+\&                 number, unit {second(s)|minute(s)|hour(s)|day(s)}
+\&                 and an action.
+\& depends (on)    Must be followed by the name of a service this
+\&                 service depends on.
+.Ve
+.PP
+Here's the complete list of reserved \fBkeywords\fR used by monit:
+.PP
+\&\fIif\fR, \fIthen\fR, \fIelse\fR, \fIset\fR, \fIdaemon\fR, \fIlogfile\fR,
+\&\fIsyslog\fR, \fIaddress\fR, \fIhttpd\fR, \fIssl\fR, \fIenable\fR, \fIdisable\fR,
+\&\fIpemfile\fR, \fIallow\fR, \fIread-only\fR, \fIcheck\fR, \fIinit\fR, \fIcount\fR,
+\&\fIpidfile\fR, \fIstatefile\fR, \fIgroup\fR, \fIstart\fR, \fIstop\fR, \fIuid\fR,
+\&\fIgid\fR, \fIconnection\fR, \fIport(number)\fR, \fIunix(socket)\fR, \fItype\fR,
+\&\fIproto(col)\fR, \fItcp\fR, \fItcpssl\fR, \fIudp\fR, \fIalert\fR, \fInoalert\fR,
+\&\fImail-format\fR, \fIrestart\fR, \fItimeout\fR, \fIchecksum\fR, \fIresource\fR,
+\&\fIexpect\fR, \fIsend\fR, \fImailserver\fR, \fIevery\fR, \fImode\fR, \fIactive\fR,
+\&\fIpassive\fR, \fImanual\fR, \fIdepends\fR, \fIhost\fR, \fIdefault\fR, \fIhttp\fR,
+\&\fIftp\fR, \fIsmtp\fR, \fIpop\fR, \fIntp3\fR, \fInntp\fR, \fIimap\fR, \fIclamav\fR, 
+\&\fIssh\fR, \fIdwp\fR, \fIldap2\fR, \fIldap3\fR, \fItns\fR, \fIrequest\fR, \fIcpu\fR, 
+\&\fImem\fR, \fItotalmem\fR, \fIswap\fR, \fIchildren\fR, \fIloadavg\fR, \fItimestamp\fR, 
+\&\fIchanged\fR, \fIsecond(s)\fR, \fIminute(s)\fR, \fIhour(s)\fR, \fIday(s)\fR, 
+\&\fIspace\fR, \fIinode\fR, \fIpid\fR, \fIppid\fR, \fIperm(ission)\fR, \fIicmp\fR,
+\&\fIprocess\fR, \fIfile\fR, \fIdirectory\fR, \fIfilesystem\fR, \fIsize\fR, \fIaction\fR,
+\&\fIunmonitor\fR, \fIrdate\fR, \fIrsync\fR, \fIdata\fR, \fIinvalid\fR, \fIexec\fR,
+\&\fInonexist\fR, \fIpolicy\fR, \fIreminder\fR, \fIinstance\fR, \fIeventqueue\fR,
+\&\fIbasedir\fR, \fIslot(s)\fR, \fIsystem\fR, \fIidfile\fR, \fIgps\fR, \fIradius\fR,
+\&\fIsecret\fR, \fItarget\fR, \fImaxforward\fR, \fIhostheader\fR, \fIregister\fR,
+\&\fIcredentials\fR, \fIfips\fR, \fIstatus\fR, \fIuptime\fR and \fIfailed\fR
+.PP
+And here is a complete list of \fBnoise keywords\fR ignored by
+monit:
+.PP
+\&\fIis\fR, \fIas\fR, \fIare\fR, \fIon(ly)\fR, \fIwith(in|out)\fR, \fIand\fR, \fIhas\fR,
+\&\fIusing\fR, \fIuse\fR, \fIthe\fR, \fIsum\fR, \fIprogram(s)\fR, \fIthan\fR, \fIfor\fR,
+\&\fIusage\fR, \fIwas\fR, \fIbut\fR, \fIof\fR.
+.PP
+\&\fBNote:\fR If the \fIstart\fR or \fIstop\fR programs are shell scripts,
+then the script must begin with \f(CW\*(C`#!\*(C'\fR and the remainder of the
+first line must specify an interpreter for the program. E.g.
+\&\f(CW\*(C`#!/bin/sh\*(C'\fR
+.PP
+It's possible to write scripts directly into the \fIstart\fR and
+\&\fIstop\fR entries by using a string of shell-commands. Like so:
+.PP
+.Vb 2
+\& start="/bin/bash \-c \*(Aqecho $$ > pidfile; exec program\*(Aq"
+\& stop="/bin/bash \-c \*(Aqkill \-s SIGTERM \`cat pidfile\`\*(Aq"
+.Ve
+.SS "\s-1CONFIGURATION\s0 \s-1EXAMPLES\s0"
+.IX Subsection "CONFIGURATION EXAMPLES"
+The simplest form is just the check statement. In this example we
+check to see if the server is running and log a message if not:
+.PP
+.Vb 1
+\& check process resin with pidfile /usr/local/resin/srun.pid
+.Ve
+.PP
+Checking process without pidfile:
+.PP
+.Vb 1
+\& check process pager matching "/sbin/dynamic_pager \-F /private/var/vm/swapfile"
+.Ve
+.PP
+To have Monit start the server if it's not running, add a start
+statement:
+.PP
+.Vb 3
+\& check process resin with pidfile /usr/local/resin/srun.pid
+\&       start program = "/usr/local/resin/bin/srun.sh start"
+\&       stop program = "/usr/local/resin/bin/srun.sh stop"
+.Ve
+.PP
+Here's a more advanced example for monitoring an apache
+web-server listening on the default port number for \s-1HTTP\s0 and
+\&\s-1HTTPS\s0. In this example Monit will restart apache if it's not
+accepting connections at the port numbers. The method Monit use
+for a process restart is to first execute the stop-program, wait
+up to 30s for the process to stop and then execute the start-program
+and wait up to 30s for it to start. The length of start or stop
+timeout can be overridden using the 'timeout' option. If Monit was
+unable to stop or start the service a failed alert message will
+be sent if you have requested alert messages to be sent.
+.PP
+.Vb 5
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start program = "/etc/init.d/httpd start" with timeout 60 seconds
+\&       stop program  = "/etc/init.d/httpd stop"
+\&       if failed port 80 then restart
+\&       if failed port 443 with timeout 15 seconds then restart
+.Ve
+.PP
+This example demonstrate how you can run a program as a specified
+user (uid) and with a specified group (gid). Many daemon programs
+will do the uid and gid switch by them self, but for those
+programs that does not (e.g. Java programs), monit's ability to
+start a program as a certain user can be very useful. In this
+example we start the Tomcat Java Servlet Engine as the standard
+\&\fInobody\fR user and group. Please note that Monit will only switch
+uid and gid for a program if the super-user is running monit,
+otherwise Monit will simply ignore the request to change uid and
+gid.
+.PP
+.Vb 7
+\& check process tomcat with pidfile /var/run/tomcat.pid
+\&       start program = "/etc/init.d/tomcat start" 
+\&             as uid nobody and gid nobody
+\&       stop program  = "/etc/init.d/tomcat stop"
+\&             # You can also use id numbers instead and write:
+\&             as uid 99 and with gid 99
+\&       if failed port 8080 then alert
+.Ve
+.PP
+In this example we use udp for connection testing to check if the
+name-server is running and also use timeout and alert:
+.PP
+.Vb 5
+\& check process named with pidfile /var/run/named.pid
+\&       start program = "/etc/init.d/named start"
+\&       stop program  = "/etc/init.d/named stop"
+\&       if failed port 53 use type udp protocol dns then restart
+\&       if 3 restarts within 5 cycles then timeout
+.Ve
+.PP
+The following example illustrates how to check if the service
+\&'sophie' is answering connections on its Unix domain socket:
+.PP
+.Vb 4
+\& check process sophie with pidfile /var/run/sophie.pid
+\&       start program = "/etc/init.d/sophie start"
+\&       stop  program = "/etc/init.d/sophie stop"
+\&       if failed unix /var/run/sophie then restart
+.Ve
+.PP
+In this example we check an apache web-server running on
+localhost that answers for several IP-based virtual hosts or
+vhosts, hence the host statement before port:
+.PP
+.Vb 7
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start "/etc/init.d/httpd start"
+\&       stop  "/etc/init.d/httpd stop"
+\&       if failed host www.sol.no port 80 then alert
+\&       if failed host shop.sol.no port 443 then alert
+\&       if failed host chat.sol.no port 80 then alert
+\&       if failed host www.tildeslash.com port 80 then alert
+.Ve
+.PP
+To make sure that Monit is communicating with a http server a
+protocol test can be added:
+.PP
+.Vb 6
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start "/etc/init.d/httpd start"
+\&       stop  "/etc/init.d/httpd stop"
+\&       if failed host www.sol.no port 80 
+\&          protocol HTTP
+\&          then alert
+.Ve
+.PP
+This example shows a different way to check a webserver using
+the send/expect mechanism:
+.PP
+.Vb 7
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start "/etc/init.d/httpd start"
+\&       stop  "/etc/init.d/httpd stop"
+\&       if failed host www.sol.no port 80 
+\&          send "GET / HTTP/1.0\er\enHost: www.sol.no\er\en\er\en"
+\&          expect "HTTP/[0\-9\e.]{3} 200 .*\er\en"
+\&          then alert
+.Ve
+.PP
+To make sure that Apache is logging successfully (i.e. no more 
+than 60 percent of child servers are logging), use its mod_status
+page at www.sol.no/server\-status with this special protocol test:
+.PP
+.Vb 5
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start "/etc/init.d/httpd start"
+\&       stop  "/etc/init.d/httpd stop"
+\&       if failed host www.sol.no port 80
+\&       protocol apache\-status loglimit > 60% then restart
+.Ve
+.PP
+This configuration can be used to alert you if 25 percent or more
+of Apache child processes are stuck performing \s-1DNS\s0 lookups:
+.PP
+.Vb 5
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start "/etc/init.d/httpd start"
+\&       stop  "/etc/init.d/httpd stop"
+\&       if failed host www.sol.no port 80
+\&       protocol apache\-status dnslimit > 25% then alert
+.Ve
+.PP
+Here we use an icmp ping test to check if a remote host is up and
+if not send an alert:
+.PP
+.Vb 3
+\& check host www.tildeslash.com with address www.tildeslash.com
+\&       if failed icmp type echo count 5 with timeout 15 seconds
+\&          then alert
+.Ve
+.PP
+In the following example we ask Monit to compute and verify the
+checksum for the underlying apache binary used by the start and
+stop programs. If the the checksum test should fail, monitoring
+will be disabled to prevent possibly starting a compromised
+binary:
+.PP
+.Vb 5
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start program = "/etc/init.d/httpd start"
+\&       stop program  = "/etc/init.d/httpd stop"
+\&       if failed host www.tildeslash.com port 80 then restart
+\&       depends on apache_bin
+\&
+\& check file apache_bin with path /usr/local/apache/bin/httpd
+\&       if failed checksum then unmonitor
+.Ve
+.PP
+In this example we ask Monit to test the checksum for a document
+on a remote server. If the checksum was changed we send an alert:
+.PP
+.Vb 5
+\& check host tildeslash with address www.tildeslash.com
+\&       if failed port 80 protocol http 
+\&          and request "/monit/dist/monit\-4.0.tar.gz"
+\&              with checksum f9d26b8393736b5dfad837bb13780786
+\&       then alert
+.Ve
+.PP
+Here are a couple of tests for some popular communication
+servers, using the \s-1SIP\s0 protocol. First we test a FreeSWITCH
+server and then an Asterisk server
+.PP
+.Vb 12
+\& check process freeswitch 
+\&    with pidfile /usr/local/freeswitch/log/freeswitch.pid
+\&  start program = a\*^XX/usr/local/freeswitch/bin/freeswitch \-nc \-hpa\*^XX
+\&  stop program = a\*^XX/usr/local/freeswitch/bin/freeswitch \-stopa\*^XX
+\&  if totalmem > 1000.0 MB for 5 cycles then alert
+\&  if totalmem > 1500.0 MB for 5 cycles then alert
+\&  if totalmem > 2000.0 MB for 5 cycles then restart
+\&  if cpu > 60% for 5 cycles then alert
+\&  if failed port 5060 type udp protocol SIP 
+\&     target me@foo.bar and maxforward 10 
+\&  then restart
+\&  if 5 restarts within 5 cycles then timeout
+\&
+\& check process asterisk 
+\&   with pidfile /var/run/asterisk/asterisk.pid
+\&   start program = a\*^XX/usr/sbin/asteriska\*^XX
+\&   stop program = a\*^XX/usr/sbin/asterisk \-r \-x a\*^XXshutdown nowa\*^XXa\*^XX
+\&   if totalmem > 1000.0 MB for 5 cycles then alert
+\&   if totalmem > 1500.0 MB for 5 cycles then alert
+\&   if totalmem > 2000.0 MB for 5 cycles then restart
+\&   if cpu > 60% for 5 cycles then alert
+\&   if failed port 5060 type udp protocol SIP 
+\&     and target me@foo.bar maxforward 10 
+\&   then restart
+\&   if 5 restarts within 5 cycles then timeout
+.Ve
+.PP
+Some servers are slow starters, like for example Java based
+Application Servers. So if we want to keep the poll-cycle low
+(i.e. < 60 seconds) but allow some services to take its time to
+start, the \fBevery\fR statement is handy:
+.PP
+.Vb 4
+\& check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
+\&       start program = "/etc/init.d/dynamo start"
+\&       stop program  = "/etc/init.d/dynamo stop"
+\&       if failed port 8840 then alert
+.Ve
+.PP
+Here is an example where we group together two database entries
+so you can manage them together, e.g.; 'Monit \-g database start
+all'. The mode statement is also illustrated in the first entry
+and have the effect that Monit will not try to (re)start this
+service if it is not running:
+.PP
+.Vb 5
+\& check process sybase with pidfile /var/run/sybase.pid
+\&       start = "/etc/init.d/sybase start"
+\&       stop  = "/etc/init.d/sybase stop"
+\&       mode passive
+\&       group database
+\&
+\& check process oracle with pidfile /var/run/oracle.pid
+\&       start program = "/etc/init.d/oracle start"
+\&       stop program  = "/etc/init.d/oracle stop"
+\&       mode active # Not necessary really, since it\*(Aqs the default
+\&       if failed port 9001 then restart
+\&       group database
+.Ve
+.PP
+Here is an example to show the usage of the resource checks. It
+will send an alert when the \s-1CPU\s0 usage of the http daemon and its
+child processes raises beyond 60% for over two cycles. Apache is
+restarted if the \s-1CPU\s0 usage is over 80% for five cycles or the
+memory usage over 100Mb for five cycles or if the machines load
+average is more than 10 for 8 cycles:
+.PP
+.Vb 8
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start program = "/etc/init.d/httpd start"
+\&       stop program  = "/etc/init.d/httpd stop"
+\&       if cpu > 40% for 2 cycles then alert
+\&       if totalcpu > 60% for 2 cycles then alert
+\&       if totalcpu > 80% for 5 cycles then restart
+\&       if mem > 100 MB for 5 cycles then stop
+\&       if loadavg(5min) greater than 10.0 for 8 cycles then stop
+.Ve
+.PP
+This examples demonstrate the timestamp statement with exec and
+how you may restart apache if its configuration file was
+changed.
+.PP
+.Vb 3
+\& check file httpd.conf with path /etc/httpd/httpd.conf
+\&       if changed timestamp
+\&          then exec "/etc/init.d/httpd graceful"
+.Ve
+.PP
+In this example we demonstrate usage of the extended alert
+statement and a file check dependency:
+.PP
+.Vb 10
+\& check process apache with pidfile /var/run/httpd.pid
+\&      start = "/etc/init.d/httpd start"
+\&      stop  = "/etc/init.d/httpd stop"
+\&      alert admin@bar on {nonexist, timeout} 
+\&        with mail\-format { 
+\&              from:     bofh@$HOST
+\&              subject:  apache $EVENT \- $ACTION
+\&              message:  This event occurred on $HOST at $DATE. 
+\&              Your faithful employee,
+\&              monit
+\&      }
+\&      if failed host www.tildeslash.com  port 80 then restart
+\&      if 3 restarts within 5 cycles then timeout
+\&      depend httpd_bin
+\&      group apache
+\&
+\& check file httpd_bin with path /usr/local/apache/bin/httpd
+\&       alert security@bar on {checksum, timestamp, 
+\&                  permission, uid, gid}
+\&             with mail\-format {subject: Alaaarrm! on $HOST}
+\&       if failed checksum 
+\&          and expect 8f7f419955cefa0b33a2ba316cba3659
+\&              then unmonitor
+\&       if failed permission 755 then unmonitor
+\&       if failed uid root then unmonitor
+\&       if failed gid root then unmonitor
+\&       if changed timestamp then alert
+\&       group apache
+.Ve
+.PP
+In this example, we demonstrate usage of the depend statement. In
+this case, we want to start oracle and apache. However, we've set
+up apache to use oracle as a back end, and if oracle is
+restarted, apache must be restarted as well.
+.PP
+.Vb 4
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start = "/etc/init.d/httpd start"
+\&       stop  = "/etc/init.d/httpd stop"
+\&       depends on oracle
+\&
+\& check process oracle with pidfile /var/run/oracle.pid
+\&       start = "/etc/init.d/oracle start"
+\&       stop  = "/etc/init.d/oracle stop"
+\&       if failed port 9001 then restart
+.Ve
+.PP
+Next, we have 2 services, oracle-import and oracle-export that
+need to be restarted if oracle is restarted, but are independent
+of each other.
+.PP
+.Vb 4
+\& check process oracle with pidfile /var/run/oracle.pid
+\&       start = "/etc/init.d/oracle start"
+\&       stop  = "/etc/init.d/oracle stop"
+\&       if failed port 9001 then restart
+\&
+\& check process oracle\-import 
+\&      with pidfile /var/run/oracle\-import.pid
+\&       start = "/etc/init.d/oracle\-import start"
+\&       stop  = "/etc/init.d/oracle\-import stop"
+\&       depends on oracle
+\&
+\& check process oracle\-export 
+\&      with pidfile /var/run/oracle\-export.pid
+\&       start = "/etc/init.d/oracle\-export start"
+\&       stop  = "/etc/init.d/oracle\-export stop"
+\&       depends on oracle
+.Ve
+.PP
+Finally an example with all statements:
+.PP
+.Vb 10
+\& check process apache with pidfile /var/run/httpd.pid
+\&       start program = "/etc/init.d/httpd start"
+\&       stop program  = "/etc/init.d/httpd stop"
+\&       if 3 restarts within 5 cycles then timeout
+\&       if failed host www.sol.no  port 80 protocol http
+\&          and use the request "/login.cgi"
+\&              then alert
+\&       if failed host shop.sol.no port 443 type tcpssl 
+\&          protocol http and with timeout 15 seconds 
+\&              then restart
+\&       if cpu is greater than 60% for 2 cycles then alert
+\&       if cpu > 80% for 5 cycles then restart
+\&       if totalmem > 100 MB then stop
+\&       if children > 200 then alert
+\&       alert bofh@bar with mail\-format {from: monit@foo.bar.no}
+\&       every 2 cycles
+\&       mode active
+\&       depends on weblogic
+\&       depends on httpd.pid
+\&       depends on httpd.conf
+\&       depends on httpd_bin
+\&       depends on datafs
+\&       group server
+\&
+\& check file httpd.pid with path /usr/local/apache/logs/httpd.pid
+\&       group server
+\&       if timestamp > 7 days then restart
+\&       every 2 cycles
+\&       alert bofh@bar with mail\-format {from: monit@foo.bar.no}
+\&       depends on datafs
+\&
+\& check file httpd.conf with path /etc/httpd/httpd.conf
+\&       group server
+\&       if timestamp was changed 
+\&          then exec "/usr/local/apache/bin/apachectl graceful"
+\&       every 2 cycles
+\&       alert bofh@bar with mail\-format {from: monit@foo.bar.no}
+\&       depends on datafs
+\&
+\& check file httpd_bin with path /usr/local/apache/bin/httpd
+\&       group server
+\&       if failed checksum and expect the sum
+\&          8f7f419955cefa0b33a2ba316cba3659 then unmonitor
+\&       if failed permission 755 then unmonitor
+\&       if failed uid root then unmonitor
+\&       if failed gid root then unmonitor
+\&       if changed size then alert
+\&       if changed timestamp then alert
+\&       every 2 cycles
+\&       alert bofh@bar with mail\-format {from: monit@foo.bar.no}
+\&       alert foo@bar on { checksum, size, timestamp, uid, gid } 
+\&       depends on datafs
+\&
+\& check filesystem datafs with path /dev/sdb1
+\&       group server
+\&       start program  = "/bin/mount /data"
+\&       stop program  =  "/bin/umount /data"
+\&       if failed permission 660 then unmonitor
+\&       if failed uid root then unmonitor
+\&       if failed gid disk then unmonitor
+\&       if space usage > 80 % then alert
+\&       if space usage > 94 % then stop
+\&       if inode usage > 80 % then alert
+\&       if inode usage > 94 % then stop
+\&       alert root@localhost
+\&
+\& check host ftp.redhat.com with address ftp.redhat.com
+\&       if failed icmp type echo with timeout 15 seconds
+\&          then alert 
+\&       if failed port 21 protocol ftp
+\&          then exec "/usr/X11R6/bin/xmessage \-display
+\&                     :0 ftp connection failed"
+\&       alert foo@bar.com
+\& 
+\& check host www.gnu.org with address www.gnu.org
+\&       if failed port 80 protocol http 
+\&          and request "/pub/gnu/bash/bash\-2.05b.tar.gz"
+\&              with checksum 8f7f419955cefa0b33a2ba316cba3659
+\&       then alert
+\&       alert rms@gnu.org with mail\-format {
+\&            subject: The gnu server may be hacked again! }
+.Ve
+.PP
+Note: only the \fBcheck statement\fR is mandatory, the other
+statements are optional and the order of the optional statements
+is not important.
+.SH "FILES"
+.IX Header "FILES"
+\&\fI~/.monitrc\fR  
+   Default run control file
+.PP
+\&\fI/etc/monitrc\fR
+   If the control file is not found in the default 
+   location and /etc contains a \fImonitrc\fR file, this
+   file will be used instead.
+.PP
+\&\fI./monitrc\fR  
+   If the control file is not found in either of the
+   previous two locations, and the current working 
+   directory contains a \fImonitrc\fR file, this file is 
+   used instead.
+.PP
+\&\fI~/.monit.pid\fR
+   Lock file to help prevent concurrent runs (non-root
+   mode).
+.PP
+\&\fI/var/run/monit.pid\fR
+   Lock file to help prevent concurrent runs (root mode,
+   Linux systems).
+.PP
+\&\fI/etc/monit.pid\fR
+   Lock file to help prevent concurrent runs (root mode,
+   systems without /var/run).
+.PP
+\&\fI~/.monit.state\fR  
+   Monit saves its state to this file and utilizes
+   information found in this file to recover from 
+   a crash. This is a binary file and its content is 
+   only of interest to monit. You may set the location
+   of this file in the Monit control file or by using 
+   the \-s switch when Monit is started.
+.PP
+\&\fI~/.monit.id\fR  
+    Monit save its unique id to this file.
+.SH "ENVIRONMENT"
+.IX Header "ENVIRONMENT"
+No environment variables are used by Monit. However, when Monit
+execute a script or a program Monit will set several environment
+variables which can be utilized by the executable. The following
+and \fIonly\fR the following environment variables are available:
+.IP "\s-1MONIT_EVENT\s0" 4
+.IX Item "MONIT_EVENT"
+The event that occurred on the service
+.IP "\s-1MONIT_DESCRIPTION\s0" 4
+.IX Item "MONIT_DESCRIPTION"
+A description of the error condition
+.IP "\s-1MONIT_SERVICE\s0" 4
+.IX Item "MONIT_SERVICE"
+The name of the service (from monitrc) on which the event
+occurred.
+.IP "\s-1MONIT_DATE\s0" 4
+.IX Item "MONIT_DATE"
+The time and date (rfc 822 style) the event occurred
+.IP "\s-1MONIT_HOST\s0" 4
+.IX Item "MONIT_HOST"
+The host the event occurred on
+.PP
+The following environment variables are only available for
+process service entries:
+.IP "\s-1MONIT_PROCESS_PID\s0" 4
+.IX Item "MONIT_PROCESS_PID"
+The process pid. This may be 0 if the process was (re)started,
+.IP "\s-1MONIT_PROCESS_MEMORY\s0" 4
+.IX Item "MONIT_PROCESS_MEMORY"
+Process memory. This may be 0 if the process was (re)started,
+.IP "\s-1MONIT_PROCESS_CHILDREN\s0" 4
+.IX Item "MONIT_PROCESS_CHILDREN"
+Process children. This may be 0 if the process was (re)started,
+.IP "\s-1MONIT_PROCESS_CPU_PERCENT\s0" 4
+.IX Item "MONIT_PROCESS_CPU_PERCENT"
+Process cpu%. This may be 0 if the process was (re)started,
+.PP
+In addition the following spartan \s-1PATH\s0 environment variable is
+available:
+.IP "PATH=/bin:/usr/bin:/sbin:/usr/sbin" 4
+.IX Item "PATH=/bin:/usr/bin:/sbin:/usr/sbin"
+.PP
+Scripts or programs that depends on other environment variables
+or on a more verbose \s-1PATH\s0 must provide means to set these
+variables by them self.
+.SH "SIGNALS"
+.IX Header "SIGNALS"
+If a Monit daemon is running, \s-1SIGUSR1\s0 wakes it up from its sleep
+phase and forces a poll of all services. \s-1SIGTERM\s0 and \s-1SIGINT\s0 will
+gracefully terminate a Monit daemon. The \s-1SIGTERM\s0 signal is sent
+to a Monit daemon if Monit is started with the \fIquit\fR action
+argument.
+.PP
+Sending a \s-1SIGHUP\s0 signal to a running Monit daemon will force
+the daemon to reinitialize itself, specifically it will reread
+configuration, close and reopen log files.
+.PP
+Running Monit in foreground while a background Monit daemon is
+running will wake up the daemon.
+.SH "NOTES"
+.IX Header "NOTES"
+This is a very silent program. Use the \-v switch if you want to
+see what Monit is doing, and tail \-f the logfile. Optionally for
+testing purposes; you can start Monit with the \-Iv switch. Monit
+will then print debug information to the console, to stop monit
+in this mode, simply press CTRL^C (i.e. \s-1SIGINT\s0) in the same
+console.
+.PP
+The syntax (and parser) of the control file was inspired by Eric
+S. Raymond et al. excellent fetchmail program. Some portions of
+this man page also receive inspiration from the same authors.
+.SH "COPYRIGHT"
+.IX Header "COPYRIGHT"
+Copyright (C) 2001\-2012 by Tildeslash Ltd. All Rights Reserved.
+This product is distributed in the hope that it will be useful,
+but \s-1WITHOUT\s0 any warranty; without even the implied warranty of
+\&\s-1MERCHANTABILITY\s0 or \s-1FITNESS\s0 for a particular purpose.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\s-1GNU\s0 text utilities; \fImd5sum\fR\|(1); \fIsha1sum\fR\|(1); \fIopenssl\fR\|(1); \fIglob\fR\|(7);
+\&\fIregex\fR\|(7); \fIhttp://www.mmonit.com/\fR
diff --git a/monit-5.4/monitrc b/monit-5.4/monitrc
new file mode 100644
index 0000000..c2c698f
--- /dev/null
+++ b/monit-5.4/monitrc
@@ -0,0 +1,246 @@
+###############################################################################
+## Monit control file
+###############################################################################
+##
+## Comments begin with a '#' and extend through the end of the line. Keywords
+## are case insensitive. All path's MUST BE FULLY QUALIFIED, starting with '/'.
+##
+## Below you will find examples of some frequently used statements. For 
+## information about the control file and a complete list of statements and 
+## options, please have a look in the Monit manual.
+##
+##
+###############################################################################
+## Global section
+###############################################################################
+##
+## Start Monit in the background (run as a daemon):
+#
+set daemon  60              # check services at 1-minute intervals
+#   with start delay 240    # optional: delay the first check by 4-minutes (by 
+#                           # default Monit check immediately after Monit start)
+#
+#
+## Set syslog logging with the 'daemon' facility. If the FACILITY option is
+## omitted, Monit will use 'user' facility by default. If you want to log to 
+## a standalone log file instead, specify the full path to the log file
+#
+# set logfile syslog facility log_daemon                       
+#
+#
+## Set the location of the Monit id file which stores the unique id for the
+## Monit instance. The id is generated and stored on first Monit start. By 
+## default the file is placed in $HOME/.monit.id.
+#
+# set idfile /var/.monit.id
+#
+## Set the location of the Monit state file which saves monitoring states
+## on each cycle. By default the file is placed in $HOME/.monit.state. If
+## the state file is stored on a persistent filesystem, Monit will recover
+## the monitoring state across reboots. If it is on temporary filesystem, the
+## state will be lost on reboot which may be convenient in some situations.
+#
+# set statefile /var/.monit.state
+#
+## Set the list of mail servers for alert delivery. Multiple servers may be 
+## specified using a comma separator. If the first mail server fails, Monit 
+# will use the second mail server in the list and so on. By default Monit uses 
+# port 25 - it is possible to override this with the PORT option.
+#
+# set mailserver mail.bar.baz,               # primary mailserver
+#                backup.bar.baz port 10025,  # backup mailserver on port 10025
+#                localhost                   # fallback relay
+#
+#
+## By default Monit will drop alert events if no mail servers are available. 
+## If you want to keep the alerts for later delivery retry, you can use the 
+## EVENTQUEUE statement. The base directory where undelivered alerts will be 
+## stored is specified by the BASEDIR option. You can limit the maximal queue
+## size using the SLOTS option (if omitted, the queue is limited by space 
+## available in the back end filesystem).
+#
+# set eventqueue
+#     basedir /var/monit  # set the base directory where events will be stored
+#     slots 100           # optionally limit the queue size
+#
+#
+## Send status and events to M/Monit (for more informations about M/Monit 
+## see http://mmonit.com/). By default Monit registers credentials with 
+## M/Monit so M/Monit can smoothly communicate back to Monit and you don't
+## have to register Monit credentials manually in M/Monit. It is possible to
+## disable credential registration using the commented out option below. 
+## Though, if safety is a concern we recommend instead using https when
+## communicating with M/Monit and send credentials encrypted.
+#
+# set mmonit http://monit:monit@192.168.1.10:8080/collector
+#     # and register without credentials     # Don't register credentials
+#
+#
+## Monit by default uses the following format for alerts if the the mail-format
+## statement is missing::
+## --8<--
+## set mail-format {
+##      from: monit@$HOST
+##   subject: monit alert --  $EVENT $SERVICE
+##   message: $EVENT Service $SERVICE
+##                 Date:        $DATE
+##                 Action:      $ACTION
+##                 Host:        $HOST
+##                 Description: $DESCRIPTION
+##
+##            Your faithful employee,
+##            Monit
+## }
+## --8<--
+##
+## You can override this message format or parts of it, such as subject
+## or sender using the MAIL-FORMAT statement. Macros such as $DATE, etc.
+## are expanded at runtime. For example, to override the sender, use:
+#
+# set mail-format { from: monit@foo.bar }
+#
+#
+## You can set alert recipients whom will receive alerts if/when a 
+## service defined in this file has errors. Alerts may be restricted on 
+## events by using a filter as in the second example below. 
+#
+# set alert sysadm@foo.bar                       # receive all alerts
+# set alert manager@foo.bar only on { timeout }  # receive just service-
+#                                                # timeout alert
+#
+#
+## Monit has an embedded web server which can be used to view status of 
+## services monitored and manage services from a web interface. See the
+## Monit Wiki if you want to enable SSL for the web server. 
+#
+set httpd port 2812 and
+    use address localhost  # only accept connection from localhost
+    allow localhost        # allow localhost to connect to the server and
+    allow admin:monit      # require user 'admin' with password 'monit'
+    allow @monit           # allow users of group 'monit' to connect (rw)
+    allow @users readonly  # allow users of group 'users' to connect readonly
+
+###############################################################################
+## Services
+###############################################################################
+##
+## Check general system resources such as load average, cpu and memory
+## usage. Each test specifies a resource, conditions and the action to be
+## performed should a test fail.
+#
+#  check system myhost.mydomain.tld
+#    if loadavg (1min) > 4 then alert
+#    if loadavg (5min) > 2 then alert
+#    if memory usage > 75% then alert
+#    if swap usage > 25% then alert
+#    if cpu usage (user) > 70% then alert
+#    if cpu usage (system) > 30% then alert
+#    if cpu usage (wait) > 20% then alert
+#
+#    
+## Check if a file exists, checksum, permissions, uid and gid. In addition
+## to alert recipients in the global section, customized alert can be sent to 
+## additional recipients by specifying a local alert handler. The service may 
+## be grouped using the GROUP option. More than one group can be specified by
+## repeating the 'group name' statement.
+#    
+#  check file apache_bin with path /usr/local/apache/bin/httpd
+#    if failed checksum and 
+#       expect the sum 8f7f419955cefa0b33a2ba316cba3659 then unmonitor
+#    if failed permission 755 then unmonitor
+#    if failed uid root then unmonitor
+#    if failed gid root then unmonitor
+#    alert security@foo.bar on {
+#           checksum, permission, uid, gid, unmonitor
+#        } with the mail-format { subject: Alarm! }
+#    group server
+#
+#    
+## Check that a process is running, in this case Apache, and that it respond
+## to HTTP and HTTPS requests. Check its resource usage such as cpu and memory,
+## and number of children. If the process is not running, Monit will restart 
+## it by default. In case the service is restarted very often and the 
+## problem remains, it is possible to disable monitoring using the TIMEOUT
+## statement. This service depends on another service (apache_bin) which
+## is defined above.
+#    
+#  check process apache with pidfile /usr/local/apache/logs/httpd.pid
+#    start program = "/etc/init.d/httpd start" with timeout 60 seconds
+#    stop program  = "/etc/init.d/httpd stop"
+#    if cpu > 60% for 2 cycles then alert
+#    if cpu > 80% for 5 cycles then restart
+#    if totalmem > 200.0 MB for 5 cycles then restart
+#    if children > 250 then restart
+#    if loadavg(5min) greater than 10 for 8 cycles then stop
+#    if failed host www.tildeslash.com port 80 protocol http 
+#       and request "/somefile.html"
+#       then restart
+#    if failed port 443 type tcpssl protocol http
+#       with timeout 15 seconds
+#       then restart
+#    if 3 restarts within 5 cycles then timeout
+#    depends on apache_bin
+#    group server
+#    
+#    
+## Check filesystem permissions, uid, gid, space and inode usage. Other services,
+## such as databases, may depend on this resource and an automatically graceful
+## stop may be cascaded to them before the filesystem will become full and data
+## lost.
+#
+#  check filesystem datafs with path /dev/sdb1
+#    start program  = "/bin/mount /data"
+#    stop program  = "/bin/umount /data"
+#    if failed permission 660 then unmonitor
+#    if failed uid root then unmonitor
+#    if failed gid disk then unmonitor
+#    if space usage > 80% for 5 times within 15 cycles then alert
+#    if space usage > 99% then stop
+#    if inode usage > 30000 then alert
+#    if inode usage > 99% then stop
+#    group server
+#
+#
+## Check a file's timestamp. In this example, we test if a file is older 
+## than 15 minutes and assume something is wrong if its not updated. Also,
+## if the file size exceed a given limit, execute a script
+#
+#  check file database with path /data/mydatabase.db
+#    if failed permission 700 then alert
+#    if failed uid data then alert
+#    if failed gid data then alert
+#    if timestamp > 15 minutes then alert
+#    if size > 100 MB then exec "/my/cleanup/script" as uid dba and gid dba
+#
+#
+## Check directory permission, uid and gid.  An event is triggered if the 
+## directory does not belong to the user with uid 0 and gid 0.  In addition, 
+## the permissions have to match the octal description of 755 (see chmod(1)).
+#
+#  check directory bin with path /bin
+#    if failed permission 755 then unmonitor
+#    if failed uid 0 then unmonitor
+#    if failed gid 0 then unmonitor
+#
+#
+## Check a remote host availability by issuing a ping test and check the 
+## content of a response from a web server. Up to three pings are sent and 
+## connection to a port and an application level network check is performed.
+#
+#  check host myserver with address 192.168.1.1
+#    if failed icmp type echo count 3 with timeout 3 seconds then alert
+#    if failed port 3306 protocol mysql with timeout 15 seconds then alert
+#    if failed url http://user:password@www.foo.bar:8080/?querystring
+#       and content == 'action="j_security_check"'
+#       then alert
+#
+#
+###############################################################################
+## Includes
+###############################################################################
+##
+## It is possible to include additional configuration parts from other files or
+## directories.
+#
+#  include /etc/monit.d/*
+#
diff --git a/monit-5.4/src/alert.c b/monit-5.4/src/alert.c
new file mode 100644
index 0000000..0901ebe
--- /dev/null
+++ b/monit-5.4/src/alert.c
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#include "monit.h"
+#include "event.h"
+#include "net.h"
+#include "alert.h"
+
+// libmonit
+#include "system/Time.h"
+#include "util/Str.h"
+
+
+/**
+ *  Implementation of the alert module
+ *
+ *  @file
+ */
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void copy_mail(Mail_T, Mail_T);
+static void replace_bare_linefeed(Mail_T *);
+static void substitute(Mail_T *, Event_T);
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Notify registred users about the event
+ * @param E An Event object
+ * @return If failed, return HANDLER_ALERT flag or HANDLER_SUCCEEDED if succeeded
+ */
+int handle_alert(Event_T E) {
+  Service_T s;
+  int rv = HANDLER_SUCCEEDED;
+
+  ASSERT(E);
+
+  s= Event_get_source(E);
+  if(!s) {
+    LogError("Aborting alert\n");
+    return rv;
+  }
+
+  if(s->maillist || Run.maillist) {
+    Mail_T m;
+    Mail_T n;
+    Mail_T list= NULL;
+    /*
+     * Build a mail-list with local recipients that has registered interest
+     * for this event.
+     */
+    for(m= s->maillist; m; m= m->next) {
+      
+      if(
+        /* particular event notification type is allowed for given recipient */
+        IS_EVENT_SET(m->events, Event_get_id(E)) &&
+        (
+          /* state change notification is sent always */
+          E->state_changed       ||
+          /* in the case that the state is failed for more cycles we check
+           * whether we should send the reminder */
+          (E->state && m->reminder && E->count % m->reminder == 0)
+        )
+      )
+      {
+        Mail_T tmp= NULL;
+
+        NEW(tmp);
+        copy_mail(tmp, m);
+        substitute(&tmp, E);
+        replace_bare_linefeed(&tmp);
+        tmp->next= list;
+        list= tmp;
+
+        DEBUG("%s notification is sent to %s\n", Event_get_description(E), m->to);
+
+      }
+
+    }
+
+    /*
+     * Build a mail-list with global recipients that has registered interest
+     * for this event. Recipients which are defined in the service localy
+     * overrides the same recipient events which are registered globaly.
+     */
+    for(m= Run.maillist; m; m= m->next) {
+      int skip= FALSE;
+
+      for(n= s->maillist; n; n= n->next) {
+        if(IS(m->to, n->to)) {
+          skip= TRUE;
+          break;
+        }
+      }
+
+      if(
+        /* the local service alert definition has not overrided the global one */
+        !skip &&
+        /* particular event notification type is allowed for given recipient */
+        IS_EVENT_SET(m->events, Event_get_id(E)) &&
+        (
+          /* state change notification is sent always */
+          E->state_changed       ||
+          /* in the case that the state is failed for more cycles we check
+           * whether we should send the reminder */
+          (E->state && m->reminder && E->count % m->reminder == 0)
+        )
+      )
+      {
+
+        Mail_T tmp= NULL;
+
+        NEW(tmp);
+        copy_mail(tmp, m);
+        substitute(&tmp, E);
+        replace_bare_linefeed(&tmp);
+        tmp->next= list;
+        list= tmp;
+
+        DEBUG("%s notification is sent to %s\n", Event_get_description(E), m->to);
+
+      }
+
+    }
+
+    if(list) {
+
+      if(!sendmail(list))
+        rv = HANDLER_ALERT;
+      gc_mail_list(&list);
+
+    }
+
+  }
+
+  return rv;
+
+}
+
+
+static void substitute(Mail_T *m, Event_T e) {
+  char timestamp[STRLEN];
+
+  ASSERT(m && e);
+
+  Util_replaceString(&(*m)->from,    "$HOST", Run.localhostname);
+  Util_replaceString(&(*m)->subject, "$HOST", Run.localhostname);
+  Util_replaceString(&(*m)->message, "$HOST", Run.localhostname);
+  
+  Time_string(e->collected.tv_sec, timestamp);
+  Util_replaceString(&(*m)->subject, "$DATE", timestamp);
+  Util_replaceString(&(*m)->message, "$DATE", timestamp);
+
+  Util_replaceString(&(*m)->subject, "$SERVICE", Event_get_source_name(e));
+  Util_replaceString(&(*m)->message, "$SERVICE", Event_get_source_name(e));
+
+  Util_replaceString(&(*m)->subject, "$EVENT", Event_get_description(e));
+  Util_replaceString(&(*m)->message, "$EVENT", Event_get_description(e));
+
+  Util_replaceString(&(*m)->subject, "$DESCRIPTION", NVLSTR(Event_get_message(e)));
+  Util_replaceString(&(*m)->message, "$DESCRIPTION", NVLSTR(Event_get_message(e)));
+
+  Util_replaceString(&(*m)->subject, "$ACTION", Event_get_action_description(e));
+  Util_replaceString(&(*m)->message, "$ACTION", Event_get_action_description(e));
+}
+
+
+static void copy_mail(Mail_T n, Mail_T o) {
+  ASSERT(n && o);
+  
+  n->to= Str_dup(o->to);
+  n->from=
+      o->from?
+      Str_dup(o->from):
+      Run.MailFormat.from?
+      Str_dup(Run.MailFormat.from):
+      Str_dup(ALERT_FROM);
+  n->replyto = 
+      o->replyto?
+      Str_dup(o->replyto):
+      Run.MailFormat.replyto?
+      Str_dup(Run.MailFormat.replyto):
+      NULL;
+  n->subject=
+      o->subject?
+      Str_dup(o->subject):
+      Run.MailFormat.subject?
+      Str_dup(Run.MailFormat.subject):
+      Str_dup(ALERT_SUBJECT);
+  n->message=
+      o->message?
+      Str_dup(o->message):
+      Run.MailFormat.message?
+      Str_dup(Run.MailFormat.message):
+      Str_dup(ALERT_MESSAGE);
+}
+
+
+static void replace_bare_linefeed(Mail_T *m) {
+  Util_replaceString(&(*m)->message, "\r\n", "\n");
+  Util_replaceString(&(*m)->message, "\n", "\r\n");
+}
diff --git a/monit-5.4/src/alert.h b/monit-5.4/src/alert.h
new file mode 100644
index 0000000..ffb60d4
--- /dev/null
+++ b/monit-5.4/src/alert.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_ALERT_H
+#define MONIT_ALERT_H
+
+#include "event.h"
+
+
+/** Default mail from string */
+#define ALERT_FROM    "monit@$HOST"
+
+/** Default mail subject */
+#define ALERT_SUBJECT "monit alert --  $EVENT $SERVICE"
+
+/** Default mail message */
+#define ALERT_MESSAGE "$EVENT Service $SERVICE \r\n"\
+                      "\r\n"\
+                      "\tDate:        $DATE\r\n"\
+                      "\tAction:      $ACTION\r\n"\
+	              "\tHost:        $HOST\r\n"\
+	              "\tDescription: $DESCRIPTION\r\n"\
+		      "\r\n"\
+		      "Your faithful employee,\r\n"\
+	              "Monit\r\n"
+
+
+/**
+ *  This module is used for event notifications. Users may register
+ *  interest for certain events in the monit control file. When an
+ *  event occurs this module is called from the event processing
+ *  machinery to notify users who have asked to be alerted for
+ *  particular events.
+ *
+ *  @file
+ */
+
+
+/**
+ * Notify registred users about the event
+ * @param E An Event object
+ * @return If failed, return HANDLER_ALERT flag or HANDLER_SUCCEEDED flag if succeeded
+ */
+int handle_alert(Event_T E);
+
+
+#endif
diff --git a/monit-5.4/src/collector.c b/monit-5.4/src/collector.c
new file mode 100644
index 0000000..bb51751
--- /dev/null
+++ b/monit-5.4/src/collector.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif 
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#include "monit.h"
+#include "socket.h"
+#include "event.h"
+
+
+/**
+ *  Connect to a data collector servlet and send the event or status message.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Send message to the server
+ * @param C An mmonit object
+ * @param D Data to send
+ * @return TRUE if the message sending succeeded otherwise FALSE
+ */
+static int data_send(Socket_T socket, Mmonit_T C, const char *D) {
+        char *auth = Util_getBasicAuthHeader(C->url->user, C->url->password);
+        int rv = socket_print(socket,
+                          "POST %s HTTP/1.1\r\n"
+                          "Host: %s:%d\r\n"
+                          "Content-Type: text/xml\r\n"
+                          "Content-Length: %d\r\n"
+                          "Pragma: no-cache\r\n"
+                          "Accept: */*\r\n"
+                          "User-Agent: %s/%s\r\n"
+                          "Connection: close\r\n"
+                          "%s"
+                          "\r\n"
+                          "%s",
+                          C->url->path,
+                          C->url->hostname, C->url->port,
+                          strlen(D),
+                          prog, VERSION,
+                          auth?auth:"",
+                          D);
+        FREE(auth);
+        if (rv <0) {
+                LogError("M/Monit: error sending data to %s -- %s\n", C->url->url, STRERROR);
+                return FALSE;
+        }
+        return TRUE;
+}
+
+
+/**
+ * Check that the server returns a valid HTTP response
+ * @param C An mmonit object
+ * @return TRUE if the response is valid otherwise FALSE
+ */
+static int data_check(Socket_T socket, Mmonit_T C) {
+        int  status;
+        char buf[STRLEN];
+        
+        if (! socket_readln(socket, buf, sizeof(buf))) {
+                LogError("M/Monit: error receiving data from %s -- %s\n", C->url->url, STRERROR);
+                return FALSE;
+        }
+        Str_chomp(buf);
+        int n = sscanf(buf, "%*s %d", &status);
+        if (n != 1 || (status >= 400)) {
+                LogError("M/Monit: message sending failed to %s -- %s\n", C->url->url, buf);
+                return FALSE;
+        }
+        return TRUE;
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Post event or status data message to mmonit
+ * @param E An event object or NULL for status data
+ * @return If failed, return HANDLER_MMONIT flag or HANDLER_SUCCEEDED flag if succeeded
+ */
+int handle_mmonit(Event_T E) {
+        int       rv = HANDLER_MMONIT;
+        Socket_T  socket = NULL;
+        Mmonit_T  C = Run.mmonits;
+        
+        /* The event is sent to mmonit just once - only in the case that the state changed */
+        if (! C || (E && ! E->state_changed))
+                return HANDLER_SUCCEEDED;
+        
+        StringBuffer_T sb = StringBuffer_create(256);
+        for (; C; C = C->next) {
+                if (! (socket = socket_create_t(C->url->hostname, C->url->port, SOCKET_TCP, C->ssl, C->timeout))) {
+                        LogError("M/Monit: cannot open a connection to %s -- %s\n", C->url->url, STRERROR);
+                        goto error;
+                }
+                status_xml(sb, E, E ? LEVEL_SUMMARY : LEVEL_FULL, 2, socket_get_local_host(socket));
+                if (! data_send(socket, C, StringBuffer_toString(sb))) {
+                        LogError("M/Monit: cannot send %s message to %s\n", E ? "event" : "status", C->url->url);
+                        goto error;
+                }
+                StringBuffer_clear(sb);
+                socket_shutdown_write(socket);
+                if (! data_check(socket, C)) {
+                        LogError("M/Monit: %s message to %s failed\n", E ? "event" : "status", C->url->url);
+                        goto error;
+                }
+                rv = HANDLER_SUCCEEDED; // Return success if at least one M/Monit succeeded
+                DEBUG("M/Monit: %s message sent to %s\n", E ? "event" : "status", C->url->url);
+error:
+                if (socket)
+                        socket_free(&socket);
+        }
+        StringBuffer_free(&sb);
+        return rv;
+}
+
diff --git a/monit-5.4/src/config.h.in b/monit-5.4/src/config.h.in
new file mode 100644
index 0000000..9b70e1c
--- /dev/null
+++ b/monit-5.4/src/config.h.in
@@ -0,0 +1,494 @@
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the <alloca.h> header file. */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the <asm/page.h> header file. */
+#undef HAVE_ASM_PAGE_H
+
+/* Define to 1 if you have the <asm/param.h> header file. */
+#undef HAVE_ASM_PARAM_H
+
+/* Define to 1 if you have the `backtrace' function. */
+#undef HAVE_BACKTRACE
+
+/* Define to 1 if you have the <cf.h> header file. */
+#undef HAVE_CF_H
+
+/* Define to 1 if CPU wait information is available. */
+#undef HAVE_CPU_WAIT
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+#undef HAVE_CRT_EXTERNS_H
+
+/* Define to 1 if you have the <crypt.h> header file. */
+#undef HAVE_CRYPT_H
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#undef HAVE_CTYPE_H
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#undef HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `getloadavg' function. */
+#undef HAVE_GETLOADAVG
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <glob.h> header file. */
+#undef HAVE_GLOB_H
+
+/* Define to 1 if you have the <grp.h> header file. */
+#undef HAVE_GRP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <kstat.h> header file. */
+#undef HAVE_KSTAT_H
+
+/* Define to 1 if you have the <kvm.h> header file. */
+#undef HAVE_KVM_H
+
+/* Define to 1 if you have the `crypt' library (-lcrypt). */
+#undef HAVE_LIBCRYPT
+
+/* Define to 1 if you have the `inet' library (-linet). */
+#undef HAVE_LIBINET
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define to 1 if you have the `pam' library (-lpam). */
+#undef HAVE_LIBPAM
+
+/* Define to 1 if you have the <libperfstat.h> header file. */
+#undef HAVE_LIBPERFSTAT_H
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+#undef HAVE_LIBRESOLV
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#undef HAVE_LIBSOCKET
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <loadavg.h> header file. */
+#undef HAVE_LOADAVG_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you have the <machine/pmap.h> header file. */
+#undef HAVE_MACHINE_PMAP_H
+
+/* Define to 1 if you have the <machine/vmparam.h> header file. */
+#undef HAVE_MACHINE_VMPARAM_H
+
+/* Define to 1 if you have the <mach/host_info.h> header file. */
+#undef HAVE_MACH_HOST_INFO_H
+
+/* Define to 1 if you have the <mach/mach.h> header file. */
+#undef HAVE_MACH_MACH_H
+
+/* Define to 1 if you have the <mach/mach_host.h> header file. */
+#undef HAVE_MACH_MACH_HOST_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <mntent.h> header file. */
+#undef HAVE_MNTENT_H
+
+/* Define to 1 if you have /etc/mnttab */
+#undef HAVE_MNTTAB
+
+/* Define to 1 if you have /etc/mtab */
+#undef HAVE_MTAB
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <netinet/in_systm.h> header file. */
+#undef HAVE_NETINET_IN_SYSTM_H
+
+/* Define to 1 if you have the <netinet/ip.h> header file. */
+#undef HAVE_NETINET_IP_H
+
+/* Define to 1 if you have the <netinet/ip_icmp.h> header file. */
+#undef HAVE_NETINET_IP_ICMP_H
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
+/* Define to 1 if you have openssl. */
+#undef HAVE_OPENSSL
+
+/* Define to 1 if you have the <pam/pam_appl.h> header file. */
+#undef HAVE_PAM_PAM_APPL_H
+
+/* Define to 1 if you have the <paths.h> header file. */
+#undef HAVE_PATHS_H
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
+/* Define to 1 if you have the <procfs.h> header file. */
+#undef HAVE_PROCFS_H
+
+/* Define to 1 if you have the <procinfo.h> header file. */
+#undef HAVE_PROCINFO_H
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the <regex.h> header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the <security/pam_appl.h> header file. */
+#undef HAVE_SECURITY_PAM_APPL_H
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#undef HAVE_SETJMP_H
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if SOL_IP is defined. */
+#undef HAVE_SOL_IP
+
+/* Define to 1 if you have the `statfs' function. */
+#undef HAVE_STATFS
+
+/* Define to 1 if you have the `statvfs' function. */
+#undef HAVE_STATVFS
+
+/* Define to 1 if `stat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_STAT_EMPTY_STRING_BUG
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#undef HAVE_STROPTS_H
+
+/* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */
+#undef HAVE_STRUCT_TM_TM_GMTOFF
+
+/* Define to 1 if you have the `syslog' function. */
+#undef HAVE_SYSLOG
+
+/* Define to 1 if you have the <syslog.h> header file. */
+#undef HAVE_SYSLOG_H
+
+/* Define to 1 if you have the <sys/cfgdb.h> header file. */
+#undef HAVE_SYS_CFGDB_H
+
+/* Define to 1 if you have the <sys/cfgodm.h> header file. */
+#undef HAVE_SYS_CFGODM_H
+
+/* Define to 1 if you have the <sys/dkstat.h> header file. */
+#undef HAVE_SYS_DKSTAT_H
+
+/* Define to 1 if you have the <sys/dk.h> header file. */
+#undef HAVE_SYS_DK_H
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+#undef HAVE_SYS_FILIO_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/loadavg.h> header file. */
+#undef HAVE_SYS_LOADAVG_H
+
+/* Define to 1 if you have the <sys/lock.h> header file. */
+#undef HAVE_SYS_LOCK_H
+
+/* Define to 1 if you have the <sys/mnttab.h> header file. */
+#undef HAVE_SYS_MNTTAB_H
+
+/* Define to 1 if you have the <sys/mount.h> header file. */
+#undef HAVE_SYS_MOUNT_H
+
+/* Define to 1 if you have the <sys/mutex.h> header file. */
+#undef HAVE_SYS_MUTEX_H
+
+/* Define to 1 if you have the <sys/nlist.h> header file. */
+#undef HAVE_SYS_NLIST_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/procfs.h> header file. */
+#undef HAVE_SYS_PROCFS_H
+
+/* Define to 1 if you have the <sys/proc.h> header file. */
+#undef HAVE_SYS_PROC_H
+
+/* Define to 1 if you have the <sys/protosw.h> header file. */
+#undef HAVE_SYS_PROTOSW_H
+
+/* Define to 1 if you have the <sys/pstat.h> header file. */
+#undef HAVE_SYS_PSTAT_H
+
+/* Define to 1 if you have the <sys/queue.h> header file. */
+#undef HAVE_SYS_QUEUE_H
+
+/* Define to 1 if you have the <sys/resourcevar.h> header file. */
+#undef HAVE_SYS_RESOURCEVAR_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/statfs.h> header file. */
+#undef HAVE_SYS_STATFS_H
+
+/* Define to 1 if you have the <sys/statvfs.h> header file. */
+#undef HAVE_SYS_STATVFS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/swap.h> header file. */
+#undef HAVE_SYS_SWAP_H
+
+/* Define to 1 if you have the <sys/sysctl.h> header file. */
+#undef HAVE_SYS_SYSCTL_H
+
+/* Define to 1 if you have the <sys/sysinfo.h> header file. */
+#undef HAVE_SYS_SYSINFO_H
+
+/* Define to 1 if you have the <sys/systemcfg.h> header file. */
+#undef HAVE_SYS_SYSTEMCFG_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/tree.h> header file. */
+#undef HAVE_SYS_TREE_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/ucred.h> header file. */
+#undef HAVE_SYS_UCRED_H
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+#undef HAVE_SYS_UN_H
+
+/* Define to 1 if you have the <sys/user.h> header file. */
+#undef HAVE_SYS_USER_H
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#undef HAVE_SYS_VFS_H
+
+/* Define to 1 if you have the <sys/vmmeter.h> header file. */
+#undef HAVE_SYS_VMMETER_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <uvm/uvm_extern.h> header file. */
+#undef HAVE_UVM_UVM_EXTERN_H
+
+/* Define to 1 if you have the <uvm/uvm.h> header file. */
+#undef HAVE_UVM_UVM_H
+
+/* Define to 1 if you have the <uvm/uvm_map.h> header file. */
+#undef HAVE_UVM_UVM_MAP_H
+
+/* Define to 1 if you have the <uvm/uvm_object.h> header file. */
+#undef HAVE_UVM_UVM_OBJECT_H
+
+/* Define to 1 if you have the <uvm/uvm_pmap.h> header file. */
+#undef HAVE_UVM_UVM_PMAP_H
+
+/* Define to 1 if VA_COPY is defined. */
+#undef HAVE_VA_COPY
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if you have the <vm/pmap.h> header file. */
+#undef HAVE_VM_PMAP_H
+
+/* Define to 1 if you have the <vm/vm.h> header file. */
+#undef HAVE_VM_VM_H
+
+/* Define to 1 if you have the <vm/vm_map.h> header file. */
+#undef HAVE_VM_VM_MAP_H
+
+/* Define to 1 if you have the <vm/vm_object.h> header file. */
+#undef HAVE_VM_VM_OBJECT_H
+
+/* Define to 1 if you have the `vsyslog' function. */
+#undef HAVE_VSYSLOG
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+   slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to the pid storage directory. */
+#undef PIDDIR
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
+
+
+/* Mask out GCC __attribute__ extension for non-gcc compilers. */
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
diff --git a/monit-5.4/src/control.c b/monit-5.4/src/control.c
new file mode 100644
index 0000000..78287df
--- /dev/null
+++ b/monit-5.4/src/control.c
@@ -0,0 +1,457 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "monit.h"
+#include "net.h"
+#include "socket.h"
+#include "event.h"
+#include "system/Time.h"
+
+
+/**
+ *  Methods for controlling services managed by monit.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+typedef enum {
+        Process_Stopped = 0,
+        Process_Started
+} Process_Status;
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void do_start(Service_T, int);
+static int  do_stop(Service_T, int);
+static void do_monitor(Service_T, int);
+static void do_unmonitor(Service_T, int);
+static void do_depend(Service_T, int, int);
+static Process_Status wait_process(Service_T, Process_Status expect);
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Pass on to methods in http/cervlet.c to start/stop services
+ * @param S A service name as stated in the config file
+ * @param action A string describing the action to execute
+ * @return FALSE for error, otherwise TRUE
+ */
+int control_service_daemon(const char *S, const char *action) {
+        int rv = FALSE;
+        int status, content_length = 0;
+        Socket_T socket;
+        char *auth;
+        char buf[STRLEN];
+        ASSERT(S);
+        ASSERT(action);
+        if (Util_getAction(action) == ACTION_IGNORE) {
+                LogError("%s: Cannot %s service '%s' -- invalid action %s\n", prog, action, S, action);
+                return FALSE;
+        }
+        socket = socket_create_t(Run.bind_addr ? Run.bind_addr : "localhost", Run.httpdport, SOCKET_TCP, 
+                            (Ssl_T){.use_ssl = Run.httpdssl, .clientpemfile = Run.httpsslclientpem}, NET_TIMEOUT);
+        if (! socket) {
+                LogError("%s: Cannot connect to the monit daemon. Did you start it with http support?\n", prog);
+                return FALSE;
+        }
+
+        /* Send request */
+        auth = Util_getBasicAuthHeaderMonit();
+        if (socket_print(socket,
+                "POST /%s HTTP/1.0\r\n"
+                "Content-Type: application/x-www-form-urlencoded\r\n"
+                "Content-Length: %d\r\n"
+                "%s"
+                "\r\n"
+                "action=%s",
+                S,
+                strlen("action=") + strlen(action),
+                auth ? auth : "",
+                action) < 0)
+        {
+                LogError("%s: Cannot send the command '%s' to the monit daemon -- %s", prog, action ? action : "null", STRERROR);
+                goto err1;
+        }
+
+        /* Process response */
+        if (! socket_readln(socket, buf, STRLEN)) {
+                LogError("%s: error receiving data -- %s\n", prog, STRERROR);
+                goto err1;
+        }
+        Str_chomp(buf);
+        if (! sscanf(buf, "%*s %d", &status)) {
+                LogError("%s: cannot parse status in response: %s\n", prog, buf);
+                goto err1;
+        }
+        if (status >= 300) {
+                char *message = NULL;
+
+                /* Skip headers */
+                while (socket_readln(socket, buf, STRLEN)) {
+                        if (! strncmp(buf, "\r\n", sizeof(buf)))
+                                break;
+                        if (Str_startsWith(buf, "Content-Length") && ! sscanf(buf, "%*s%*[: ]%d", &content_length))
+                                goto err1;
+                }
+                if (content_length > 0 && content_length < 1024 && socket_readln(socket, buf, STRLEN)) {
+                        char token[] = "</h2>";
+                        char *p = strstr(buf, token);
+                        if (strlen(p) <= strlen(token))
+                                goto err2;
+                        p += strlen(token);
+                        message = CALLOC(1, content_length + 1);
+                        snprintf(message, content_length + 1, "%s", p);
+                        p = strstr(message, "<p>");
+                        if (p)
+                                *p = 0;
+                }
+err2:
+                LogError("%s: action failed -- %s\n", prog, message ? message : "unable to parse response");
+                FREE(message);
+        } else
+                rv = TRUE;
+err1:
+        FREE(auth);
+        socket_free(&socket);
+        return rv;
+}
+
+
+/**
+ * Check to see if we should try to start/stop service
+ * @param S A service name as stated in the config file
+ * @param A A string describing the action to execute
+ * @return FALSE for error, otherwise TRUE
+ */
+int control_service_string(const char *S, const char *A) {
+        int a;
+        ASSERT(S);
+        ASSERT(A);
+        if ((a = Util_getAction(A)) == ACTION_IGNORE) {
+                LogError("%s: service '%s' -- invalid action %s\n", prog, S, A);
+                return FALSE;
+        }
+        return control_service(S, a);
+}
+
+
+/**
+ * Check to see if we should try to start/stop service
+ * @param S A service name as stated in the config file
+ * @param A An action id describing the action to execute
+ * @return FALSE for error, otherwise TRUE
+ */
+int control_service(const char *S, int A) {
+        Service_T s = NULL;
+        ASSERT(S);
+        if (! (s = Util_getService(S))) {
+                LogError("%s: service '%s' -- doesn't exist\n", prog, S);
+                return FALSE;
+        }
+        switch(A) {
+                case ACTION_START:
+                        if (s->type == TYPE_PROCESS) {
+                                if (Util_isProcessRunning(s, FALSE)) {
+                                        DEBUG("%s: Process already running -- process %s\n", prog, S);
+                                        Util_monitorSet(s);
+                                        return TRUE;
+                                }
+                                if (!s->start) {
+                                        LogError("%s: Start method not defined -- process %s\n", prog, S);
+                                        Util_monitorSet(s);
+                                        return FALSE;
+                                }
+                        }
+                        do_depend(s, ACTION_STOP, FALSE);
+                        do_start(s, 0);
+                        do_depend(s, ACTION_START, 0);
+                        break;
+
+                case ACTION_STOP:
+                        if (s->type == TYPE_PROCESS && !s->stop) {
+                                LogError("%s: Stop method not defined -- process %s\n", prog, S);
+                                Util_monitorUnset(s);
+                                return FALSE;
+                        }
+                        do_depend(s, ACTION_STOP, TRUE);
+                        do_stop(s, TRUE);
+                        break;
+
+                case ACTION_RESTART:
+                        if (s->type == TYPE_PROCESS && (!s->start || !s->stop)) {
+                                LogError("%s: Start or stop method not defined -- process %s\n", prog, S);
+                                Util_monitorSet(s);
+                                return FALSE;
+                        }
+                        LogInfo("'%s' trying to restart\n", s->name);
+                        do_depend(s, ACTION_STOP, FALSE);
+                        if (do_stop(s, FALSE)) {
+                                /* Only start if stop succeeded */
+                                do_start(s, 0);
+                                do_depend(s, ACTION_START, 0);
+                        } else {
+                                /* enable monitoring of this service again to allow the restart retry in the next cycle up to timeout limit */
+                                Util_monitorSet(s);
+                        }
+                        break;
+
+                case ACTION_MONITOR:
+                        /* We only enable monitoring of this service and all prerequisite services. Chain of services which depends on this service keep its state */
+                        do_monitor(s, 0);
+                        break;
+
+                case ACTION_UNMONITOR:
+                        /* We disable monitoring of this service and all services which depends on it */
+                        do_depend(s, ACTION_UNMONITOR, 0);
+                        do_unmonitor(s, 0);
+                        break;
+
+                default:
+                        LogError("%s: service '%s' -- invalid action %s\n", prog, S, A);
+                        return FALSE;
+        }
+        return TRUE;
+}
+
+
+/*
+ * Reset the visited flags used when handling dependencies
+ */
+void reset_depend() {
+        Service_T s;
+        for (s = servicelist; s; s = s->next) {
+                s->visited = FALSE;
+                s->depend_visited = FALSE;
+        }
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/*
+ * This is a post- fix recursive function for starting every service
+ * that s depends on before starting s.
+ * @param s A Service_T object
+ * @param flag A Custom flag
+ */
+static void do_start(Service_T s, int flag) {
+        ASSERT(s);
+        if (s->visited)
+                return;
+        s->visited = TRUE;
+        if (s->dependantlist) {
+                Dependant_T d;
+                for (d = s->dependantlist; d; d = d->next ) {
+                        Service_T parent = Util_getService(d->dependant);
+                        ASSERT(parent);
+                        do_start(parent, flag);
+                }
+        }
+        if (s->start && (s->type != TYPE_PROCESS || !Util_isProcessRunning(s, FALSE))) {
+                LogInfo("'%s' start: %s\n", s->name, s->start->arg[0]);
+                spawn(s, s->start, NULL);
+                /* We only wait for a process type, other service types does not have a pid file to watch */
+                if (s->type == TYPE_PROCESS)
+                        wait_process(s, Process_Started);
+        }
+        Util_monitorSet(s);
+}
+
+
+/*
+ * This function simply stops the service p.
+ * @param s A Service_T object
+ * @param flag TRUE if the monitoring should be disabled or FALSE if monitoring should continue (when stop is part of restart)
+ * @return TRUE if the service was stopped otherwise FALSE
+ */
+static int do_stop(Service_T s, int flag) {
+        int rv = TRUE;
+        ASSERT(s);
+        if (s->depend_visited)
+                return rv;
+        s->depend_visited = TRUE;
+        if (s->stop && (s->type != TYPE_PROCESS || Util_isProcessRunning(s, FALSE))) {
+                LogInfo("'%s' stop: %s\n", s->name, s->stop->arg[0]);
+                spawn(s, s->stop, NULL);
+                if (s->type == TYPE_PROCESS && (wait_process(s, Process_Stopped) != Process_Stopped)) // Only wait for process service types stop
+                        rv = FALSE;
+        }
+        if (flag)
+                Util_monitorUnset(s);
+        else
+                Util_resetInfo(s);
+
+        return rv;
+}
+
+
+/*
+ * This is a post- fix recursive function for enabling monitoring every service
+ * that s depends on before monitor s.
+ * @param s A Service_T object
+ * @param flag A Custom flag
+ */
+static void do_monitor(Service_T s, int flag) {
+        ASSERT(s);
+        if (s->visited)
+                return;
+        s->visited = TRUE;
+        if (s->dependantlist) {
+                Dependant_T d;
+                for (d = s->dependantlist; d; d = d->next ) {
+                        Service_T parent = Util_getService(d->dependant);
+                        ASSERT(parent);
+                        do_monitor(parent, flag);
+                }
+        }
+        Util_monitorSet(s);
+}
+
+
+/*
+ * This is a function for disabling monitoring
+ * @param s A Service_T object
+ * @param flag A Custom flag
+ */
+static void do_unmonitor(Service_T s, int flag) {
+        ASSERT(s);
+        if (s->depend_visited)
+                return;
+        s->depend_visited = TRUE;
+        Util_monitorUnset(s);
+}
+
+
+/*
+ * This is an in-fix recursive function called before s is started to
+ * stop every service that depends on s, in reverse order *or* after s
+ * was started to start again every service that depends on s. The
+ * action parametere controls if this function should start or stop
+ * the procceses that depends on s.
+ * @param s A Service_T object
+ * @param action An action to do on the dependant services
+ * @param flag A Custom flag
+ */
+static void do_depend(Service_T s, int action, int flag) {
+        Service_T child;
+        ASSERT(s);
+        for (child = servicelist; child; child = child->next) {
+                if (child->dependantlist) {
+                        Dependant_T d;
+                        for (d = child->dependantlist; d; d = d->next) {
+	                        if (IS(d->dependant, s->name)) {
+	                                if (action == ACTION_START)
+	                                        do_start(child, flag);
+                                        else if (action == ACTION_MONITOR)
+	                                        do_monitor(child, flag);
+	                                do_depend(child, action, flag);
+	                                if (action == ACTION_STOP)
+	                                        do_stop(child, flag);
+                                        else if (action == ACTION_UNMONITOR)
+	                                        do_unmonitor(child, flag);
+	                                break;
+	                        }
+                        }
+                }
+        }
+}
+    
+
+/*
+ * This function waits for the process to change state. If the process state doesn't match the expectation,
+ * a failed event is posted to notify the user. The time is saved on enter so in the case that the time steps
+ * backwards/forwards, the wait_process will wait for absolute time and not stall or prematurely exit.
+ * @param service A Service to wait for
+ * @param expect A expected state (see Process_Status)
+ * @return Either Process_Started if the process is running or Process_Stopped if it's not running
+ */
+static Process_Status wait_process(Service_T s, Process_Status expect) {
+        int debug = Run.debug, isrunning = FALSE;
+        unsigned long now = time(NULL) * 1000, wait = 50;
+        unsigned long timeout = now + s->start->timeout * 1000;
+        ASSERT(s);
+        do {
+                Time_usleep(wait * USEC_PER_MSEC);
+                now += wait ;
+                wait = wait < 1000 ? wait * 2 : 1000; // double the wait during each cycle until 1s is reached
+                isrunning = Util_isProcessRunning(s, TRUE);
+                if ((expect == Process_Stopped && ! isrunning) || (expect == Process_Started && isrunning))
+                        break;
+                Run.debug = FALSE; // Turn off debug second time through to avoid flooding the log with pid file does not exist. This poll stuff here _will_ be refactored away
+        } while (now < timeout && ! Run.stopped);
+        Run.debug = debug; // restore the debug state
+        if (isrunning) {
+                if (expect == Process_Started)
+                        Event_post(s, Event_Exec, STATE_SUCCEEDED, s->action_EXEC, "started");
+                else
+                        Event_post(s, Event_Exec, STATE_FAILED, s->action_EXEC, "failed to stop");
+                return Process_Started;
+        } else {
+                if (expect == Process_Started)
+                        Event_post(s, Event_Exec, STATE_FAILED, s->action_EXEC, "failed to start");
+                else
+                        Event_post(s, Event_Exec, STATE_SUCCEEDED, s->action_EXEC, "stopped");
+                return Process_Stopped;
+        }
+}
+
diff --git a/monit-5.4/src/daemonize.c b/monit-5.4/src/daemonize.c
new file mode 100644
index 0000000..ea93a30
--- /dev/null
+++ b/monit-5.4/src/daemonize.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <sys/reboot.h>
+#include "monit.h"
+
+
+/**
+ *  Transform this program into a daemon and provide methods for
+ *  managing the daemon.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Transform a program into a daemon. Inspired by code from Stephen
+ * A. Rago's book, Unix System V Network Programming.
+ */
+void  daemonize() {
+
+  pid_t pid;
+  
+  /*
+   * Clear file creation mask
+   */
+  umask(0);
+
+  /*
+   * Become a session leader to lose our controlling terminal
+   */
+  if((pid= fork ()) < 0) {
+    
+    LogError("Cannot fork of a new process, rebooting\n");
+    sync();
+    reboot(RB_AUTOBOOT);
+    
+  }  
+  else if(pid != 0) {
+    
+    _exit(0);
+    
+  }
+  
+  setsid();
+
+  if((pid= fork ()) < 0) {
+    
+    LogError("Cannot fork of a new process, rebooting\n");
+    sync();
+    reboot(RB_AUTOBOOT);
+    
+  }  
+  else if(pid != 0) {
+    
+    _exit(0);
+    
+  }
+
+  
+  /*
+   * Change current directory to the root so that other file systems
+   * can be unmounted while we're running
+   */
+  if(chdir("/") < 0) {
+    
+    LogError("Cannot chdir to / -- %s\n", STRERROR);
+    exit(1);
+    
+  }
+
+  /*
+   * Attach standard descriptors to /dev/null. Other descriptors
+   * should be closed in env.c
+   */
+  Util_redirectStdFds();
+
+} 
+
+
+/**
+ * Send signal to a daemon process
+ * @param sig Signal to send daemon to
+ * @return TRUE if signal was send, otherwise FALSE
+ */
+int kill_daemon(int sig) {
+  
+  pid_t pid;
+
+  if ( (pid= exist_daemon()) > 0 ) {
+    
+    if ( kill(pid, sig) < 0 ) {
+      
+      LogError("%s: Cannot send signal to daemon process -- %s\n",
+        prog, STRERROR);
+      return FALSE;
+      
+    }
+    
+  } else {
+    
+    LogInfo("%s: No daemon process found\n", prog);
+    return TRUE;
+    
+  }
+  
+  if(sig == SIGTERM) {
+	  
+    fprintf(stdout, "%s daemon with pid [%d] killed\n", prog, (int)pid);
+    fflush(stdout);
+
+  }
+  
+  return TRUE;
+  
+}
+
+
+/**
+ * @return TRUE (i.e. the daemons pid) if a daemon process is running,
+ * otherwise FALSE
+ */
+int exist_daemon() {
+
+  pid_t pid;
+
+  errno= 0;
+
+  if( (pid= Util_getPid(Run.pidfile)) )
+    if( (getpgid(pid)) > -1 || (errno == EPERM) )
+      return( (int)pid );
+  
+  return(FALSE);
+
+}
+    
diff --git a/monit-5.4/src/device/device.h b/monit-5.4/src/device/device.h
new file mode 100644
index 0000000..b04a663
--- /dev/null
+++ b/monit-5.4/src/device/device.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MONIT_DEVICE_H
+#define MONIT_DEVICE_H
+
+char *device_path(Info_T, char *);
+int   filesystem_usage(Info_T, char *);
+
+#endif
+
diff --git a/monit-5.4/src/device/device_common.c b/monit-5.4/src/device/device_common.c
new file mode 100644
index 0000000..efdfddb
--- /dev/null
+++ b/monit-5.4/src/device/device_common.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System independent filesystem methods.
+ *
+ *  @file
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "monit.h"
+#include "device.h"
+#include "device_sysdep.h"
+
+
+/**
+ * This function validates whether given object is valid for filesystem
+ * informations statistics and stores path suitable for it in given
+ * filesystem information structure for later use. Filesystem must be mounted.
+ *
+ * Valid objects are file or directory that are part of requested
+ * filesystem, device or mountpoint.
+ *
+ * In the case of file, directory or mountpoint the result is original
+ * object, in the case of device the mountpoint is returned.
+ *
+ * @param inf     Information structure where resulting data will be stored
+ * @param object  Identifies appropriate device object
+ * @return        NULL in the case of failure otherwise filesystem path
+ */
+char *device_path(Info_T inf, char *object) {
+  struct stat buf;
+
+  ASSERT(inf);
+  ASSERT(object);
+
+  if(stat(object, &buf) != 0) {
+    LogError("%s: Cannot stat '%s' -- %s\n", prog, object, STRERROR);
+    return NULL;
+  }
+
+  if(S_ISREG(buf.st_mode) || S_ISDIR(buf.st_mode)) {
+    inf->priv.filesystem.mntpath = Str_dup(object);
+    return inf->priv.filesystem.mntpath;
+  } else if(S_ISBLK(buf.st_mode) || S_ISCHR(buf.st_mode)) {
+    return device_mountpoint_sysdep(inf, object);
+  }
+
+  LogError("%s: Not file, directory or device: '%s'", prog, object);
+
+  return NULL;
+}
+
+
+/**
+ * Filesystem usage statistics. In the case of success the result is stored in the given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @param object Identifies requested filesystem - either file, directory, device or mountpoint
+ * @return TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage(Info_T inf, char *object) {
+  int rv;
+
+  ASSERT(inf);
+  ASSERT(object);
+
+  if(!device_path(inf, object))
+    return FALSE;
+  inf->priv.filesystem._flags = inf->priv.filesystem.flags;
+  rv = filesystem_usage_sysdep(inf);
+  FREE(inf->priv.filesystem.mntpath);
+  return rv;
+}
+
diff --git a/monit-5.4/src/device/device_sysdep.h b/monit-5.4/src/device/device_sysdep.h
new file mode 100644
index 0000000..fb7bbc1
--- /dev/null
+++ b/monit-5.4/src/device/device_sysdep.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MONIT_DEVICE_SYSDEP_H
+#define MONIT_DEVICE_SYSDEP_H
+
+char *device_mountpoint_sysdep(Info_T, char *);
+int   filesystem_usage_sysdep(Info_T);
+
+#endif
+
diff --git a/monit-5.4/src/device/sysdep_AIX.c b/monit-5.4/src/device/sysdep_AIX.c
new file mode 100644
index 0000000..1d25ae5
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_AIX.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+
+#ifdef HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * AIX special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf      Information structure
+ * @param blockdev Identifies block special device
+ * @return         NULL
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  struct mntent *mnt;
+  FILE          *mntfd;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((mntfd = setmntent("/etc/mtab", "r")) == NULL) {
+    LogError("%s: Cannot open /etc/mtab file\n", prog);
+    return NULL;
+  }
+  while ((mnt = getmntent(mntfd)) != NULL) {
+    if (IS(blockdev, mnt->mnt_fsname)) {
+      endmntent(mntfd);
+      inf->priv.filesystem.mntpath = Str_dup(mnt->mnt_dir);
+      return inf->priv.filesystem.mntpath;
+    }
+  }
+  endmntent(mntfd);
+  return NULL;
+}
+
+
+/**
+ * AIX filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure
+ * @return    FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statfs usage;
+
+  ASSERT(inf);
+
+  if (statfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_DARWIN.c b/monit-5.4/src/device/sysdep_DARWIN.c
new file mode 100644
index 0000000..cb3c488
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_DARWIN.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif
+
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * MacOS X special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf      Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  int countfs;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((countfs = getfsstat(NULL, 0, MNT_NOWAIT)) != -1) {
+    struct statfs *statfs = CALLOC(countfs, sizeof(struct statfs));
+    if ((countfs = getfsstat(statfs, countfs * sizeof(struct statfs), MNT_NOWAIT)) != -1) {
+      int i;
+      for (i = 0; i < countfs; i++) {
+        struct statfs *sfs = statfs + i;
+        if (IS(sfs->f_mntfromname, blockdev)) {
+          inf->priv.filesystem.mntpath = Str_dup(sfs->f_mntonname);
+          FREE(statfs);
+          return inf->priv.filesystem.mntpath;
+        }
+      }
+    }
+    FREE(statfs);
+  }
+  LogError("%s: Error getting mountpoint for filesystem '%s' -- %s\n", prog, blockdev, STRERROR);
+  return NULL;
+}
+
+
+/**
+ * MacOS X filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return    TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statfs usage;
+
+  ASSERT(inf);
+
+  if (statfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          (long)usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      (long)usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = (long)usage.f_bfree;
+  inf->priv.filesystem.f_files =           (long)usage.f_files;
+  inf->priv.filesystem.f_filesfree =       (long)usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flags;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_FREEBSD.c b/monit-5.4/src/device/sysdep_FREEBSD.c
new file mode 100644
index 0000000..8366d3e
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_FREEBSD.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#if defined HAVE_SYS_UCRED_H
+#include <sys/ucred.h>
+#endif
+
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * FreeBSD special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  int countfs;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((countfs = getfsstat(NULL, 0, MNT_NOWAIT)) != -1) {
+    struct statfs *statfs = CALLOC(countfs, sizeof(struct statfs));
+    if ((countfs = getfsstat(statfs, countfs * sizeof(struct statfs), MNT_NOWAIT)) != -1) {
+      int i;
+      for (i = 0; i < countfs; i++) {
+        struct statfs *sfs = statfs + i;
+        if (IS(sfs->f_mntfromname, blockdev)) {
+          inf->priv.filesystem.mntpath = Str_dup(sfs->f_mntonname);
+          FREE(statfs);
+          return inf->priv.filesystem.mntpath;
+        }
+      }
+    }
+    FREE(statfs);
+  }
+  LogError("%s: Error getting mountpoint for filesystem '%s' -- %s\n", prog, blockdev, STRERROR);
+  return NULL;
+}
+
+
+/**
+ * FreeBSD filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return        TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statfs usage;
+
+  ASSERT(inf);
+
+  if(statfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n",
+        prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flags;
+  return TRUE;
+
+}
+
diff --git a/monit-5.4/src/device/sysdep_HPUX.c b/monit-5.4/src/device/sysdep_HPUX.c
new file mode 100644
index 0000000..d034ffb
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_HPUX.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+#endif
+
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+
+/**
+ * HPUX special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  struct mntent *mnt;
+  FILE          *mntfd;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((mntfd = setmntent("/etc/mnttab", "r")) == NULL) {
+    LogError("%s: Cannot open /etc/mnttab file\n", prog);
+    return NULL;
+  }
+  while ((mnt = getmntent(mntfd)) != NULL) {
+    if (IS(blockdev, mnt->mnt_fsname)) {
+      endmntent(mntfd);
+      inf->priv.filesystem.mntpath = Str_dup(mnt->mnt_dir);
+      return inf->priv.filesystem.mntpath;
+    }
+  }
+  endmntent(mntfd);
+  return NULL;
+}
+
+
+/**
+ * HPUX filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return        TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statfs usage;
+
+  ASSERT(inf);
+
+  if (statfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_LINUX.c b/monit-5.4/src/device/sysdep_LINUX.c
new file mode 100644
index 0000000..1c02189
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_LINUX.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_SYS_STATVFS_H
+# include <sys/statvfs.h>
+#endif
+
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+
+/**
+ * Linux special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  FILE *mntfd;
+  struct mntent *mnt;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((mntfd = setmntent("/etc/mtab", "r")) == NULL) {
+    LogError("%s: Cannot open /etc/mtab file\n", prog);
+    return NULL;
+  }
+  while ((mnt = getmntent(mntfd)) != NULL) {
+    char realpathbuf[PATH_MAX+1];
+    /* Try to compare the the filesystem as is, if failed, try to use the symbolic link target */
+    if (IS(blockdev, mnt->mnt_fsname) || (realpath(mnt->mnt_fsname, realpathbuf) && ! strcasecmp(blockdev, realpathbuf))) {
+      endmntent(mntfd);
+      inf->priv.filesystem.mntpath = Str_dup(mnt->mnt_dir);
+      return inf->priv.filesystem.mntpath;
+    }
+  }
+  endmntent(mntfd);
+  LogError("Device %s not found in /etc/mtab\n", blockdev);
+  return NULL;
+}
+
+
+/**
+ * Linux filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return        TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statvfs usage;
+
+  ASSERT(inf);
+
+  if (statvfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flag;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_NETBSD.c b/monit-5.4/src/device/sysdep_NETBSD.c
new file mode 100644
index 0000000..da53e9c
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_NETBSD.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STATVFS_H
+#include <sys/statvfs.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * NetBSD special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  int countfs;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((countfs = getvfsstat(NULL, 0, ST_NOWAIT)) != -1) {
+    struct statvfs *statvfs = CALLOC(countfs, sizeof(struct statvfs));
+    if ((countfs = getvfsstat(statvfs, countfs * sizeof(struct statvfs), ST_NOWAIT)) != -1) {
+      int i;
+      for (i = 0; i < countfs; i++) {
+        struct statvfs *sfs = statvfs + i;
+        if (IS(sfs->f_mntfromname, blockdev)) {
+          inf->priv.filesystem.mntpath = Str_dup(sfs->f_mntonname);
+          FREE(statvfs);
+          return inf->priv.filesystem.mntpath;
+        }
+      }
+    }
+    FREE(statvfs);
+  }
+  LogError("%s: Error getting mountpoint for filesystem '%s' -- %s\n", prog, blockdev, STRERROR);
+  return NULL;
+}
+
+
+/**
+ * NetBSD filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return        TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statvfs usage;
+
+  ASSERT(inf);
+
+  if (statvfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_frsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flag;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_OPENBSD.c b/monit-5.4/src/device/sysdep_OPENBSD.c
new file mode 100644
index 0000000..580b060
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_OPENBSD.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_MOUNT_H
+#include <sys/mount.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * OpenBSD special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  int countfs;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((countfs = getfsstat(NULL, 0, MNT_NOWAIT)) != -1) {
+    struct statfs *statfs = CALLOC(countfs, sizeof(struct statfs));
+    if ((countfs = getfsstat(statfs, countfs * sizeof(struct statfs), MNT_NOWAIT)) != -1) {
+      int i;
+      for (i = 0; i < countfs; i++) {
+        struct statfs *sfs = statfs + i;
+        if (IS(sfs->f_mntfromname, blockdev)) {
+          inf->priv.filesystem.mntpath = Str_dup(sfs->f_mntonname);
+          FREE(statfs);
+          return inf->priv.filesystem.mntpath;
+        }
+      }
+    }
+    FREE(statfs);
+  }
+  LogError("%s: Error getting mountpoint for filesystem '%s' -- %s\n", prog, blockdev, STRERROR);
+  return NULL;
+}
+
+
+/**
+ * OpenBSD filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return        TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  struct statfs usage;
+
+  ASSERT(inf);
+
+  if (statfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flags;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_SOLARIS.c b/monit-5.4/src/device/sysdep_SOLARIS.c
new file mode 100644
index 0000000..3f4d3f4
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_SOLARIS.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STATVFS_H
+# include <sys/statvfs.h>
+#endif
+
+#ifdef HAVE_SYS_MNTTAB_H
+# include <sys/mnttab.h>
+#endif
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+
+/**
+ * Solaris special block device mountpoint method. Filesystem must be mounted.
+ * In the case of success, mountpoint is stored in filesystem information
+ * structure for later use.
+ *
+ * @param inf  Information structure where resulting data will be stored
+ * @param blockdev Identifies block special device
+ * @return         NULL in the case of failure otherwise mountpoint
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  struct mnttab mnt;
+  FILE         *mntfd;
+
+  ASSERT(inf);
+  ASSERT(blockdev);
+
+  if ((mntfd = fopen("/etc/mnttab", "r")) == NULL) {
+    LogError("%s: Cannot open /etc/mnttab file\n", prog);
+    return NULL;
+  }
+  while (getmntent(mntfd, &mnt) == 0) {
+    char real_mnt_special[PATH_MAX+1];
+    if (realpath(mnt.mnt_special, real_mnt_special) && IS(real_mnt_special, blockdev)) {
+        fclose(mntfd);
+        inf->priv.filesystem.mntpath = Str_dup(mnt.mnt_mountp);
+        return inf->priv.filesystem.mntpath;
+    }
+  }
+  fclose(mntfd);
+  return NULL;
+}
+
+
+/**
+ * Solaris filesystem usage statistics. In the case of success result is stored in
+ * given information structure.
+ *
+ * @param inf Information structure where resulting data will be stored
+ * @return TRUE if informations were succesfully read otherwise FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  int size;
+  struct statvfs usage;
+
+  ASSERT(inf);
+
+  if (statvfs(inf->priv.filesystem.mntpath, &usage) != 0) {
+    LogError("%s: Error getting usage statistics for filesystem '%s' -- %s\n", prog, inf->priv.filesystem.mntpath, STRERROR);
+    return FALSE;
+  }
+  size =                                   usage.f_frsize ? (usage.f_bsize / usage.f_frsize) : 1;
+  inf->priv.filesystem.f_bsize =           usage.f_bsize;
+  inf->priv.filesystem.f_blocks =          usage.f_blocks / size;
+  inf->priv.filesystem.f_blocksfree =      usage.f_bavail / size;
+  inf->priv.filesystem.f_blocksfreetotal = usage.f_bfree  / size;
+  inf->priv.filesystem.f_files =           usage.f_files;
+  inf->priv.filesystem.f_filesfree =       usage.f_ffree;
+  inf->priv.filesystem.flags =             usage.f_flag;
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/device/sysdep_UNKNOWN.c b/monit-5.4/src/device/sysdep_UNKNOWN.c
new file mode 100644
index 0000000..430c64c
--- /dev/null
+++ b/monit-5.4/src/device/sysdep_UNKNOWN.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System dependent filesystem methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#include "monit.h"
+#include "device_sysdep.h"
+
+/**
+ * Unknown OS special block device dummy mountpoint method.
+ *
+ * @param inf  Information structure
+ * @param blockdev Identifies block special device
+ * @return         NULL
+ */
+char *device_mountpoint_sysdep(Info_T inf, char *blockdev) {
+  LogError("%s: Unsupported mounted filesystem information method\n", prog);
+  return NULL;
+}
+
+
+/**
+ * Unknown OS filesystem dummy usage statistics.
+ *
+ * @param inf Information structure
+ * @return        FALSE
+ */
+int filesystem_usage_sysdep(Info_T inf) {
+  LogError("%s: Unsupported filesystem informations gathering method\n", prog);
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/env.c b/monit-5.4/src/env.c
new file mode 100644
index 0000000..fa718c3
--- /dev/null
+++ b/monit-5.4/src/env.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_CRT_EXTERNS_H
+#include <crt_externs.h>
+#endif
+
+#include "monit.h"
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN STRLEN
+#endif
+
+#ifdef DARWIN
+#define environ (*_NSGetEnviron())
+#endif
+
+/* Private prototypes */
+static void set_sandbox(void);
+static void set_environment(void);
+
+/**
+ *  Setup this program for safer exec, and set required runtime
+ *  "environment" variables.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Initialize the program environment
+ */
+void init_env() {
+  
+  /* Setup for safe(r) exec */
+  set_sandbox();
+
+  /* Setup program environment */
+  set_environment();
+
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ *  DESCRIPTION
+ *    This code was originally posted by Wietse Venema, years ago, in
+ *    a discussion on news on how to create safe suid wrappers. For
+ *    those interested in NNTP archeology, here's the post:
+ *    
+ *  Article 5648 of comp.security.unix:
+ *  From: wietse@wzv.win.tue.nl (Wietse Venema)
+ *  Newsgroups: comp.security.unix
+ *  Subject: Re: [8lgm]-Advisory-7.UNIX.passwd.11-May-1994
+ *  Date: 18 May 1994 07:52:05 +0200
+ *  Organization: Eindhoven University of Technology, The Netherlands
+ *  Lines: 68
+ *  
+ *  milton@picard.med.miami.edu (H. Milton Johnson) writes:
+ *  >OK, I admit it, I'm a totally incompetent sysadmin because I am not
+ *  >sure I could write a bullet-proof setuid wrapper.  However, if one of
+ *  >the competent sysadmins subscribing to this group could post or point
+ *  >the way to an example of a bullet- proof setuid wrapper, I'm sure that
+ *  >I could use it as a template to address this/future/other problems.
+ *  
+ *  Ok, here is a first stab. Perhaps we can make this into a combined
+ *  effort and get rid of the problem once and for all.
+ *  
+ *           Wietse
+ *
+ *  [code - see the function below, only marginally changed to suit monit]    
+ *
+ *
+ */
+static void set_sandbox(void) {
+
+  int    i = 0;
+  struct stat st;
+  extern char **environ;
+  char   *path = "PATH=/bin:/usr/bin:/sbin:/usr/sbin";
+  char   *tz;
+
+  /*
+   * Purge the environment, but keep the TZ variable as the time.h family depends on it at least on AIX
+   */
+  for (tz = environ[0]; tz; tz = environ[++i]) {
+    if (! strncasecmp(tz, "TZ=", 3)) {
+      environ[0] = tz;
+      environ[1] = 0;
+      break;
+    }
+  }
+  if (! tz)
+    environ[0] = 0;
+  
+  if (putenv(path)) {
+    LogError("%s: cannot set the PATH variable -- %s\n", prog, STRERROR);
+    exit(1);
+  }
+
+  /*
+   * Require that file descriptors 0,1,2 are open. Mysterious things
+   * can happen if that is not the case.
+   */
+  for(i= 0; i < 3; i++) {
+    
+    if(fstat(i, &st) == -1 && open("/dev/null", O_RDWR) != i) {
+      
+      LogError("Cannot open /dev/null -- %s\n", STRERROR);
+      exit(1);
+      
+    }
+    
+  }
+
+  Util_closeFds();
+
+}
+
+
+/**
+ * Get and set required runtime "environment" variables.
+ */
+static void set_environment(void) {
+
+  struct passwd *pw;
+  
+  /* Get password struct */
+  if ( ! (pw= getpwuid(geteuid())) ) {
+    LogError("%s: You don't exist. Go away.\n", prog);
+    exit(1);
+  }
+  Run.Env.home= Str_dup(pw->pw_dir);
+  Run.Env.user= Str_dup(pw->pw_name);
+  
+  /* Get CWD */
+  Run.Env.cwd= CALLOC(sizeof(char), MAXPATHLEN+1);
+  if ( ! (getcwd(Run.Env.cwd, MAXPATHLEN)) ) {
+    LogError("%s: Cannot read current directory -- %s\n", prog, STRERROR);
+    exit(1);
+  }
+  
+  /*
+   * Save and clear the file creation mask
+   */
+  Run.umask= umask(0);
+
+}
+
diff --git a/monit-5.4/src/event.c b/monit-5.4/src/event.c
new file mode 100644
index 0000000..a6ae107
--- /dev/null
+++ b/monit-5.4/src/event.c
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#include "monit.h"
+#include "alert.h"
+#include "event.h"
+#include "process.h"
+
+
+/**
+ * Implementation of the event interface.
+ *
+ * @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+EventTable_T Event_Table[]= {
+  {Event_Action,     "Action done",             "Action done",                "Action done",              "Action done"},
+  {Event_Checksum,   "Checksum failed",         "Checksum succeeded",         "Checksum changed",         "Checksum not changed"},
+  {Event_Connection, "Connection failed",       "Connection succeeded",       "Connection changed",       "Connection not changed"},
+  {Event_Content,    "Content failed",          "Content succeeded",          "Content match",            "Content doesn't match"},
+  {Event_Data,       "Data access error",       "Data access succeeded",      "Data access changed",      "Data access not changed"},
+  {Event_Exec,       "Execution failed",        "Execution succeeded",        "Execution changed",        "Execution not changed"},
+  {Event_Fsflag,     "Filesystem flags failed", "Filesystem flags succeeded", "Filesystem flags changed", "Filesystem flags not changed"},
+  {Event_Gid,        "GID failed",              "GID succeeded",              "GID changed",              "GID not changed"},
+  {Event_Heartbeat,  "Heartbeat failed",        "Heartbeat succeeded",        "Heartbeat changed",        "Heartbeat not changed"},
+  {Event_Icmp,       "ICMP failed",             "ICMP succeeded",             "ICMP changed",             "ICMP not changed"},
+  {Event_Instance,   "Monit instance failed",   "Monit instance succeeded",   "Monit instance changed",   "Monit instance not changed"},
+  {Event_Invalid,    "Invalid type",            "Type succeeded",             "Type changed",             "Type not changed"},
+  {Event_Nonexist,   "Does not exist",          "Exists",                     "Existence changed",        "Existence not changed"},
+  {Event_Permission, "Permission failed",       "Permission succeeded",       "Permission changed",       "Permission not changed"},
+  {Event_Pid,        "PID failed",              "PID succeeded",              "PID changed",              "PID not changed"},
+  {Event_PPid,       "PPID failed",             "PPID succeeded",             "PPID changed",             "PPID not changed"},
+  {Event_Resource,   "Resource limit matched",  "Resource limit succeeded",   "Resource limit changed",   "Resource limit not changed"},
+  {Event_Size,       "Size failed",             "Size succeeded",             "Size changed",             "Size not changed"},
+  {Event_Status,     "Status failed",           "Status succeeded",           "Status changed",           "Status not changed"},
+  {Event_Timeout,    "Timeout",                 "Timeout recovery",           "Timeout changed",          "Timeout not changed"},
+  {Event_Timestamp,  "Timestamp failed",        "Timestamp succeeded",        "Timestamp changed",        "Timestamp not changed"},
+  {Event_Uid,        "UID failed",              "UID succeeded",              "UID changed",              "UID not changed"},
+  {Event_Uptime,     "Uptime failed",           "Uptime succeeded",           "Uptime changed",           "Uptime not changed"},
+  /* Virtual events */
+  {Event_Null,       "No Event",                "No Event",                   "No Event",                 "No Event"}
+};
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void handle_event(Event_T);
+static void handle_action(Event_T, Action_T);
+static void Event_queue_add(Event_T);
+static void Event_queue_update(Event_T, const char *);
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Post a new Event
+ * @param service The Service the event belongs to
+ * @param id The event identification
+ * @param state The event state
+ * @param action Description of the event action
+ * @param s Optional message describing the event
+ */
+void Event_post(Service_T service, long id, short state, EventAction_T action, char *s, ...) {
+  Event_T e;
+
+  ASSERT(service);
+  ASSERT(action);
+  ASSERT(state == STATE_FAILED || state == STATE_SUCCEEDED || state == STATE_CHANGED || state == STATE_CHANGEDNOT);
+
+  if ((e = service->eventlist) == NULL) {
+    /* Only first failed/changed event can initialize the queue for given event type,
+     * thus succeeded events are ignored until first error. */
+    if (state == STATE_SUCCEEDED || state == STATE_CHANGEDNOT)
+      return;
+
+    /* Initialize event list and add first event. The manadatory informations
+     * are cloned so the event is as standalone as possible and may be saved
+     * to the queue without the dependency on the original service, thus
+     * persistent and managable across monit restarts */
+    NEW(e);
+    e->id = id;
+    gettimeofday(&e->collected, NULL);
+    e->source = Str_dup(service->name);
+    e->mode = service->mode;
+    e->type = service->type;
+    e->state = STATE_INIT;
+    e->state_map = 1;
+    e->action = action;
+    if (s) {
+      va_list ap;
+      va_start(ap, s);
+      e->message = Str_vcat(s, ap);
+      va_end(ap);
+    }
+    service->eventlist = e;
+  } else {
+    /* Try to find the event with the same origin and type identification.
+     * Each service and each test have its own custom actions object, so
+     * we share actions object address to identify event source. */
+    do {
+      if (e->action == action && e->id == id) {
+        gettimeofday(&e->collected, NULL);
+
+        /* Shift the existing event flags to the left
+         * and set the first bit based on actual state */
+        e->state_map <<= 1;
+        e->state_map |= ((state == STATE_SUCCEEDED || state == STATE_CHANGEDNOT) ? 0 : 1);
+
+        /* Update the message */
+        if (s) {
+          va_list ap;
+          FREE(e->message);
+          va_start(ap, s);
+          e->message = Str_vcat(s, ap);
+          va_end(ap);
+        }
+	break;
+      }
+      e = e->next;
+    } while (e);
+
+    if (!e) {
+      /* Only first failed/changed event can initialize the queue for given event type,
+       * thus succeeded events are ignored until first error. */
+      if (state == STATE_SUCCEEDED || state == STATE_CHANGEDNOT)
+        return;
+
+      /* Event was not found in the pending events list, we will add it.
+       * The manadatory informations are cloned so the event is as standalone
+       * as possible and may be saved to the queue without the dependency on
+       * the original service, thus persistent and managable across monit
+       * restarts */
+      NEW(e);
+      e->id = id;
+      gettimeofday(&e->collected, NULL);
+      e->source = Str_dup(service->name);
+      e->mode = service->mode;
+      e->type = service->type;
+      e->state = STATE_INIT;
+      e->state_map = 1;
+      e->action = action;
+      if (s) {
+        va_list ap;
+        va_start(ap, s);
+        e->message = Str_vcat(s, ap);
+        va_end(ap);
+      }
+      e->next = service->eventlist;
+      service->eventlist = e;
+    }
+  }
+
+  e->state_changed = Event_check_state(e, state);
+
+  /* In the case that the state changed, update it and reset the counter */
+  if (e->state_changed) {
+    e->state = state;
+    e->count = 1;
+  } else
+    e->count++;
+
+  handle_event(e);
+}
+
+
+/* -------------------------------------------------------------- Properties */
+
+
+/**
+ * Get the Service where the event orginated
+ * @param E An event object
+ * @return The Service where the event orginated
+ */
+Service_T Event_get_source(Event_T E) {
+  Service_T s = NULL;
+
+  ASSERT(E);
+
+  if (!(s = Util_getService(E->source)))
+    LogError("Service %s not found in monit configuration\n", E->source);
+
+  return s;
+}
+
+
+/**
+ * Get the Service name where the event orginated
+ * @param E An event object
+ * @return The Service name where the event orginated
+ */
+char *Event_get_source_name(Event_T E) {
+  ASSERT(E);
+  return (E->source);
+}
+
+
+/**
+ * Get the service type of the service where the event orginated
+ * @param E An event object
+ * @return The service type of the service where the event orginated
+ */
+int Event_get_source_type(Event_T E) {
+  ASSERT(E);
+  return (E->type);
+}
+
+
+/**
+ * Get the Event timestamp
+ * @param E An event object
+ * @return The Event timestamp
+ */
+struct timeval *Event_get_collected(Event_T E) {
+  ASSERT(E);
+  return &E->collected;
+}
+
+
+/**
+ * Get the Event raw state
+ * @param E An event object
+ * @return The Event raw state
+ */
+short Event_get_state(Event_T E) {
+  ASSERT(E);
+  return E->state;
+}
+
+
+/**
+ * Return the actual event state based on event state bitmap
+ * and event ratio needed to trigger the state change
+ * @param E An event object
+ * @param S Actual posted state
+ * @return The Event raw state
+ */
+short Event_check_state(Event_T E, short S) {
+  int       i;
+  int       count = 0;
+  short     state = (S == STATE_SUCCEEDED || S == STATE_CHANGEDNOT) ? 0 : 1; /* translate to 0/1 class */
+  Action_T  action;
+  Service_T service;
+  long long flag;
+
+  ASSERT(E);
+
+  if (!(service = Event_get_source(E)))
+    return TRUE;
+
+  /* Only true failed/changed state condition can change the initial state */
+  if (!state && E->state == STATE_INIT && !(service->error & E->id))
+    return FALSE;
+
+  action = !state ? E->action->succeeded : E->action->failed;
+
+  /* Compare as many bits as cycles able to trigger the action */
+  for (i = 0; i < action->cycles; i++) {
+    /* Check the state of the particular cycle given by the bit position */
+    flag = (E->state_map >> i) & 0x1;
+
+    /* Count occurences of the posted state */
+    if (flag == state)
+      count++;
+  }
+
+  /* the internal instance and action events are handled as changed any time since we need to deliver alert whenever it occurs */
+  if (E->id == Event_Instance || E->id == Event_Action || (count >= action->count && (S != E->state || S == STATE_CHANGED)))
+    return TRUE;
+  
+  return FALSE;
+}
+
+
+/**
+ * Get the Event type
+ * @param E An event object
+ * @return The Event type
+ */
+long Event_get_id(Event_T E) {
+  ASSERT(E);
+  return E->id;
+}
+
+
+/**
+ * Get the optionally Event message describing why the event was
+ * fired.
+ * @param E An event object
+ * @return The Event message. May be NULL
+ */
+const char *Event_get_message(Event_T E) {
+  ASSERT(E);
+  return E->message;
+}
+
+
+/**
+ * Get a textual description of actual event type.
+ * @param E An event object
+ * @return A string describing the event type in clear text. If the
+ * event type is not found NULL is returned.
+ */
+const char *Event_get_description(Event_T E) {
+  EventTable_T *et= Event_Table;
+
+  ASSERT(E);
+
+  while ((*et).id) {
+    if (E->id == (*et).id) {
+      switch (E->state) {
+        case STATE_SUCCEEDED:
+          return (*et).description_succeeded;
+        case STATE_FAILED:
+          return (*et).description_failed;
+        case STATE_INIT:
+          return (*et).description_failed;
+        case STATE_CHANGED:
+          return (*et).description_changed;
+        case STATE_CHANGEDNOT:
+          return (*et).description_changednot;
+        default:
+          break;
+      }
+    }
+    et++;
+  }
+  
+  return NULL;
+}
+
+
+/**
+ * Get an event action id.
+ * @param E An event object
+ * @return An action id
+ */
+short Event_get_action(Event_T E) {
+  Action_T A = NULL;
+
+  ASSERT(E);
+
+  switch (E->state) {
+    case STATE_SUCCEEDED:
+    case STATE_CHANGEDNOT:
+      A = E->action->succeeded;
+      break;
+    case STATE_FAILED:
+    case STATE_CHANGED:
+    case STATE_INIT:
+      A = E->action->failed;
+      break;
+    default:
+      break;
+  }
+
+  if (! A)
+    return ACTION_IGNORE;
+
+  /* In the case of passive mode we replace the description of start, stop
+   * or restart action for alert action, because these actions are passive in
+   * this mode */
+  return (E->mode == MODE_PASSIVE && ((A->id == ACTION_START) || (A->id == ACTION_STOP) || (A->id == ACTION_RESTART))) ? ACTION_ALERT : A->id;
+}
+
+
+/**
+ * Get a textual description of actual event action. For instance if the
+ * event type is possitive Event_Nonexist, the textual description of
+ * failed state related action is "restart". Likewise if the event type is
+ * negative Event_Checksumthe textual description of recovery related action
+ * is "alert" and so on.
+ * @param E An event object
+ * @return A string describing the event type in clear text. If the
+ * event type is not found NULL is returned.
+ */
+const char *Event_get_action_description(Event_T E) {
+  ASSERT(E);
+  return actionnames[Event_get_action(E)];
+}
+
+
+/**
+ * Reprocess the partially handled event queue
+ */
+void Event_queue_process() {
+  DIR           *dir = NULL;
+  FILE          *file = NULL;
+  struct dirent *de = NULL;
+  EventAction_T  ea = NULL;
+  Action_T       a = NULL;
+
+  /* return in the case that the eventqueue is not enabled or empty */
+  if (! Run.eventlist_dir || (! Run.handler_init && ! Run.handler_queue[HANDLER_ALERT] && ! Run.handler_queue[HANDLER_MMONIT]))
+    return;
+
+  if (! (dir = opendir(Run.eventlist_dir)) ) {
+    if (errno != ENOENT)
+      LogError("%s: cannot open the directory %s -- %s\n", prog, Run.eventlist_dir, STRERROR);
+    return;
+  }
+
+  if ((de = readdir(dir)))
+    DEBUG("Processing postponed events queue\n");
+
+  NEW(ea);
+  NEW(a);
+
+  while (de) {
+    size_t         size;
+    int            handlers_passed = 0;
+    int           *version = NULL;
+    short         *action = NULL;
+    Event_T        e = NULL;
+    struct stat    st;
+    char           file_name[STRLEN];
+
+    /* In the case that all handlers failed, skip the further processing in
+     * this cycle. Alert handler is currently defined anytime (either
+     * explicitly or localhost by default) */
+    if ( (Run.mmonits && FLAG(Run.handler_flag, HANDLER_MMONIT) && FLAG(Run.handler_flag, HANDLER_ALERT)) || FLAG(Run.handler_flag, HANDLER_ALERT))
+      break;
+
+    snprintf(file_name, STRLEN, "%s/%s", Run.eventlist_dir, de->d_name);
+
+    if (!stat(file_name, &st) && S_ISREG(st.st_mode)) {
+      DEBUG("%s: processing queued event %s\n", prog, file_name);
+
+      if (! (file = fopen(file_name, "r")) ) {
+        LogError("%s: queued event processing failed - cannot open the file %s -- %s\n", prog, file_name, STRERROR);
+        goto error1;
+      }
+
+      /* read event structure version */
+      if (!(version = file_readQueue(file, &size))) {
+        LogError("skipping queued event %s - unknown data format\n", file_name);
+        goto error2;
+      }
+      if (size != sizeof(int)) {
+        LogError("Aborting queued event %s - invalid size %d\n", file_name, size);
+        goto error3;
+      }
+      if (*version != EVENT_VERSION) {
+        LogError("Aborting queued event %s - incompatible data format version %d\n", file_name, *version);
+        goto error3;
+      }
+
+      /* read event structure */
+      if (!(e = file_readQueue(file, &size)))
+        goto error3;
+      if (size != sizeof(*e))
+        goto error4;
+
+      /* read source */
+      if (!(e->source = file_readQueue(file, &size)))
+        goto error4;
+
+      /* read message */
+      if (!(e->message = file_readQueue(file, &size)))
+        goto error5;
+
+      /* read event action */
+      if (!(action = file_readQueue(file, &size)))
+        goto error6;
+      if (size != sizeof(short))
+        goto error7;
+      a->id = *action;
+      if (e->state == STATE_FAILED)
+        ea->failed = a;
+      else
+        ea->succeeded = a;
+      e->action = ea;
+
+      /* Retry all remaining handlers */
+
+      /* alert */
+      if (e->flag & HANDLER_ALERT) {
+        if (Run.handler_init)
+          Run.handler_queue[HANDLER_ALERT]++;
+        if ((Run.handler_flag & HANDLER_ALERT) != HANDLER_ALERT) {
+          if ( handle_alert(e) != HANDLER_ALERT ) {
+            e->flag &= ~HANDLER_ALERT;
+            Run.handler_queue[HANDLER_ALERT]--;
+            handlers_passed++;
+          } else {
+            LogError("Alert handler failed, retry scheduled for next cycle\n");
+            Run.handler_flag |= HANDLER_ALERT;
+          }
+        }
+      }
+
+      /* mmonit */
+      if (e->flag & HANDLER_MMONIT) {
+        if (Run.handler_init)
+          Run.handler_queue[HANDLER_MMONIT]++;
+        if ((Run.handler_flag & HANDLER_MMONIT) != HANDLER_MMONIT) {
+          if ( handle_mmonit(e) != HANDLER_MMONIT ) {
+            e->flag &= ~HANDLER_MMONIT;
+            Run.handler_queue[HANDLER_MMONIT]--;
+            handlers_passed++;
+          } else {
+            LogError("M/Monit handler failed, retry scheduled for next cycle\n");
+            Run.handler_flag |= HANDLER_MMONIT;
+          }
+        }
+      }
+
+      /* If no error persists, remove it from the queue */
+      if (e->flag == HANDLER_SUCCEEDED) {
+        DEBUG("Removing queued event %s\n", file_name);
+        if (unlink(file_name) < 0)
+          LogError("Failed to remove queued event file '%s' -- %s\n", file_name, STRERROR);
+      } else if (handlers_passed > 0) {
+        DEBUG("Updating queued event %s (some handlers passed)\n", file_name);
+        Event_queue_update(e, file_name);
+      }
+
+error7:
+      FREE(action);
+error6:
+      FREE(e->message);
+error5:
+      FREE(e->source);
+error4:
+      FREE(e);
+error3:
+      FREE(version);
+error2:
+      fclose(file);
+    }
+error1:
+    de = readdir(dir);
+  }
+  Run.handler_init = FALSE;
+  closedir(dir);
+  FREE(a);
+  FREE(ea);
+  return;
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/*
+ * Handle the event
+ * @param E An event
+ */
+static void handle_event(Event_T E) {
+  Service_T S;
+
+  ASSERT(E);
+  ASSERT(E->action);
+  ASSERT(E->action->failed);
+  ASSERT(E->action->succeeded);
+
+  /* We will handle only first succeeded event, recurrent succeeded events
+   * or insufficient succeeded events during failed service state are
+   * ignored. Failed events are handled each time. */
+  if (!E->state_changed && (E->state == STATE_SUCCEEDED || E->state == STATE_CHANGEDNOT || ((E->state_map & 0x1) ^ 0x1)))
+    return;
+
+  S = Event_get_source(E);
+  if (!S) {
+    LogError("Event handling aborted\n");
+    return;
+  }
+
+  if (E->message) {
+    /* In the case that the service state is initializing yet and error
+     * occured, log it and exit. Succeeded events in init state are not
+     * logged. Instance and action events are logged always with priority
+     * info. */
+    if (E->state != STATE_INIT || E->state_map & 0x1) {
+      if (E->state == STATE_SUCCEEDED || E->state == STATE_CHANGEDNOT || E->id == Event_Instance || E->id == Event_Action)
+        LogInfo("'%s' %s\n", S->name, E->message);
+      else
+        LogError("'%s' %s\n", S->name, E->message);
+    }
+    if (E->state == STATE_INIT)
+      return;
+  }
+
+  if (E->state == STATE_FAILED || E->state == STATE_CHANGED) {
+    if (E->id != Event_Instance && E->id != Event_Action) { // We are not interested in setting error flag for instance and action events
+      S->error |= E->id;
+      /* The error hint provides second dimension for error bitmap and differentiates between failed/changed event states (failed=0, chaged=1) */
+      if (E->state == STATE_CHANGED)
+        S->error_hint |= E->id;
+      else
+        S->error_hint &= ~E->id;
+    }
+    handle_action(E, E->action->failed);
+  } else {
+    S->error &= ~E->id;
+    handle_action(E, E->action->succeeded);
+  }
+
+  /* Possible event state change was handled so we will reset the flag. */
+  E->state_changed = FALSE;
+}
+
+
+static void handle_action(Event_T E, Action_T A) {
+  Service_T s;
+
+  ASSERT(E);
+  ASSERT(A);
+
+  E->flag = HANDLER_SUCCEEDED;
+
+  if (A->id == ACTION_IGNORE)
+    return;
+
+  /* Alert and mmonit event notification are common actions */
+  E->flag |= handle_mmonit(E);
+  E->flag |= handle_alert(E);
+
+  /* In the case that some subhandler failed, enqueue the event for
+   * partial reprocessing */
+  if (E->flag != HANDLER_SUCCEEDED) {
+    if (Run.eventlist_dir)
+      Event_queue_add(E);
+    else
+      LogError("Aborting event\n");
+  }
+
+  if (!(s = Event_get_source(E))) {
+    LogError("Event action handling aborted\n");
+    return;
+  }
+
+  /* Action event is handled already. For Instance events
+   * we don't want actions like stop to be executed
+   * to prevent the disabling of system service monitoring */
+  if (A->id == ACTION_ALERT || E->id == Event_Instance) {
+    return;
+  } else if (A->id == ACTION_EXEC) {
+    LogInfo("'%s' exec: %s\n", s->name, A->exec->arg[0]);
+    spawn(s, A->exec, E);
+    return;
+  } else {
+    if (s->actionratelist && (A->id == ACTION_START || A->id == ACTION_RESTART))
+      s->nstart++;
+
+    if (s->mode == MODE_PASSIVE && (A->id == ACTION_START || A->id == ACTION_STOP  || A->id == ACTION_RESTART))
+      return;
+
+    control_service(s->name, A->id);
+  }
+}
+
+
+/**
+ * Add the partialy handled event to the global queue
+ * @param E An event object
+ */
+static void Event_queue_add(Event_T E) {
+  FILE        *file = NULL;
+  char         file_name[STRLEN];
+  int          version = EVENT_VERSION;
+  short        action = Event_get_action(E);
+  int          rv = FALSE;
+  mode_t       mask;
+
+  ASSERT(E);
+  ASSERT(E->flag != HANDLER_SUCCEEDED);
+
+  if (!file_checkQueueDirectory(Run.eventlist_dir, 0700)) {
+    LogError("%s: Aborting event - cannot access the directory %s\n", prog, Run.eventlist_dir);
+    return;
+  }
+    
+  if (!file_checkQueueLimit(Run.eventlist_dir, Run.eventlist_slots)) {
+    LogError("%s: Aborting event - queue over quota\n", prog);
+    return;
+  }
+    
+  /* compose the file name of actual timestamp and service name */
+  snprintf(file_name, STRLEN, "%s/%ld_%lx", Run.eventlist_dir, (long int)time(NULL), (long unsigned)E->source);
+
+  DEBUG("%s: Adding event to the queue file %s for later delivery\n", prog, file_name);
+
+  mask = umask(QUEUEMASK);
+  file = fopen(file_name, "w");
+  umask(mask);
+  if (! file) {
+    LogError("%s: Aborting event - cannot open the event file %s -- %s\n", prog, file_name, STRERROR);
+    return;
+  }
+
+  /* write event structure version */
+  if (!(rv = file_writeQueue(file, &version, sizeof(int))))
+    goto error;
+
+  /* write event structure */
+  if (!(rv = file_writeQueue(file, E, sizeof(*E))))
+    goto error;
+
+  /* write source */
+  if (!(rv = file_writeQueue(file, E->source, E->source ? strlen(E->source)+1 : 0)))
+    goto error;
+
+  /* write message */
+  if (!(rv = file_writeQueue(file, E->message, E->message ? strlen(E->message)+1 : 0)))
+    goto error;
+
+  /* write event action */
+  if (!(rv = file_writeQueue(file, &action, sizeof(short))))
+    goto error;
+
+  error:
+  fclose(file);
+  if (!rv) {
+    LogError("%s: Aborting event - unable to save event information to %s\n",  prog, file_name);
+    if (unlink(file_name) < 0)
+      LogError("Failed to remove event file '%s' -- %s\n", file_name, STRERROR);
+  } else {
+    if (!Run.handler_init && E->flag & HANDLER_ALERT)
+      Run.handler_queue[HANDLER_ALERT]++;
+    if (!Run.handler_init && E->flag & HANDLER_MMONIT)
+      Run.handler_queue[HANDLER_MMONIT]++;
+  }
+
+  return;
+}
+
+
+/**
+ * Update the partialy handled event in the global queue
+ * @param E An event object
+ * @param file_name File name
+ */
+static void Event_queue_update(Event_T E, const char *file_name) {
+  FILE        *file = NULL;
+  int          version = EVENT_VERSION;
+  short        action = Event_get_action(E);
+  int          rv = FALSE;
+  mode_t       mask;
+
+  ASSERT(E);
+  ASSERT(E->flag != HANDLER_SUCCEEDED);
+
+  if (!file_checkQueueDirectory(Run.eventlist_dir, 0700)) {
+    LogError("%s: Aborting event - cannot access the directory %s\n", prog, Run.eventlist_dir);
+    return;
+  }
+    
+  DEBUG("%s: Updating event in the queue file %s for later delivery\n", prog, file_name);
+
+  mask = umask(QUEUEMASK);
+  file = fopen(file_name, "w");
+  umask(mask);
+  if (! file)
+  {
+    LogError("%s: Aborting event - cannot open the event file %s -- %s\n", prog, file_name, STRERROR);
+    return;
+  }
+
+  /* write event structure version */
+  if (!(rv = file_writeQueue(file, &version, sizeof(int))))
+    goto error;
+
+  /* write event structure */
+  if (!(rv = file_writeQueue(file, E, sizeof(*E))))
+    goto error;
+
+  /* write source */
+  if (!(rv = file_writeQueue(file, E->source, E->source ? strlen(E->source)+1 : 0)))
+    goto error;
+
+  /* write message */
+  if (!(rv = file_writeQueue(file, E->message, E->message ? strlen(E->message)+1 : 0)))
+    goto error;
+
+  /* write event action */
+  if (!(rv = file_writeQueue(file, &action, sizeof(short))))
+    goto error;
+
+  error:
+  fclose(file);
+  if (!rv) {
+    LogError("%s: Aborting event - unable to update event information to %s\n",  prog, file_name);
+    if (unlink(file_name) < 0)
+      LogError("Failed to remove event file '%s' -- %s\n", file_name, STRERROR);
+  }
+
+  return;
+}
+
diff --git a/monit-5.4/src/event.h b/monit-5.4/src/event.h
new file mode 100644
index 0000000..8a739d5
--- /dev/null
+++ b/monit-5.4/src/event.h
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MONIT_EVENT_H
+#define MONIT_EVENT_H
+
+#include "monit.h"
+
+
+typedef enum {
+        Event_Null       = 0x0,
+        Event_Checksum   = 0x1,
+        Event_Resource   = 0x2,
+        Event_Timeout    = 0x4,
+        Event_Timestamp  = 0x8,
+        Event_Size       = 0x10,
+        Event_Connection = 0x20,
+        Event_Permission = 0x40,
+        Event_Uid        = 0x80,
+        Event_Gid        = 0x100,
+        Event_Nonexist   = 0x200,
+        Event_Invalid    = 0x400,
+        Event_Data       = 0x800,
+        Event_Exec       = 0x1000,
+        Event_Fsflag     = 0x2000,
+        Event_Icmp       = 0x4000,
+        Event_Content    = 0x8000,
+        Event_Instance   = 0x10000,
+        Event_Action     = 0x20000,
+        Event_Pid        = 0x40000,
+        Event_PPid       = 0x80000,
+        Event_Heartbeat  = 0x100000,
+        Event_Status     = 0x200000,
+        Event_Uptime     = 0x400000,
+        Event_All        = 0x7FFFFFFF
+} Event_Type;
+
+
+#define IS_EVENT_SET(value, mask) ((value & mask) != 0)
+
+typedef struct myeventtable {
+  int id;
+  char *description_failed;
+  char *description_succeeded;
+  char *description_changed;
+  char *description_changednot;
+} EventTable_T;
+
+extern EventTable_T Event_Table[];
+
+
+/**
+ * This class implements the <b>event</b> processing machinery used by
+ * monit. In monit an event is an object containing a Service_T
+ * reference indicating the object where the event orginated, an id
+ * specifying the event type, a value representing up or down state
+ * and an optional message describing why the event was fired.
+ *
+ * Clients may use the function Event_post() to post events to the
+ * event handler for processing.
+ * 
+ * @file
+ */
+
+
+/**
+ * Post a new Event
+ * @param service The Service the event belongs to
+ * @param id The event identification
+ * @param state The event state
+ * @param action Description of the event action
+ * @param s Optional message describing the event
+ */
+void Event_post(Service_T service, long id, short state, EventAction_T action, char *s, ...);
+
+
+/**
+ * Get the Service where the event orginated
+ * @param E An event object
+ * @return The Service where the event orginated
+ */
+Service_T Event_get_source(Event_T E);
+
+
+/**
+ * Get the Service name where the event orginated
+ * @param E An event object
+ * @return The Service name where the event orginated
+ */
+char *Event_get_source_name(Event_T E);
+
+
+/**
+ * Get the service type of the service where the event orginated
+ * @param E An event object
+ * @return The service type of the service where the event orginated
+ */
+int Event_get_source_type(Event_T E);
+
+
+/**
+ * Get the Event timestamp
+ * @param E An event object
+ * @return The Event timestamp
+ */
+struct timeval *Event_get_collected(Event_T E);
+
+
+/**
+ * Get the Event raw state
+ * @param E An event object
+ * @return The Event raw state
+ */
+short Event_get_state(Event_T E);
+
+
+/**
+ * Return the actual event state based on event state bitmap
+ * and event ratio needed to trigger the state change
+ * @param E An event object
+ * @param S Actual posted state
+ * @return The Event raw state
+ */
+short Event_check_state(Event_T E, short S);
+
+
+/**
+ * Get the Event type
+ * @param E An event object
+ * @return The Event type
+ */
+long Event_get_id(Event_T E);
+
+
+/**
+ * Get the optionally Event message describing why the event was
+ * fired.
+ * @param E An event object
+ * @return The Event message. May be NULL
+ */
+const char *Event_get_message(Event_T E);
+
+
+/**
+ * Get a textual description of actual event type. For instance if the
+ * event type is possitive Event_Timestamp, the textual description is
+ * "Timestamp error". Likewise if the event type is negative Event_Checksum 
+ * the textual description is "Checksum recovery" and so on.
+ * @param E An event object
+ * @return A string describing the event type in clear text. If the
+ * event type is not found NULL is returned.
+ */
+const char *Event_get_description(Event_T E);
+
+
+/**
+ * Get an event action id.
+ * @param E An event object
+ * @return An action id
+ */
+short Event_get_action(Event_T E);
+
+
+/**
+ * Get a textual description of actual event action. For instance if the
+ * event type is possitive Event_Nonexist, the textual description of
+ * failed state related action is "restart". Likewise if the event type is
+ * negative Event_Checksum the textual description of recovery related action
+ * is "alert" and so on.
+ * @param E An event object
+ * @return A string describing the event type in clear text. If the
+ * event type is not found NULL is returned.
+ */
+const char *Event_get_action_description(Event_T E);
+
+
+/**
+ * Reprocess the partialy handled event queue
+ */
+void Event_queue_process();
+
+
+#endif
diff --git a/monit-5.4/src/file.c b/monit-5.4/src/file.c
new file mode 100644
index 0000000..82bffb6
--- /dev/null
+++ b/monit-5.4/src/file.c
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#include "monit.h"
+
+/**
+ *  Utilities for managing files used by monit.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Initialize the programs file variables
+ */
+void file_init() {
+  
+  char pidfile[STRLEN];
+  char buf[STRLEN];
+  
+  /* Check if the pidfile was already set during configfile parsing */
+  if(Run.pidfile == NULL) {
+    /* Set the location of this programs pidfile */
+    if(! getuid()) {
+      snprintf(pidfile, STRLEN, "%s/%s", MYPIDDIR, MYPIDFILE);
+    } else {
+      snprintf(pidfile, STRLEN, "%s/.%s", Run.Env.home, MYPIDFILE);
+    }
+    Run.pidfile= Str_dup(pidfile);
+  }
+
+  /* Set the location of monit's id file */
+  if(Run.idfile == NULL) {
+    snprintf(buf, STRLEN, "%s/.%s", Run.Env.home, MYIDFILE);
+    Run.idfile= Str_dup(buf);
+  }
+  Util_monitId(Run.idfile);
+
+  /* Set the location of monit's state file */
+  if(Run.statefile == NULL) {
+    snprintf(buf, STRLEN, "%s/.%s", Run.Env.home, MYSTATEFILE);
+    Run.statefile= Str_dup(buf);
+  }
+  
+}
+
+
+/**
+ * Finalize and remove temporary files and make sure Monit id file exist
+ */
+void file_finalize() {
+  unlink(Run.pidfile);
+  // Make sure that Monit id file exist
+  if (! file_exist(Run.idfile)) {
+    FILE *f =  fopen(Run.idfile,"w");
+    if (! f) {
+      LogError("%s: Error opening Monit id file '%s' for writing -- %s\n", prog, Run.idfile, STRERROR);
+    } else {
+      fprintf(f, "%s\n", Run.id);
+      fclose(f);
+    }
+  }
+}
+
+
+/**
+ * Get a object's last modified timestamp.
+ * @param object A object to stat
+ * @param type Requested object's type
+ * @return Max of either st_mtime or st_ctime or
+ * FALSE if not found or different type of object
+ */
+time_t file_getTimestamp(char *object, mode_t type) {
+  
+  struct stat buf;
+
+  ASSERT(object);
+
+  if(! stat(object, &buf)) {
+    if(((type == S_IFREG) && S_ISREG(buf.st_mode)) ||
+       ((type == S_IFDIR) && S_ISDIR(buf.st_mode)) ||
+       ((type == (S_IFREG|S_IFDIR)) && (S_ISREG(buf.st_mode) ||
+					S_ISDIR(buf.st_mode)))
+       ) {
+      return MAX(buf.st_mtime, buf.st_ctime);
+    } else {
+      LogError("%s: Invalid object type - %s\n", prog, object);
+    }
+  }
+
+  return FALSE;
+  
+}
+
+
+/**
+ * Search the system for the monit control file. Try first ~/.monitrc,
+ * if that fails try /etc/monitrc, then SYSCONFDIR/monitrc (default:
+ * /usr/local/etc/monitrc) and finally ./monitrc.
+ * Exit the application if the control file was not found.
+ * @return The location of monits control file (monitrc)
+ */
+char *file_findControlFile() {
+
+  char *rcfile= CALLOC(sizeof(char), STRLEN + 1);
+  
+  snprintf(rcfile, STRLEN, "%s/.%s", Run.Env.home, MONITRC);
+  if(file_exist(rcfile)) {
+    return rcfile;
+  }
+  snprintf(rcfile, STRLEN, "/etc/%s", MONITRC);
+  if(file_exist(rcfile)) {
+    return rcfile;
+  }
+  snprintf(rcfile, STRLEN, "%s/%s", SYSCONFDIR, MONITRC);
+  if(file_exist(rcfile)) {
+    return rcfile;
+  }
+  snprintf(rcfile, STRLEN, "/usr/local/etc/%s", MONITRC);
+  if(file_exist(rcfile)) {
+    return rcfile;
+  }
+  if(file_exist(MONITRC)) {
+    snprintf(rcfile, STRLEN, "%s/%s", Run.Env.cwd, MONITRC);
+    return rcfile;
+  }
+  LogError("%s: Cannot find the control file at ~/.%s, /etc/%s, %s/%s, /usr/local/etc/%s or at ./%s \n",
+      prog, MONITRC, MONITRC, SYSCONFDIR, MONITRC, MONITRC, MONITRC);
+  exit(1);
+  
+}
+
+
+/**
+ * Create a program's pidfile - Such a file is created when in daemon
+ * mode. The file is created with mask = MYPIDMASK (usually 644).  
+ * @param pidfile The name of the pidfile to create
+ * @return TRUE if the file was created, otherwise FALSE. 
+ */
+int file_createPidFile(char *pidfile) {
+  
+  FILE *F= NULL;
+  
+  ASSERT(pidfile);
+  
+  umask(MYPIDMASK);
+  unlink(pidfile);
+  if ((F= fopen(pidfile,"w")) == (FILE *)NULL) {
+    LogError("%s: Error opening pidfile '%s' for writing -- %s\n", prog, pidfile, STRERROR);
+    return(FALSE);
+  }
+  fprintf(F, "%d\n", (int)getpid());
+  fclose(F);
+
+  return TRUE;
+  
+}
+
+
+/**
+ * Check if the file is a regular file
+ * @param file A path to the file to check
+ * @return TRUE if file exist and is a regular file, otherwise FALSE
+ */
+int file_isFile(char *file) {
+  
+  struct stat buf;
+  
+  ASSERT(file);
+
+  return (stat(file, &buf) == 0 && S_ISREG(buf.st_mode));
+  
+}
+
+
+/**
+ * Check if this is a directory.
+ * @param dir An absolute  directory path
+ * @return TRUE if dir exist and is a regular directory, otherwise
+ * FALSE
+ */
+int file_isDirectory(char *dir) {
+  
+	struct stat buf;
+  
+  ASSERT(dir);
+	
+  return (stat(dir, &buf) == 0 && S_ISDIR(buf.st_mode));
+  
+}
+
+
+/**
+ * Check if this is a fifo
+ * @param fifo A path to the fifo to check
+ * @return TRUE if fifo exist, otherwise FALSE
+ */
+int file_isFifo(char *fifo) {
+  
+  struct stat buf;
+  
+  ASSERT(fifo);
+
+  return (stat(fifo, &buf) == 0 && S_ISFIFO(buf.st_mode));
+  
+}
+
+
+/**
+ * Check if the file exist on the system
+ * @file A path to the file to check
+ * @return TRUE if file exist otherwise FALSE
+ */
+int file_exist(char *file) {
+  
+  struct stat buf;
+  
+  ASSERT(file);
+
+  return (stat(file, &buf) == 0);
+  
+}
+
+
+/**
+ * Security check for files. The files must have the same uid as the
+ * REAL uid of this process, it must have permissions no greater than
+ * "maxpermission".
+ * @param filename The filename of the checked file
+ * @param description The description of the checked file
+ * @param permmask The permission mask for the file
+ * @return TRUE if the test succeeded otherwise FALSE
+ */
+int file_checkStat(char *filename, char *description, int permmask) {
+  struct stat buf;
+  errno= 0;
+
+  ASSERT(filename);
+  ASSERT(description);
+
+  if(stat(filename, &buf) < 0) {
+    LogError("%s: Cannot stat the %s '%s' -- %s\n", prog, description, filename, STRERROR);
+    return FALSE;
+  }
+  if(!S_ISREG(buf.st_mode)) {
+    LogError("%s: The %s '%s' is not a regular file.\n", prog, description,  filename);
+    return FALSE;
+  }
+  if(buf.st_uid != geteuid())  {
+    LogError("%s: The %s '%s' must be owned by you.\n", prog, description, filename);
+    return FALSE;
+  }
+  if((buf.st_mode & 0777 ) & ~permmask) {
+    /* 
+       Explanation: 
+
+           buf.st_mode & 0777 ->  We just want to check the
+                                  permissions not the file type... 
+                                  we did it already!
+           () & ~permmask ->      We check if there are any other
+                                  permissions set than in permmask 
+    */
+    LogError("%s: The %s '%s' must have permissions no more than -%c%c%c%c%c%c%c%c%c (0%o); right now permissions are -%c%c%c%c%c%c%c%c%c (0%o).\n", 
+	prog, description, filename, 
+	permmask&S_IRUSR?'r':'-',
+	permmask&S_IWUSR?'w':'-',
+	permmask&S_IXUSR?'x':'-',
+	permmask&S_IRGRP?'r':'-',
+	permmask&S_IWGRP?'w':'-',
+	permmask&S_IXGRP?'x':'-',
+	permmask&S_IROTH?'r':'-',
+	permmask&S_IWOTH?'w':'-',
+	permmask&S_IXOTH?'x':'-',
+	permmask&0777,
+	buf.st_mode&S_IRUSR?'r':'-',
+	buf.st_mode&S_IWUSR?'w':'-',
+	buf.st_mode&S_IXUSR?'x':'-',
+	buf.st_mode&S_IRGRP?'r':'-',
+	buf.st_mode&S_IWGRP?'w':'-',
+	buf.st_mode&S_IXGRP?'x':'-',
+	buf.st_mode&S_IROTH?'r':'-',
+	buf.st_mode&S_IWOTH?'w':'-',
+	buf.st_mode&S_IXOTH?'x':'-',
+	buf.st_mode& 0777);
+    return FALSE;
+  }
+  
+  return TRUE;
+
+}
+
+
+/**
+ * Check whether the specified directory exist or create it using
+ * specified mode.
+ * @param path The fully qualified path to the directory
+ * @param mode The permission for the directory
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_checkQueueDirectory(char *path, mode_t mode) {
+  struct stat st;
+
+  if(stat(path, &st)) {
+    if(errno == ENOENT) {
+      int rv;
+      mode_t mask = umask(QUEUEMASK);
+      rv = mkdir(path, mode);
+      umask(mask);
+      if(rv) {
+        LogError("%s: cannot create the event queue directory %s -- %s\n",
+          prog, path, STRERROR);
+        return FALSE;
+      }
+    } else {
+      LogError("%s: cannot read the event queue directory %s -- %s\n",
+        prog, path, STRERROR);
+      return FALSE;
+    }
+  } else if(! S_ISDIR(st.st_mode)) {
+    LogError("%s: event queue: the %s is not the directory\n", prog, path);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+
+/**
+ * Check the queue size limit.
+ * @param path The fully qualified path to the directory
+ * @param limit The queue limit
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_checkQueueLimit(char *path, int limit) {
+  int            used = 0;
+  DIR           *dir = NULL;
+  struct dirent *de = NULL;
+
+  if(limit < 0)
+    return TRUE;
+
+  if(! (dir = opendir(path)) ) {
+    LogError("%s: cannot open the event queue directory %s -- %s\n", prog, path, STRERROR);
+    return FALSE;
+  }
+  while( (de = readdir(dir)) ) {
+    struct stat st;
+
+    if(!stat(de->d_name, &st) && S_ISREG(st.st_mode) && ++used > limit) {
+      LogError("%s: event queue full\n", prog);
+      closedir(dir);
+      return FALSE;
+    }
+  }
+  closedir(dir);
+  return TRUE;
+}
+
+
+/**
+ * Write data to the queue file
+ * @param file Filedescriptor to write to
+ * @param data Data to be written
+ * @param size Size of the data to be written
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_writeQueue(FILE *file, void *data, size_t size) {
+  size_t rv;
+
+  ASSERT(file);
+
+  /* write size */
+  if((rv = fwrite(&size, 1, sizeof(size_t), file)) != sizeof(size_t)) {
+    if (feof(file) || ferror(file))
+      LogError("%s: queued event file: unable to write event size -- %s\n", prog, feof(file) ? "end of file" : "stream error");
+    else
+      LogError("%s: queued event file: unable to write event size -- read returned %d bytes\n", prog, rv);
+    return FALSE;
+  }
+
+  /* write data if any */
+  if(size > 0) {
+    if((rv = fwrite(data, 1, size, file)) != size) {
+      if (feof(file) || ferror(file))
+        LogError("%s: queued event file: unable to write event size -- %s\n", prog, feof(file) ? "end of file" : "stream error");
+      else
+        LogError("%s: queued event file: unable to write event size -- read returned %d bytes\n", prog, rv);
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
+
+/**
+ * Read the data from the queue file's actual position
+ * @param file Filedescriptor to read from
+ * @param size Size of the data read
+ * @return The data read if any or NULL. The size parameter is set
+ * appropriately.
+ */
+void *file_readQueue(FILE *file, size_t *size) {
+  size_t rv;
+  void *data = NULL;
+
+  ASSERT(file);
+
+  /* read size */
+  if((rv = fread(size, 1, sizeof(size_t), file)) != sizeof(size_t)) {
+    if (feof(file) || ferror(file))
+      LogError("%s: queued event file: unable to read event size -- %s\n", prog, feof(file) ? "end of file" : "stream error");
+    else
+      LogError("%s: queued event file: unable to read event size -- read returned %d bytes\n", prog, rv);
+    return NULL;
+  }
+
+  /* read data if any (allow 1MB at maximum to prevent enormous memory allocation) */
+  if(*size > 0 && *size < 1048576) {
+    data = CALLOC(1, *size);
+    if((rv = fread(data, 1, *size, file)) != *size) {
+      FREE(data);
+      if (feof(file) || ferror(file))
+        LogError("%s: queued event file: unable to read event data -- %s\n", prog, feof(file) ? "end of file" : "stream error");
+      else
+        LogError("%s: queued event file: unable to read event data -- read returned %d bytes\n", prog, rv);
+      return NULL;
+    }
+  }
+  return data;
+}
+
diff --git a/monit-5.4/src/file.h b/monit-5.4/src/file.h
new file mode 100644
index 0000000..453b8b0
--- /dev/null
+++ b/monit-5.4/src/file.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_FILE_H
+#define MONIT_FILE_H
+
+
+/**
+ *  Utilities used for managing files used by monit.
+ *
+ *  @file
+ */
+
+
+/**
+ * Initialize the programs file variables
+ */
+void file_init();
+
+
+/**
+ * Finalize and remove temporary files
+ */
+void file_finalize();
+
+
+/**
+ * Get a object's last modified timestamp.
+ * @param object A object to stat
+ * @param type Requested object's type
+ * @return Max of either st_mtime or st_ctime or
+ * FALSE if not found or different type of object
+ */
+time_t file_getTimestamp(char *object, mode_t type);
+
+
+/**
+ * Search the system for the monit control file. Try first ~/.monitrc,
+ * if that fails try /etc/monitrc, then /usr/local/etc/monitrc and
+ * finally ./monitrc.  Exit the application if the control file was
+ * not found.
+ * @return The location of monits control file (monitrc)
+ */
+char *file_findControlFile();
+
+
+/**
+ * Create a program's pidfile - Such a file is created when in daemon
+ * mode. The file is created with mask = MYPIDMASK (usually 644).  
+ * @param pidfile The name of the pidfile to create
+ * @return TRUE if the file was created, otherwise FALSE. 
+ */
+int file_createPidFile(char *pidfile);
+
+
+/**
+ * Check if the file is a regular file
+ * @param file A path to the file to check
+ * @return TRUE if file exist and is a regular file, otherwise FALSE
+ */
+int file_isFile(char *file);
+
+
+/**
+ * Check if this is a directory.
+ * @param dir An absolute  directory path
+ * @return TRUE if dir exist and is a regular directory, otherwise
+ * FALSE
+ */
+int file_isDirectory(char *dir);
+
+
+/**
+ * Check if this is a fifo
+ * @param fifo A path to the fifo to check
+ * @return TRUE if fifo exist, otherwise FALSE
+ */
+int file_isFifo(char *fifo);
+
+
+/**
+ * Check if the file exist on the system
+ * @file A path to the file to check
+ * @return TRUE if file exist otherwise FALSE
+ */
+int file_exist(char *file);
+
+
+/**
+ * Security check for files. The files must have the same uid as the
+ * REAL uid of this process, it must have permissions no greater than
+ * "maxpermission" and it must not be a symbolic link.  We check these
+ * conditions here.
+ * @param filename The filename of the checked file
+ * @param description The description of the checked file
+ * @param permmask The permission mask for the file
+ * @return TRUE if the test succeeded otherwise FALSE
+ */
+int file_checkStat(char *filename, char *description, int permmask);
+
+
+/**
+ * Check whether the specified directory exist or create it using
+ * specified mode.
+ * @param path The fully qualified path to the directory
+ * @param mode The permission for the directory
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_checkQueueDirectory(char *path, mode_t mode);
+
+
+/**
+ * Check the queue size limit.
+ * @param path The fully qualified path to the directory
+ * @param mode The queue limit
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_checkQueueLimit(char *path, int limit);
+
+
+/**
+ * Write data to the queue file
+ * @param file Filedescriptor to write to
+ * @param data Data to be written
+ * @param size Size of the data to be written
+ * @return TRUE if the succeeded otherwise FALSE
+ */
+int file_writeQueue(FILE *file, void *data, size_t size);
+
+
+/**
+ * Read the data from the queue file's actual position
+ * @param file Filedescriptor to read from
+ * @param size Size of the data read
+ * @return The data read if any or NULL. The size parameter is set
+ * appropriately.
+ */
+void *file_readQueue(FILE *file, size_t *size);
+
+
+#endif
diff --git a/monit-5.4/src/gc.c b/monit-5.4/src/gc.c
new file mode 100644
index 0000000..d03a4e3
--- /dev/null
+++ b/monit-5.4/src/gc.c
@@ -0,0 +1,654 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include "monit.h"
+#include "protocol.h"
+#include "process.h"
+#include "ssl.h"
+#include "engine.h"
+
+
+/* Private prototypes */
+static void _gc_service_list(Service_T *);
+static void _gc_service(Service_T *);
+static void _gc_servicegroup(ServiceGroup_T *);
+static void _gc_servicegroup_member(ServiceGroupMember_T *);
+static void _gc_mail_server(MailServer_T *);
+static void _gcppl(Port_T *);
+static void _gcfilesystem(Filesystem_T *);
+static void _gcicmp(Icmp_T *);
+static void _gcpql(Resource_T *);
+static void _gcptl(Timestamp_T *);
+static void _gcparl(ActionRate_T *);
+static void _gc_action(Action_T *);
+static void _gc_eventaction(EventAction_T *);
+static void _gc_inf(Info_T *);
+static void _gcpdl(Dependant_T *);
+static void _gcso(Size_T *);
+static void _gcmatch(Match_T *);
+static void _gcchecksum(Checksum_T *);
+static void _gcperm(Perm_T *);
+static void _gcprogram(Program_T *);
+static void _gcuid(Uid_T *);
+static void _gcgid(Gid_T *);
+static void _gcgrc(Generic_T *);
+static void _gcath(Auth_T *);
+static void _gc_mmonit(Mmonit_T *);
+static void _gc_url(URL_T *);
+static void _gc_request(Request_T *);
+
+
+/**
+ *  Release allocated memory.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+void gc() {
+        
+        destroy_hosts_allow();
+        
+        if(Run.doprocess) {
+                delprocesstree(&oldptree, &oldptreesize);
+                delprocesstree(&ptree, &ptreesize);
+        }
+        
+        if(servicelist)
+                _gc_service_list(&servicelist);
+        
+        if(servicegrouplist)
+                _gc_servicegroup(&servicegrouplist);
+        
+        if(Run.credentials)
+                _gcath(&Run.credentials);
+        
+        if(Run.maillist)
+                gc_mail_list(&Run.maillist);
+        
+        if(Run.mailservers)
+                _gc_mail_server(&Run.mailservers);
+        
+        if(Run.mmonits)
+                _gc_mmonit(&Run.mmonits);
+        
+        if(Run.eventlist)
+                gc_event(&Run.eventlist);
+        
+        FREE(Run.eventlist_dir);
+        FREE(Run.mygroup);
+        FREE(Run.localhostname);
+        FREE(Run.httpsslpem);
+        FREE(Run.httpsslclientpem);
+        FREE(Run.bind_addr);
+        FREE(Run.MailFormat.from);
+        FREE(Run.MailFormat.subject);
+        FREE(Run.MailFormat.message);
+        FREE(Run.mail_hostname);
+        
+}
+
+
+void gc_mail_list(Mail_T *m) {
+        
+        ASSERT(m);
+        
+        if((*m)->next)
+                gc_mail_list(&(*m)->next);
+        
+        FREE((*m)->to);
+        FREE((*m)->from);
+        FREE((*m)->replyto);
+        FREE((*m)->subject);
+        FREE((*m)->message);
+        FREE(*m);
+        
+}
+
+
+void gccmd(command_t *c) {
+        
+        int i;
+        
+        ASSERT(c&&*c);
+        
+        for(i= 0; (*c)->arg[i]; i++)
+                FREE((*c)->arg[i]);
+        FREE(*c);
+        
+}
+
+
+void gc_event(Event_T *e) {
+        
+        ASSERT(e&&*e);
+        
+        if((*e)->next)
+                gc_event(&(*e)->next);
+        
+        (*e)->action= NULL;
+        FREE((*e)->source);
+        FREE((*e)->message);
+        FREE(*e);
+        
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static void _gc_service_list(Service_T *s) {
+        
+        ASSERT(s&&*s);
+        
+        if((*s)->next)
+                _gc_service_list(&(*s)->next);
+        
+        _gc_service(&(*s));
+        
+}
+
+
+static void _gc_service(Service_T *s) {
+        
+        ASSERT(s&&*s);
+        
+        if((*s)->portlist)
+                _gcppl(&(*s)->portlist);
+        
+        if((*s)->filesystemlist)
+                _gcfilesystem(&(*s)->filesystemlist);
+        
+        if((*s)->icmplist)
+                _gcicmp(&(*s)->icmplist);
+        
+        if((*s)->maillist)
+                gc_mail_list(&(*s)->maillist);
+        
+        if((*s)->resourcelist)
+                _gcpql(&(*s)->resourcelist);
+        
+        if((*s)->inf)
+                _gc_inf(&(*s)->inf);
+        
+        if((*s)->timestamplist)
+                _gcptl(&(*s)->timestamplist);
+        
+        if((*s)->actionratelist)
+                _gcparl(&(*s)->actionratelist);
+        
+        if((*s)->sizelist)
+                _gcso(&(*s)->sizelist);
+        
+        if((*s)->matchlist)
+                _gcmatch(&(*s)->matchlist);
+        
+        if((*s)->matchignorelist)
+                _gcmatch(&(*s)->matchignorelist);
+        
+        if((*s)->checksum)
+                _gcchecksum(&(*s)->checksum);
+        
+        if((*s)->perm)
+                _gcperm(&(*s)->perm);
+        
+        if ((*s)->program)
+                _gcprogram(&(*s)->program);
+        
+        if ((*s)->every.type == EVERY_CRON || (*s)->every.type == EVERY_NOTINCRON)
+                FREE((*s)->every.spec.cron);
+        
+        if((*s)->uid)
+                _gcuid(&(*s)->uid);
+        
+        if((*s)->gid)
+                _gcgid(&(*s)->gid);
+        
+        if((*s)->dependantlist)
+                _gcpdl(&(*s)->dependantlist);
+        
+        if((*s)->start)
+                gccmd(&(*s)->start);
+        
+        if((*s)->stop)
+                gccmd(&(*s)->stop);
+        
+        if((*s)->action_DATA)
+                _gc_eventaction(&(*s)->action_DATA);
+        
+        if((*s)->action_EXEC)
+                _gc_eventaction(&(*s)->action_EXEC);
+        
+        if((*s)->action_INVALID)
+                _gc_eventaction(&(*s)->action_INVALID);
+        
+        if((*s)->action_NONEXIST)
+                _gc_eventaction(&(*s)->action_NONEXIST);
+        
+        if((*s)->action_PID)
+                _gc_eventaction(&(*s)->action_PID);
+        
+        if((*s)->action_PPID)
+                _gc_eventaction(&(*s)->action_PPID);
+        
+        if((*s)->action_FSFLAG)
+                _gc_eventaction(&(*s)->action_FSFLAG);
+        
+        if((*s)->action_MONIT_START)
+                _gc_eventaction(&(*s)->action_MONIT_START);
+        
+        if((*s)->action_MONIT_STOP)
+                _gc_eventaction(&(*s)->action_MONIT_STOP);
+        
+        if((*s)->action_MONIT_RELOAD)
+                _gc_eventaction(&(*s)->action_MONIT_RELOAD);
+        
+        if((*s)->action_ACTION)
+                _gc_eventaction(&(*s)->action_ACTION);
+        
+        if((*s)->eventlist)
+                gc_event(&(*s)->eventlist);
+        
+        FREE((*s)->name);
+        FREE((*s)->path);
+        
+        (*s)->next= NULL;
+        
+        FREE(*s);
+        
+}
+
+
+static void _gc_servicegroup(ServiceGroup_T *sg) {
+        ASSERT(sg && *sg);
+        
+        if((*sg)->next)
+                _gc_servicegroup(&(*sg)->next);
+        
+        if((*sg)->members)
+                _gc_servicegroup_member(&(*sg)->members);
+        FREE((*sg)->name);
+        FREE(*sg);
+}
+
+
+static void _gc_servicegroup_member(ServiceGroupMember_T *m) {
+        ASSERT(m && *m);
+        
+        if((*m)->next)
+                _gc_servicegroup_member(&(*m)->next);
+        
+        FREE((*m)->name);
+        FREE(*m);
+}
+
+
+static void _gc_request(Request_T *r) {
+        
+        ASSERT(r);
+        
+        if((*r)->url)
+                _gc_url(&(*r)->url);
+#ifdef HAVE_REGEX_H
+        if ((*r)->regex)
+                regfree((*r)->regex);
+#endif
+        FREE((*r)->regex);
+        FREE(*r);
+        
+}
+
+
+static void _gc_url(URL_T *url) {
+        
+        ASSERT(url);
+        
+        FREE((*url)->url);
+        FREE((*url)->protocol);
+        FREE((*url)->user);
+        FREE((*url)->password);
+        FREE((*url)->hostname);
+        FREE((*url)->path);
+        FREE((*url)->query);
+        FREE(*url);
+        
+}
+
+
+static void _gc_mail_server(MailServer_T *s) {
+        
+        if (! s || ! *s)
+                return;
+        
+        if ((*s)->next)
+                _gc_mail_server(&(*s)->next);
+        
+        FREE((*s)->host);
+        FREE((*s)->username);
+        FREE((*s)->password);
+        FREE((*s)->ssl.certmd5);
+        FREE((*s)->ssl.clientpemfile);
+        FREE(*s);
+        
+}
+
+
+static void _gc_action(Action_T *a) {
+        
+        ASSERT(a&&*a);
+        
+        if((*a)->exec)
+                gccmd(&(*a)->exec);
+        FREE(*a);
+        
+}
+
+
+static void _gc_eventaction(EventAction_T *e) {
+        
+        ASSERT(e&&*e);
+        
+        _gc_action(&(*e)->failed);
+        _gc_action(&(*e)->succeeded);
+        FREE(*e);
+        
+}
+
+
+static void _gcppl(Port_T *p) {
+        
+        ASSERT(p&&*p);
+        
+        if((*p)->next)
+                _gcppl(&(*p)->next);
+        
+        if((*p)->action)
+                _gc_eventaction(&(*p)->action);
+        if((*p)->generic)
+                _gcgrc(&(*p)->generic);
+        if((*p)->url_request)
+                _gc_request(&(*p)->url_request);
+        
+        FREE((*p)->request);
+        FREE((*p)->hostname);
+        FREE((*p)->pathname);
+        FREE((*p)->SSL.certmd5);
+        FREE((*p)->SSL.clientpemfile);
+        FREE((*p)->request_checksum);
+        FREE((*p)->request_hostheader);
+        FREE(*p);
+}
+
+
+static void _gcfilesystem(Filesystem_T *d) {
+        
+        ASSERT(d&&*d);
+        
+        if((*d)->next)
+                _gcfilesystem(&(*d)->next);
+        
+        if((*d)->action)
+                _gc_eventaction(&(*d)->action);
+        
+        FREE(*d);
+        
+}
+
+
+static void _gcicmp(Icmp_T *i) {
+        
+        ASSERT(i&&*i);
+        
+        if((*i)->next)
+                _gcicmp(&(*i)->next);
+        
+        if((*i)->action)
+                _gc_eventaction(&(*i)->action);
+        
+        FREE(*i);
+        
+}
+
+
+static void _gcpql(Resource_T *q) {
+        
+        ASSERT(q);
+        
+        if((*q)->next)
+                _gcpql(&(*q)->next);
+        
+        if((*q)->action)
+                _gc_eventaction(&(*q)->action);
+        
+        FREE(*q);
+        
+}
+
+
+static void _gc_inf(Info_T *i) {
+        ASSERT(i);
+        FREE(*i);
+}
+
+
+static void _gcptl(Timestamp_T *p) {
+        ASSERT(p);
+        
+        if((*p)->next)
+                _gcptl(&(*p)->next);
+        
+        if((*p)->action)
+                _gc_eventaction(&(*p)->action);
+        
+        FREE(*p);
+}
+
+
+static void _gcparl(ActionRate_T *ar) {
+        ASSERT(ar);
+        
+        if((*ar)->next)
+                _gcparl(&(*ar)->next);
+        
+        if((*ar)->action)
+                _gc_eventaction(&(*ar)->action);
+        
+        FREE(*ar);
+}
+
+
+static void _gcso(Size_T *s) {
+        
+        ASSERT(s);
+        
+        if((*s)->next)
+                _gcso(&(*s)->next);
+        
+        if((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE(*s);
+        
+}
+
+static void _gcmatch(Match_T *s) {
+        
+        ASSERT(s);
+        
+        if((*s)->next)
+                _gcmatch(&(*s)->next);
+        
+        if((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE((*s)->match_path);
+        FREE((*s)->match_string);
+        
+#ifdef HAVE_REGEX_H
+        if((*s)->regex_comp) {
+                regfree((*s)->regex_comp);
+                FREE((*s)->regex_comp);
+        }
+#endif
+        
+        FREE(*s);
+        
+}
+
+
+static void _gcchecksum(Checksum_T *s) {
+        ASSERT(s);
+        
+        if ((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE(*s);
+}
+
+
+static void _gcperm(Perm_T *s) {
+        
+        ASSERT(s);
+        
+        if((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE(*s);
+        
+}
+
+
+static void _gcprogram(Program_T *p) {
+        
+        ASSERT(p);
+        
+        if((*p)->action)
+                _gc_eventaction(&(*p)->action);
+        if ((*p)->P)
+                Process_free(&(*p)->P);
+        if ((*p)->C)
+                Command_free(&(*p)->C);
+        FREE(*p);
+}
+
+
+static void _gcuid(Uid_T *s) {
+        
+        ASSERT(s);
+        
+        if((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE(*s);
+        
+}
+
+
+static void _gcgid(Gid_T *s) {
+        
+        ASSERT(s);
+        
+        if((*s)->action)
+                _gc_eventaction(&(*s)->action);
+        
+        FREE(*s);
+        
+}
+
+
+static void _gcpdl(Dependant_T *d) {
+        
+        ASSERT(d);
+        
+        if((*d)->next)
+                _gcpdl(&(*d)->next);
+        
+        FREE((*d)->dependant);
+        FREE(*d);
+        
+}
+
+
+static void _gcgrc(Generic_T *g) {
+        
+        ASSERT(g);
+        
+        if((*g)->next)
+                _gcgrc(&(*g)->next);
+        
+        FREE((*g)->send);
+#ifdef HAVE_REGEX_H
+        if ((*g)->expect!=NULL)
+                regfree((*g)->expect);
+#endif
+        FREE((*g)->expect);
+        FREE(*g);
+        
+}
+
+
+static void _gcath(Auth_T *c) {
+        
+        ASSERT(c);
+        
+        if((*c)->next)
+                _gcath(&(*c)->next);
+        
+        FREE((*c)->uname);
+        FREE((*c)->passwd);
+        FREE((*c)->groupname);
+        FREE(*c);
+        
+}
+
+
+static void _gc_mmonit(Mmonit_T *recv) {
+        
+        ASSERT(recv);
+        
+        if((*recv)->next)
+                _gc_mmonit(&(*recv)->next);
+        
+        _gc_url(&(*recv)->url);
+        
+        FREE((*recv)->ssl.certmd5);
+        FREE((*recv)->ssl.clientpemfile);
+        FREE(*recv);
+        
+}
+
+
diff --git a/monit-5.4/src/http.c b/monit-5.4/src/http.c
new file mode 100644
index 0000000..2924b9d
--- /dev/null
+++ b/monit-5.4/src/http.c
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#include "monit.h"
+#include "net.h"
+#include "engine.h"
+
+/* Private prototypes */
+static void *thread_wrapper(void *arg);
+
+/* The HTTP Thread */
+static pthread_t thread;
+
+static volatile int running = FALSE;
+
+
+/**
+ *  Facade functions for the cervlet sub-system. Start/Stop the monit
+ *  http server and check if monit http can start.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * @return TRUE if the monit http can start and is specified in the
+ * controlfile to start, otherwise return FALSE. Print an error
+ * message if monit httpd _should_ start but can't.
+ */
+int can_http() {
+
+  if(Run.dohttpd && Run.isdaemon) {
+    
+    if(! has_hosts_allow() && ! Run.credentials) {
+      
+      LogError("%s: monit httpd not started since no connect allowed\n",
+	  prog);
+      
+      return FALSE;
+      
+    }
+    
+    return TRUE;
+    
+  }
+  
+  return FALSE;
+  
+}
+
+
+/**
+ * Start and stop the monit http server
+ * @param action START_HTTP or STOP_HTTP
+ */
+void monit_http(int action) {
+
+  int status;
+
+  switch(action) {
+    
+  case STOP_HTTP:
+    if(!running) break;
+    LogInfo("Shutting down %s HTTP server\n", prog);
+    stop_httpd();
+    if( (status= pthread_join(thread, NULL)) != 0) {
+      LogError("%s: Failed to stop the http server. Thread error -- %s.\n",
+          prog, strerror(status));
+    } else {
+      LogInfo("%s HTTP server stopped\n", prog);
+      running = FALSE;
+    }
+    break;
+
+  case START_HTTP:
+    LogInfo("Starting %s HTTP server at [%s:%d]\n",
+        prog, Run.bind_addr?Run.bind_addr:"*", Run.httpdport);
+    if( (status= pthread_create(&thread, NULL, thread_wrapper, NULL)) != 0) {
+      LogError("%s: Failed to create the http server. Thread error -- %s.\n",
+          prog, strerror(status));
+    } else {
+      LogInfo("%s HTTP server started\n", prog);
+      running = TRUE;
+    }
+    break;
+
+  default:
+    LogError("%s: Unknown http server action\n", prog);
+    break;
+      
+  }
+
+  return;
+
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static void *thread_wrapper(void *arg) {
+
+  sigset_t ns;
+
+  /* Block collective signals in the http thread. The http server is
+   * taken down gracefully by signaling the main monit thread */
+  set_signal_block(&ns, NULL);
+  start_httpd(Run.httpdport, 1024, Run.bind_addr);
+
+  return NULL;
+
+}
+
+  
diff --git a/monit-5.4/src/http/base64.c b/monit-5.4/src/http/base64.c
new file mode 100644
index 0000000..ea45058
--- /dev/null
+++ b/monit-5.4/src/http/base64.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "monit.h"
+#include "base64.h"
+
+
+/**
+ *  Implementation of base64 encoding/decoding. 
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Base64 encode one byte
+ */
+static char encode(unsigned char u) {
+        
+        if(u < 26)  return 'A'+u;
+        if(u < 52)  return 'a'+(u-26);
+        if(u < 62)  return '0'+(u-52);
+        if(u == 62) return '+';
+        
+        return '/';
+        
+}
+
+
+/**
+ * Decode a base64 character
+ */
+static unsigned char decode(char c) {
+        
+        if(c >= 'A' && c <= 'Z') return(c - 'A');
+        if(c >= 'a' && c <= 'z') return(c - 'a' + 26);
+        if(c >= '0' && c <= '9') return(c - '0' + 52);
+        if(c == '+')             return 62;
+        
+        return 63;
+        
+}
+
+
+/**
+ * Return TRUE if 'c' is a valid base64 character, otherwise FALSE
+ */
+static int is_base64(char c) {
+        
+        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
+           (c >= '0' && c <= '9') || (c == '+')             ||
+           (c == '/')             || (c == '=')) {
+                
+                return TRUE;
+                
+        }
+        
+        return FALSE;
+        
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Base64 encode and return size data in 'src'. The caller must free the
+ * returned string.
+ * @param size The size of the data in src
+ * @param src The data to be base64 encode
+ * @return encoded string otherwise NULL
+ */
+char *encode_base64(size_t size, unsigned char *src) {
+
+  int i;
+  char *out, *p;
+
+  if(!src)
+    return NULL;
+
+  if(!size)
+    size= strlen((char *)src);
+    
+  out= CALLOC(sizeof(char), size*4/3+4);
+
+  p= out;
+    
+  for(i=0; i<size; i+=3) {
+      
+    unsigned char b1=0, b2=0, b3=0, b4=0, b5=0, b6=0, b7=0;
+      
+    b1 = src[i];
+      
+    if(i+1<size)
+      b2 = src[i+1];
+      
+    if(i+2<size)
+      b3 = src[i+2];
+      
+    b4= b1>>2;
+    b5= ((b1&0x3)<<4)|(b2>>4);
+    b6= ((b2&0xf)<<2)|(b3>>6);
+    b7= b3&0x3f;
+      
+    *p++= encode(b4);
+    *p++= encode(b5);
+      
+    if(i+1<size) {
+      *p++= encode(b6);
+    } else {
+      *p++= '=';
+    }
+      
+    if(i+2<size) {
+      *p++= encode(b7);
+    } else {
+      *p++= '=';
+    }
+
+  }
+
+  return out;
+
+}
+
+
+/**
+ * Decode the base64 encoded string 'src' into the memory pointed to by
+ * 'dest'. The dest buffer is <b>not</b> NUL terminated.
+ * @param dest Pointer to memory for holding the decoded string.
+ * Must be large enough to recieve the decoded string.
+ * @param src A base64 encoded string.
+ * @return TRUE (the length of the decoded string) if decode
+ * succeeded otherwise FALSE.
+ */
+size_t decode_base64(unsigned char *dest, const char *src) {
+
+  if(src && *src) {
+  
+    unsigned char *p= dest;
+    size_t k, l = strlen(src)+1;
+    unsigned char *buf= CALLOC(1, l);
+
+    
+    /* Ignore non base64 chars as per the POSIX standard */
+    for(k=0, l=0; src[k]; k++) {
+      
+      if(is_base64(src[k])) {
+	
+	buf[l++]= src[k];
+	
+      }
+      
+    } 
+    
+    for(k=0; k<l; k+=4) {
+      
+      char c1='A', c2='A', c3='A', c4='A';
+      unsigned char b1=0, b2=0, b3=0, b4=0;
+      
+      c1= buf[k];
+      
+      if(k+1<l) {
+	
+	c2= buf[k+1];
+	
+      }
+      
+      if(k+2<l) {
+	
+	c3= buf[k+2];
+	
+      }
+      
+      if(k+3<l) {
+	
+	c4= buf[k+3];
+	
+      }
+      
+      b1= decode(c1);
+      b2= decode(c2);
+      b3= decode(c3);
+      b4= decode(c4);
+      
+      *p++=((b1<<2)|(b2>>4) );
+      
+      if(c3 != '=') {
+	
+	*p++=(((b2&0xf)<<4)|(b3>>2) );
+	
+      }
+      
+      if(c4 != '=') {
+	
+	*p++=(((b3&0x3)<<6)|b4 );
+	
+      }
+      
+    }
+    
+    FREE(buf);
+    
+    return(p-dest);
+
+  }
+
+  return FALSE;
+  
+}
diff --git a/monit-5.4/src/http/base64.h b/monit-5.4/src/http/base64.h
new file mode 100644
index 0000000..fe2be3d
--- /dev/null
+++ b/monit-5.4/src/http/base64.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef BASE64_H
+#define BASE64_H
+
+#include "config.h"
+
+size_t decode_base64(unsigned char *dest, const char *src);
+char  *encode_base64(size_t size, unsigned char *src);
+
+#endif
diff --git a/monit-5.4/src/http/cervlet.c b/monit-5.4/src/http/cervlet.c
new file mode 100644
index 0000000..d9b673c
--- /dev/null
+++ b/monit-5.4/src/http/cervlet.c
@@ -0,0 +1,2547 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#include "monit.h"
+#include "cervlet.h" 
+#include "engine.h"
+#include "processor.h"
+#include "base64.h"
+#include "event.h" 
+#include "alert.h"
+#include "process.h"
+#include "device.h"
+
+// libmonit
+#include "system/Time.h"
+
+#define ACTION(c) !strncasecmp(req->url, c, sizeof(c))
+
+/* URL Commands supported */
+#define HOME        "/"
+#define TEST        "/_monit"
+#define ABOUT       "/_about"
+#define PING        "/_ping"
+#define GETID       "/_getid"
+#define STATUS      "/_status"
+#define STATUS2     "/_status2"
+#define RUN         "/_runtime"
+#define VIEWLOG     "/_viewlog"
+#define DOACTION    "/_doaction"
+
+/* Private prototypes */
+static int is_readonly(HttpRequest);
+static void doGet(HttpRequest, HttpResponse);
+static void doPost(HttpRequest, HttpResponse);
+static void do_home(HttpRequest, HttpResponse);
+static void do_home_system(HttpRequest, HttpResponse);
+static void do_home_filesystem(HttpRequest, HttpResponse);
+static void do_home_directory(HttpRequest, HttpResponse);
+static void do_home_file(HttpRequest, HttpResponse);
+static void do_home_fifo(HttpRequest, HttpResponse);
+static void do_home_process(HttpRequest, HttpResponse);
+static void do_home_program(HttpRequest, HttpResponse);
+static void do_home_host(HttpRequest, HttpResponse);
+static void do_about(HttpRequest, HttpResponse);
+static void do_ping(HttpRequest, HttpResponse);
+static void do_getid(HttpRequest, HttpResponse);
+static void do_runtime(HttpRequest, HttpResponse);
+static void do_viewlog(HttpRequest, HttpResponse);
+static void handle_action(HttpRequest, HttpResponse);
+static void handle_do_action(HttpRequest, HttpResponse);
+static void handle_run(HttpRequest, HttpResponse);
+static void is_monit_running(HttpRequest, HttpResponse);
+static void do_service(HttpRequest, HttpResponse, Service_T);
+static void print_alerts(HttpResponse, Mail_T);
+static void print_buttons(HttpRequest, HttpResponse, Service_T);
+static void print_service_rules_port(HttpResponse, Service_T);
+static void print_service_rules_icmp(HttpResponse, Service_T);
+static void print_service_rules_perm(HttpResponse, Service_T);
+static void print_service_rules_uid(HttpResponse, Service_T);
+static void print_service_rules_gid(HttpResponse, Service_T);
+static void print_service_rules_timestamp(HttpResponse, Service_T);
+static void print_service_rules_filesystem(HttpResponse, Service_T);
+static void print_service_rules_size(HttpResponse, Service_T);
+static void print_service_rules_uptime(HttpResponse, Service_T);
+static void print_service_rules_match(HttpResponse, Service_T);
+static void print_service_rules_checksum(HttpResponse, Service_T);
+static void print_service_rules_process(HttpResponse, Service_T);
+static void print_service_rules_program(HttpResponse, Service_T);
+static void print_service_rules_resource(HttpResponse, Service_T);
+static void print_service_params_port(HttpResponse, Service_T);
+static void print_service_params_icmp(HttpResponse, Service_T);
+static void print_service_params_perm(HttpResponse, Service_T);
+static void print_service_params_uid(HttpResponse, Service_T);
+static void print_service_params_gid(HttpResponse, Service_T);
+static void print_service_params_timestamp(HttpResponse, Service_T);
+static void print_service_params_filesystem(HttpResponse, Service_T);
+static void print_service_params_size(HttpResponse, Service_T);
+static void print_service_params_match(HttpResponse, Service_T);
+static void print_service_params_checksum(HttpResponse, Service_T);
+static void print_service_params_process(HttpResponse, Service_T);
+static void print_service_params_resource(HttpResponse, Service_T);
+static void print_service_params_program(HttpResponse, Service_T);
+static void print_status(HttpRequest, HttpResponse, int);
+static void status_service_txt(Service_T, HttpResponse, short);
+static char *get_monitoring_status(Service_T s, char *, int);
+static char *get_service_status(Service_T, char *, int);
+static char *get_service_status_html(Service_T, char *, int);
+
+
+/**
+ *  Implementation of doGet and doPost routines used by the cervlet
+ *  processor module. This particilary cervlet will provide
+ *  information about the monit deamon and programs monitored by
+ *  monit.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Callback hook to the Processor module for registering this modules
+ * doGet and doPost methods.
+ */
+void init_service() {
+        
+        add_Impl(doGet, doPost);
+        
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Called by the Processor (via the service method)
+ * to handle a POST request.
+ */
+static void doPost(HttpRequest req, HttpResponse res) {
+        
+        set_content_type(res, "text/html");
+        
+        if(ACTION(RUN)) {
+                handle_run(req, res);
+        } else if(ACTION(DOACTION)) {
+                handle_do_action(req, res);
+        } else {
+                handle_action(req, res);
+        }
+        
+}
+
+
+/**
+ * Called by the Processor (via the service method)
+ * to handle a GET request.
+ */
+static void doGet(HttpRequest req, HttpResponse res) {
+        
+        set_content_type(res, "text/html");
+        
+        if(ACTION(HOME)) {
+                LOCK(Run.mutex)
+                do_home(req, res);
+                END_LOCK;
+        } else if(ACTION(RUN)) {
+                handle_run(req, res);
+        } else if(ACTION(TEST)) {
+                is_monit_running(req, res);
+        } else if(ACTION(VIEWLOG)) {
+                do_viewlog(req, res);
+        } else if(ACTION(ABOUT)) {
+                do_about(req, res);
+        } else if(ACTION(PING)) {
+                do_ping(req, res);
+        } else if(ACTION(GETID)) {
+                do_getid(req, res);
+        } else if(ACTION(STATUS)) {
+                print_status(req, res, 1);
+        } else if(ACTION(STATUS2)) {
+                print_status(req, res, 2);
+        } else if(ACTION(DOACTION)) {
+                handle_do_action(req, res);
+        } else {
+                handle_action(req, res);
+        }
+        
+}
+
+
+/* ----------------------------------------------------------------- Helpers */
+
+
+static void is_monit_running(HttpRequest req, HttpResponse res) {
+        
+        int status;
+        int monit= exist_daemon();
+        
+        if(monit) {
+                status= SC_OK;
+        } else {
+                status= SC_GONE;
+        }
+        
+        set_status(res, status);
+        
+}
+
+
+static void do_home(HttpRequest req, HttpResponse res) {
+        char *uptime= Util_getUptime(Util_getProcessUptime(Run.pidfile), "&nbsp;");
+        
+        HEAD("", "", Run.polltime)
+        StringBuffer_append(res->outputbuffer,
+                  "<table id='header' width='100%%'>"
+                  " <tr>"
+                  "  <td colspan=2 valign='top' align='left' width='100%%'>"
+                  "  <h1>Monit Service Manager</h1>"
+                  "  <p align='center'>Monit is <a href='_runtime'>running</a> on %s with <i>uptime, %s</i> and monitoring:</p><br>"
+                  "  </td>"
+                  " </tr>"
+                  "</table>", Run.localhostname, uptime);
+        
+        FREE(uptime);
+        
+        do_home_system(req, res);
+        do_home_process(req, res);
+        do_home_program(req, res);
+        do_home_filesystem(req, res);
+        do_home_file(req, res);
+        do_home_fifo(req, res);
+        do_home_directory(req, res);
+        do_home_host(req, res);
+
+        FOOT
+}
+
+
+static void do_about(HttpRequest req, HttpResponse res) {
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<html><head><title>about monit</title></head><body bgcolor=white>"
+                  "<br><h1><center><a href='http://mmonit.com/monit/'>"
+                  "monit " VERSION "</a></center></h1>");
+        StringBuffer_append(res->outputbuffer,
+                  "<ul>"
+                  "<li style='padding-bottom:10px;'>Copyright &copy; 2001-2012 <a "
+                  "href='http://tildeslash.com/'>Tildeslash Ltd"
+                  "</a>. All Rights Reserved.</li></ul>");
+        StringBuffer_append(res->outputbuffer, "<hr size='1'>");
+        StringBuffer_append(res->outputbuffer,
+                  "<p>This program is free software; you can redistribute it and/or "
+                  "modify it under the terms of the GNU Affero General Public License version 3</p>"
+                  "<p>This program 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 "
+                  "<a href='http://www.gnu.org/licenses/agpl.html'>"
+                  "GNU AFFERO GENERAL PUBLIC LICENSE</a> for more details.</p>");
+        StringBuffer_append(res->outputbuffer,
+                  "<center><p style='padding-top:20px;'>[<a href='.'>Back to Monit</a>]</p></body></html>");
+        
+}
+
+
+static void do_ping(HttpRequest req, HttpResponse res) {
+        StringBuffer_append(res->outputbuffer, "pong");
+}
+
+
+static void do_getid(HttpRequest req, HttpResponse res) {
+        StringBuffer_append(res->outputbuffer, "%s", Run.id);
+}
+
+static void do_runtime(HttpRequest req, HttpResponse res) {
+        
+        int pid=  exist_daemon();
+        
+        HEAD("_runtime", "Runtime", 1000)
+        StringBuffer_append(res->outputbuffer,
+                  "<h2>Monit runtime status</h2>");
+        StringBuffer_append(res->outputbuffer, "<table id='status-table'><tr>"
+                  "<th width='40%%'>Parameter</th>"
+                  "<th width='60%%'>Value</th></tr>");
+        StringBuffer_append(res->outputbuffer, "<tr><td>Monit ID</td><td>%s</td></tr>", Run.id);
+        StringBuffer_append(res->outputbuffer, "<tr><td>Host</td><td>%s</td></tr>",  Run.localhostname);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Process id</td><td>%d</td></tr>", pid);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Effective user running Monit</td>"
+                  "<td>%s</td></tr>", Run.Env.user);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Controlfile</td><td>%s</td></tr>", Run.controlfile);
+        if(Run.logfile)
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Logfile</td><td>%s</td></tr>", Run.logfile);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Pidfile</td><td>%s</td></tr>", Run.pidfile);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>State file</td><td>%s</td></tr>", Run.statefile);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Debug</td><td>%s</td></tr>",
+                  Run.debug?"True":"False");
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Log</td><td>%s</td></tr>", Run.dolog?"True":"False");
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Use syslog</td><td>%s</td></tr>",
+                  Run.use_syslog?"True":"False");
+        
+        if(Run.eventlist_dir) {
+                char slots[STRLEN];
+                if(Run.eventlist_slots < 0)
+                        snprintf(slots, STRLEN, "unlimited");
+                else
+                        snprintf(slots, STRLEN, "%d", Run.eventlist_slots);
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Event queue</td>"
+                          "<td>base directory %s with %d slots</td></tr>",
+                          Run.eventlist_dir, Run.eventlist_slots);
+        }
+        
+        if(Run.mmonits) {
+                Mmonit_T c;
+                StringBuffer_append(res->outputbuffer, "<tr><td>M/Monit server(s)</td><td>");
+                for(c= Run.mmonits; c; c= c->next)
+                {
+                        StringBuffer_append(res->outputbuffer,
+                                  "%s with timeout %d seconds%s%s%s%s</td></tr>%s",
+                                  c->url->url,
+                                  c->timeout,
+                                  c->ssl.use_ssl?" ssl version ":"",
+                                  c->ssl.use_ssl?sslnames[c->ssl.version]:"",
+                                  c->ssl.certmd5?" server cert md5 sum ":"",
+                                  c->ssl.certmd5?c->ssl.certmd5:"",
+                                  c->next?"<tr><td>&nbsp;</td><td>":"");
+                }
+                printf("\n");
+        }
+        
+        if(Run.mailservers) {
+                MailServer_T mta;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Mail server(s)</td><td>");
+                for(mta= Run.mailservers; mta; mta= mta->next)
+                        StringBuffer_append(res->outputbuffer, "%s:%d%s&nbsp;",
+                                  mta->host, mta->port, mta->ssl.use_ssl?"(ssl)":"");
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+        }
+        
+        if(Run.MailFormat.from)
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Default mail from</td><td>%s</td></tr>",
+                          Run.MailFormat.from);
+        if(Run.MailFormat.subject)
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Default mail subject</td><td>%s</td></tr>",
+                          Run.MailFormat.subject);
+        if(Run.MailFormat.message)
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Default mail message</td><td>%s</td></tr>",
+                          Run.MailFormat.message);
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Poll time</td><td>%d seconds with start delay %d seconds</td></tr>",
+                  Run.polltime, Run.startdelay);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>httpd bind address</td><td>%s</td></tr>",
+                  Run.bind_addr?Run.bind_addr:"Any/All");
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>httpd portnumber</td><td>%d</td></tr>", Run.httpdport);
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>httpd signature</td><td>%s</td></tr>",
+                  Run.httpdsig?"True":"False");
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Use ssl encryption</td><td>%s</td></tr>",
+                  Run.httpdssl?"True":"False");
+        if (Run.httpdssl) {
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>PEM key/certificate file</td><td>%s</td></tr>",
+                          Run.httpsslpem);
+                
+                if (Run.httpsslclientpem!=NULL) {
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Client PEM key/certification"
+                                  "</td><td>%s</td></tr>", "Enabled");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Client PEM key/certificate file"
+                                  "</td><td>%s</td></tr>", Run.httpsslclientpem);
+                } else {
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Client PEM key/certification"
+                                  "</td><td>%s</td></tr>", "Disabled");
+                }
+                StringBuffer_append(res->outputbuffer,
+                          "<tr><td>Allow self certified certificates "
+                          "</td><td>%s</td></tr>", Run.allowselfcert?"True":"False");
+        }
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>httpd auth. style</td><td>%s</td></tr>",
+                  (Run.credentials!=NULL)&&(has_hosts_allow())?
+                  "Basic Authentication and Host/Net allow list":
+                  (Run.credentials!=NULL)?"Basic Authentication":
+                  (has_hosts_allow())?"Host/Net allow list":
+                  "No authentication");
+        
+        print_alerts(res, Run.maillist);
+        
+        StringBuffer_append(res->outputbuffer, "</table>");
+        
+        if(!is_readonly(req)) {
+                StringBuffer_append(res->outputbuffer,
+                          "<table id='buttons'><tr>");
+                StringBuffer_append(res->outputbuffer,
+                          "<td style='color:red;'><form method=POST action='_runtime'>Stop Monit http server? "
+                          "<input type=hidden name='action' value='stop'><input type=submit value='Go'></form></td>");
+                StringBuffer_append(res->outputbuffer,
+                          "<td><form method=POST action='_runtime'>Force validate now? <input type=hidden name='action' value='validate'>"
+                          "<input type=submit value='Go'></form></td>");
+                
+                if(Run.dolog && !Run.use_syslog) {
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td><form method=GET action='_viewlog'>View Monit logfile? <input type=submit value='Go'></form></td>");
+                }
+                StringBuffer_append(res->outputbuffer,
+                          "</tr></table>");
+        }
+        
+        FOOT
+        
+}
+
+
+static void do_viewlog(HttpRequest req, HttpResponse res) {
+        
+        if(is_readonly(req)) {
+                send_error(res, SC_FORBIDDEN,
+                           "You do not have sufficent privileges to access this page");
+                return;
+        }
+        
+        HEAD("_viewlog", "View log", 100)
+        
+        if(Run.dolog && !Run.use_syslog) {
+                
+                struct stat sb;
+                
+                if(!stat(Run.logfile, &sb)) {
+                        
+                        FILE *f= fopen(Run.logfile, "r");
+                        if(f) {
+#define BUFSIZE 512
+                                size_t n;
+                                char buf[BUFSIZE+1];
+                                StringBuffer_append(res->outputbuffer, "<br><p><form><textarea cols=120 rows=30 readonly>");
+                                while((n = fread(buf, sizeof(char), BUFSIZE, f)) > 0) {
+                                        buf[n] = 0;
+                                        StringBuffer_append(res->outputbuffer, "%s", buf);
+                                }
+                                fclose(f);
+                                StringBuffer_append(res->outputbuffer, "</textarea></form>");
+                        } else {
+                                StringBuffer_append(res->outputbuffer, "Error opening logfile: %s", STRERROR);
+                        }
+                } else {
+                        StringBuffer_append(res->outputbuffer, "Error stating logfile: %s", STRERROR);
+                }
+        } else {
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<b>Cannot view logfile:</b><br>");
+                if(!Run.dolog) {
+                        
+                        StringBuffer_append(res->outputbuffer, "Monit was started without logging");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer, "Monit uses syslog");
+                        
+                }
+                
+        }
+        
+        FOOT
+        
+}
+
+
+static void handle_action(HttpRequest req, HttpResponse res) {
+        int doaction;
+        char *name = req->url;
+        const char *action;
+        Service_T s;
+        
+        if(!(s = Util_getService(++name))) {
+                send_error(res, SC_NOT_FOUND, "There is no service by that name");
+                return;
+        }
+        if((action = get_parameter(req, "action"))) {
+                const char *token = NULL;
+                
+                if(is_readonly(req)) {
+                        send_error(res, SC_FORBIDDEN, "You do not have sufficent privileges to access this page");
+                        return;
+                }
+                doaction = Util_getAction(action);
+                if(doaction == ACTION_IGNORE) {
+                        send_error(res, SC_BAD_REQUEST, "Invalid action");
+                        return;
+                }
+                if(s->doaction != ACTION_IGNORE) {
+                        send_error(res, SC_SERVICE_UNAVAILABLE, "Other action already in progress -- please try again later");
+                        return;
+                }
+                s->doaction = doaction;
+                token = get_parameter(req, "token");
+                if (token) {
+                        FREE(s->token);
+                        s->token = Str_dup(token);
+                }
+                LogInfo("'%s' %s on user request\n", s->name, action);
+                Run.doaction = TRUE; /* set the global flag */
+                do_wakeupcall();
+        }
+        do_service(req, res, s);
+}
+
+
+static void handle_do_action(HttpRequest req, HttpResponse res) {
+        Service_T s;
+        int doaction = ACTION_IGNORE;
+        const char *action = get_parameter(req, "action");
+        const char *token = get_parameter(req, "token");
+        
+        if(action) {
+                HttpParameter p;
+                
+                if(is_readonly(req)) {
+                        send_error(res, SC_FORBIDDEN, "You do not have sufficent privileges to access this page");
+                        return;
+                }
+                if((doaction = Util_getAction(action)) == ACTION_IGNORE) {
+                        send_error(res, SC_BAD_REQUEST, "Invalid action");
+                        return;
+                }
+                
+                for(p= req->params; p; p= p->next) {
+                        
+                        if(!strcasecmp(p->name, "service")) {
+                                s  = Util_getService(p->value);
+                                
+                                if(!s) {
+                                        send_error(res, SC_BAD_REQUEST, "There is no service by that name");
+                                        return;
+                                }
+                                if(s->doaction != ACTION_IGNORE) {
+                                        send_error(res, SC_SERVICE_UNAVAILABLE, "Other action already in progress -- please try again later");
+                                        return;
+                                }
+                                s->doaction = doaction;
+                                LogInfo("'%s' %s on user request\n", s->name, action);
+                        }
+                }
+                
+                /* Set token for last service only so we'll get it back after all services were handled */
+                if (token) {
+                        Service_T q = NULL;
+                        for (s = servicelist; s; s = s->next)
+                                if (s->doaction == doaction)
+                                        q = s;
+                        if (q) {
+                                FREE(q->token);
+                                q->token = Str_dup(token);
+                        }
+                }
+                
+                Run.doaction = TRUE; 
+                do_wakeupcall();
+        }
+}
+
+
+static void handle_run(HttpRequest req, HttpResponse res) {
+        
+        const char *action= get_parameter(req, "action");
+        
+        if(action) {
+                if(is_readonly(req)) {
+                        send_error(res, SC_FORBIDDEN,
+                                   "You do not have sufficent privileges to access this page");
+                        return;
+                }
+                if(IS(action, "validate")) {
+                        LogInfo("The Monit http server woke up on user request\n");
+                        do_wakeupcall();
+                } else if(IS(action, "stop")) {
+                        LogInfo("The Monit http server stopped on user request\n");
+                        send_error(res, SC_SERVICE_UNAVAILABLE,
+                                   "The Monit http server is stopped");
+                        stop_httpd();
+                        return;
+                }
+        }
+        
+        LOCK(Run.mutex)
+        do_runtime(req, res);
+        END_LOCK;
+        
+}
+
+
+static void do_service(HttpRequest req, HttpResponse res, Service_T s) {
+        Dependant_T d;
+        ActionRate_T ar;
+        ServiceGroup_T sg;
+        ServiceGroupMember_T sgm;
+        char buf[STRLEN];
+        
+        ASSERT(s);
+        
+        HEAD(s->name, s->name, Run.polltime)
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<h2>%s status</h2>"
+                  "<table id='status-table'>"
+                  "<tr>"
+                  "<th width='30%%'>Parameter</th>"
+                  "<th width='70%%'>Value</th>"
+                  "</tr>"
+                  "<tr>"
+                  "<td>Name</td>"
+                  "<td>%s</td>"
+                  "</tr>",
+                  servicetypes[s->type],
+                  s->name);
+        
+        if(s->type == TYPE_PROCESS)
+                StringBuffer_append(res->outputbuffer, "<tr><td>%s</td><td>%s</td></tr>", s->matchlist ? "Match" : "Pid file", s->path);
+        else if(s->type != TYPE_HOST && s->type != TYPE_SYSTEM)
+                StringBuffer_append(res->outputbuffer, "<tr><td>Path</td><td>%s</td></tr>", s->path);
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Status</td><td>%s</td></tr>", get_service_status_html(s, buf, sizeof(buf)));
+        
+        for (sg = servicegrouplist; sg; sg = sg->next)
+                for (sgm = sg->members; sgm; sgm = sgm->next)
+                        if (! strcasecmp(sgm->name, s->name))
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Group</td><td class='blue-text'>%s</td></tr>", sg->name);
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Monitoring mode</td><td>%s</td></tr>", modenames[s->mode]);
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<tr><td>Monitoring status</td><td>%s</td></tr>", get_monitoring_status(s, buf, sizeof(buf)));
+        
+        for(d= s->dependantlist; d; d= d->next) {
+                if(d->dependant != NULL) {
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Depends on service </td><td> <a href=%s> %s </a></td></tr>",
+                                  d->dependant, d->dependant);
+                }
+        }
+        
+        if(s->start) {
+                int i= 0;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Start program</td><td>'");
+                while(s->start->arg[i]) {
+                        if(i) StringBuffer_append(res->outputbuffer, " ");
+                        StringBuffer_append(res->outputbuffer, "%s", s->start->arg[i++]);
+                }
+                StringBuffer_append(res->outputbuffer, "'");
+                if(s->start->has_uid)
+                        StringBuffer_append(res->outputbuffer, " as uid %d", s->start->uid);
+                if(s->start->has_gid)
+                        StringBuffer_append(res->outputbuffer, " as gid %d", s->start->gid);
+                StringBuffer_append(res->outputbuffer, " timeout %d second(s)", s->start->timeout);
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+        }
+        
+        if(s->stop) {
+                int i= 0;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Stop program</td><td>'");
+                while(s->stop->arg[i]) {
+                        if(i) StringBuffer_append(res->outputbuffer, " ");
+                        StringBuffer_append(res->outputbuffer, "%s", s->stop->arg[i++]);
+                }
+                StringBuffer_append(res->outputbuffer, "'");
+                if(s->stop->has_uid)
+                        StringBuffer_append(res->outputbuffer, " as uid %d", s->stop->uid);
+                if(s->stop->has_gid)
+                        StringBuffer_append(res->outputbuffer, " as gid %d", s->stop->gid);
+                StringBuffer_append(res->outputbuffer, " timeout %d second(s)", s->stop->timeout);
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+        }
+        
+        if(s->type != TYPE_SYSTEM) {
+                StringBuffer_append(res->outputbuffer, "<tr><td>Existence</td><td>If doesn't exist %s ", Util_getEventratio(s->action_NONEXIST->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(s->action_NONEXIST->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(s->action_NONEXIST->succeeded, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(s->action_NONEXIST->succeeded, buf, sizeof(buf)));
+        }
+        
+        if (s->every.type != EVERY_CYCLE) {
+                StringBuffer_append(res->outputbuffer, "<tr><td>Check service</td><td>");
+                if (s->every.type == EVERY_SKIPCYCLES)
+                        StringBuffer_append(res->outputbuffer, "every %d cycle", s->every.spec.cycle.number);
+                else if (s->every.type == EVERY_CRON)
+                        StringBuffer_append(res->outputbuffer, "every <code>\"%s\"</code>", s->every.spec.cron);
+                else if (s->every.type == EVERY_NOTINCRON)
+                        StringBuffer_append(res->outputbuffer, "not every <code>\"%s\"</code>", s->every.spec.cron);
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+        }
+        
+        for (ar = s->actionratelist; ar; ar = ar->next)
+                StringBuffer_append(res->outputbuffer, "<tr><td>Timeout</td><td>If restarted %d times within %d cycle(s) then %s</td></tr>", ar->count, ar->cycle, Util_describeAction(ar->action->failed, buf, sizeof(buf)));
+        
+        StringBuffer_append(res->outputbuffer, "<tr><td>Data collected</td><td>%s</td></tr>", Time_string(s->collected.tv_sec, buf));
+        
+        /* Parameters */
+        print_service_params_icmp(res, s);
+        print_service_params_port(res, s);
+        print_service_params_perm(res, s);
+        print_service_params_uid(res, s);
+        print_service_params_gid(res, s);
+        print_service_params_timestamp(res, s);
+        print_service_params_filesystem(res, s);
+        print_service_params_size(res, s);
+        print_service_params_match(res, s);
+        print_service_params_checksum(res, s);
+        print_service_params_process(res, s);
+        print_service_params_resource(res, s);
+        print_service_params_program(res, s);
+        
+        /* Rules */
+        print_service_rules_icmp(res, s);
+        print_service_rules_port(res, s);
+        print_service_rules_perm(res, s);
+        print_service_rules_uid(res, s);
+        print_service_rules_gid(res, s);
+        print_service_rules_timestamp(res, s);
+        print_service_rules_filesystem(res, s);
+        print_service_rules_size(res, s);
+        print_service_rules_uptime(res, s);
+        print_service_rules_match(res, s);
+        print_service_rules_checksum(res, s);
+        print_service_rules_process(res, s);
+        print_service_rules_program(res, s);
+        print_service_rules_resource(res, s);
+        
+        print_alerts(res, s->maillist);
+        
+        StringBuffer_append(res->outputbuffer, "</table>");
+        
+        print_buttons(req, res, s);
+        
+        FOOT
+}
+
+
+static void do_home_system(HttpRequest req, HttpResponse res) {
+        Service_T s = Run.system;
+        char buf[STRLEN];
+        
+        StringBuffer_append(res->outputbuffer,
+                  "<table id='header-row'>"
+                  "<tr>"
+                  "<th align='left' class='first'>System</th>"
+                  "<th align='left'>Status</th>");
+        
+        if(Run.doprocess) {
+                StringBuffer_append(res->outputbuffer,
+                          "<th align='right'>Load</th>"
+                          "<th align='right'>CPU</th>"
+                          "<th align='right'>Memory</th>"
+                          "<th align='right'>Swap</th>");
+        }
+        
+        StringBuffer_append(res->outputbuffer,
+                  "</tr>"
+                  "<tr class='stripe'>"
+                  "<td align='left'><a href='%s'>%s</a></td>"
+                  "<td align='left'>%s</td>",
+                  s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+        
+        if(Run.doprocess) {
+                StringBuffer_append(res->outputbuffer,
+                          "<td align='right'>[%.2f]&nbsp;[%.2f]&nbsp;[%.2f]</td>"
+                          "<td align='right'>"
+                          "%.1f%%us,&nbsp;%.1f%%sy"
+#ifdef HAVE_CPU_WAIT
+                          ",&nbsp;%.1f%%wa"
+#endif
+                          "</td>"
+                          "<td align='right'>%.1f%% [%ld&nbsp;kB]</td>"
+                          "<td align='right'>%.1f%% [%ld&nbsp;kB]</td>",
+                          systeminfo.loadavg[0], systeminfo.loadavg[1], systeminfo.loadavg[2],
+                          systeminfo.total_cpu_user_percent > 0 ? systeminfo.total_cpu_user_percent/10. : 0,
+                          systeminfo.total_cpu_syst_percent > 0 ? systeminfo.total_cpu_syst_percent/10. : 0,
+#ifdef HAVE_CPU_WAIT
+                          systeminfo.total_cpu_wait_percent > 0 ? systeminfo.total_cpu_wait_percent/10. : 0,
+#endif
+                          systeminfo.total_mem_percent/10., systeminfo.total_mem_kbyte,
+                          systeminfo.total_swap_percent/10., systeminfo.total_swap_kbyte);
+        }
+        
+        StringBuffer_append(res->outputbuffer,
+                  "</tr>"
+                  "</table>");
+}
+
+
+static void do_home_process(HttpRequest req, HttpResponse res) {
+        
+        Service_T      s;
+        char           buf[STRLEN];
+        int            on= TRUE;
+        int            header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_PROCESS) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Process</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Uptime</th>");
+                        
+                        if(Run.doprocess) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<th align='right'>CPU Total</b></th>"
+                                          "<th align='right'>Memory Total</th>");
+                        }
+                        
+                        StringBuffer_append(res->outputbuffer, "</tr>");
+                        
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>-</td>");
+                        
+                        if(Run.doprocess) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<td align='right'>-</td>"
+                                          "<td align='right'>-</td>");
+                        }
+                        
+                } else {
+                        
+                        char *uptime= Util_getUptime(s->inf->priv.process.uptime, "&nbsp;");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>%s</td>", uptime);
+                        FREE(uptime);
+                        
+                        if(Run.doprocess) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<td align='right' class='%s'>%.1f%%</td>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.total_cpu_percent/10.0);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<td align='right' class='%s'>%.1f%% [%ld&nbsp;kB]</td>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.total_mem_percent/10.0, s->inf->priv.process.total_mem_kbyte);
+                        }
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_program(HttpRequest req, HttpResponse res) {
+        
+        Service_T      s;
+        char           buf[STRLEN];
+        int            on= TRUE;
+        int            header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_PROGRAM) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Program</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Last started</th>"
+                                  "<th align='right'>Exit value</th>");
+                        
+                        StringBuffer_append(res->outputbuffer, "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        StringBuffer_append(res->outputbuffer, "<td align='right'>-</td>");
+                        StringBuffer_append(res->outputbuffer, "<td align='right'>-</td>");
+                } else {
+                        if (s->program->started) {
+                                char t[32];
+                                StringBuffer_append(res->outputbuffer, "<td align='right'>%s</td>", Time_string(s->program->started, t));
+                                StringBuffer_append(res->outputbuffer, "<td align='right'>%d</td>", s->program->exitStatus);
+                        } else {
+                                StringBuffer_append(res->outputbuffer, "<td align='right'>Not yet started</td>");
+                                StringBuffer_append(res->outputbuffer, "<td align='right'>N/A</td>");
+                        }
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_filesystem(HttpRequest req, HttpResponse res) {
+        Service_T     s;
+        char          buf[STRLEN];
+        int           on= TRUE;
+        int           header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_FILESYSTEM) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Filesystem</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Space usage</th>"
+                                  "<th align='right'>Inodes usage</th>"
+                                  "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>- [-]</td>"
+                                  "<td align='right'>- [-]</td>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>%.1f%% [%.1f&nbsp;MB]</td>",
+                                  s->inf->priv.filesystem.space_percent/10.,
+                                  s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.space_total / (float)1048576 * (float)s->inf->priv.filesystem.f_bsize) : 0);
+                        
+                        if(s->inf->priv.filesystem.f_files > 0) {
+                                
+                                StringBuffer_append(res->outputbuffer,
+                                          "<td align='right'>%.1f%% [%ld&nbsp;objects]</td>",
+                                          s->inf->priv.filesystem.inode_percent/10.,
+                                          s->inf->priv.filesystem.inode_total);
+                                
+                        } else {
+                                
+                                StringBuffer_append(res->outputbuffer,
+                                          "<td align='right'>not supported by filesystem</td>");
+                                
+                        }
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_file(HttpRequest req, HttpResponse res) {
+        
+        Service_T  s;
+        char       buf[STRLEN];
+        int        on= TRUE;
+        int        header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_FILE) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>File</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Size</th>"
+                                  "<th align='right'>Permission</th>"
+                                  "<th align='right'>UID</th>"
+                                  "<th align='right'>GID</th>"
+                                  "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>%llu&nbsp;B</td>"
+                                  "<td align='right'>%04o</td>"
+                                  "<td align='right'>%d</td>"
+                                  "<td align='right'>%d</td>",
+                                  (unsigned long long)s->inf->priv.file.st_size,
+                                  s->inf->st_mode & 07777,
+                                  s->inf->st_uid,
+                                  s->inf->st_gid);
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_fifo(HttpRequest req, HttpResponse res) {
+        
+        Service_T  s;
+        char       buf[STRLEN];
+        int        on= TRUE;
+        int        header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_FIFO) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Fifo</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Permission</th>"
+                                  "<th align='right'>UID</th>"
+                                  "<th align='right'>GID</th>"
+                                  "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>%o</td>"
+                                  "<td align='right'>%d</td>"
+                                  "<td align='right'>%d</td>",
+                                  s->inf->st_mode & 07777,
+                                  s->inf->st_uid,
+                                  s->inf->st_gid);
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_directory(HttpRequest req, HttpResponse res) {
+        
+        Service_T        s;
+        char             buf[STRLEN];
+        int              on= TRUE;
+        int              header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_DIRECTORY) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Directory</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Permission</th>"
+                                  "<th align='right'>UID</th>"
+                                  "<th align='right'>GID</th>"
+                                  "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>"
+                                  "<td align='right'>-</td>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>%o</td>"
+                                  "<td align='right'>%d</td>"
+                                  "<td align='right'>%d</td>",
+                                  s->inf->st_mode & 07777,
+                                  s->inf->st_uid,
+                                  s->inf->st_gid);
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+static void do_home_host(HttpRequest req, HttpResponse res) {
+        
+        Service_T  s;
+        Icmp_T     icmp;
+        Port_T     port;
+        char       buf[STRLEN];
+        int        on= TRUE;
+        int        header= TRUE;
+        
+        for(s= servicelist_conf; s; s= s->next_conf) {
+                
+                if(s->type != TYPE_HOST) continue;
+                
+                if(header) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<table id='header-row'>"
+                                  "<tr>"
+                                  "<th align='left' class='first'>Host</th>"
+                                  "<th align='left'>Status</th>"
+                                  "<th align='right'>Protocol(s)</th>"
+                                  "</tr>");
+                        
+                        header= FALSE;
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer,
+                          "<tr %s>"
+                          "<td align='left'><a href='%s'>%s</a></td>"
+                          "<td align='left'>%s</td>",
+                          on?"class='stripe'":"",
+                          s->name, s->name, get_service_status_html(s, buf, sizeof(buf)));
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>-</td>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<td align='right'>");
+                        
+                        if(s->icmplist) {
+                                for(icmp= s->icmplist; icmp; icmp= icmp->next) {
+                                        if(icmp != s->icmplist)
+                                                StringBuffer_append(res->outputbuffer, "&nbsp;&nbsp;<b>|</b>&nbsp;&nbsp;");
+                                        StringBuffer_append(res->outputbuffer, "<span class='%s'>[ICMP %s]</span>",
+                                                  (icmp->is_available)?"":"red-text",
+                                                  icmpnames[icmp->type]);
+                                }
+                        }
+                        
+                        if(s->icmplist && s->portlist)
+                                StringBuffer_append(res->outputbuffer, "&nbsp;&nbsp;<b>|</b>&nbsp;&nbsp;");
+                        
+                        if(s->portlist) {
+                                for(port= s->portlist; port; port= port->next) {
+                                        if(port != s->portlist)
+                                                StringBuffer_append(res->outputbuffer, "&nbsp;&nbsp;<b>|</b>&nbsp;&nbsp;");
+                                        StringBuffer_append(res->outputbuffer, "<span class='%s'>[%s] at port %d</span>",
+                                                  (port->is_available)?"":"red-text",
+                                                  port->protocol->name, port->port);
+                                }
+                        }
+                        
+                        StringBuffer_append(res->outputbuffer, "</td>");
+                        
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</tr>");
+                
+                on= on?FALSE:TRUE;
+                
+        }
+        
+        if(!header)
+                StringBuffer_append(res->outputbuffer, "</table>");
+        
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+static void print_alerts(HttpResponse res, Mail_T s) {
+        
+        Mail_T r;
+        
+        for(r= s; r; r= r->next) {
+                StringBuffer_append(res->outputbuffer,
+                          "<tr class='stripe'><td>Alert mail to</td>"
+                          "<td>%s</td></tr>", r->to?r->to:"");
+                StringBuffer_append(res->outputbuffer, "<tr><td>Alert on</td><td>");
+                
+                if(r->events == Event_Null) {
+                        StringBuffer_append(res->outputbuffer, "No events");
+                } else if(r->events == Event_All) {
+                        StringBuffer_append(res->outputbuffer, "All events");
+                } else {
+                        if(IS_EVENT_SET(r->events, Event_Action))
+                                StringBuffer_append(res->outputbuffer, "Action ");
+                        if(IS_EVENT_SET(r->events, Event_Checksum))
+                                StringBuffer_append(res->outputbuffer, "Checksum ");
+                        if(IS_EVENT_SET(r->events, Event_Connection))
+                                StringBuffer_append(res->outputbuffer, "Connection ");
+                        if(IS_EVENT_SET(r->events, Event_Content))
+                                StringBuffer_append(res->outputbuffer, "Content ");
+                        if(IS_EVENT_SET(r->events, Event_Data))
+                                StringBuffer_append(res->outputbuffer, "Data ");
+                        if(IS_EVENT_SET(r->events, Event_Exec))
+                                StringBuffer_append(res->outputbuffer, "Exec ");
+                        if(IS_EVENT_SET(r->events, Event_Fsflag))
+                                StringBuffer_append(res->outputbuffer, "Fsflags ");
+                        if(IS_EVENT_SET(r->events, Event_Gid))
+                                StringBuffer_append(res->outputbuffer, "Gid ");
+                        if(IS_EVENT_SET(r->events, Event_Icmp))
+                                StringBuffer_append(res->outputbuffer, "Icmp ");
+                        if(IS_EVENT_SET(r->events, Event_Instance))
+                                StringBuffer_append(res->outputbuffer, "Instance ");
+                        if(IS_EVENT_SET(r->events, Event_Invalid))
+                                StringBuffer_append(res->outputbuffer, "Invalid ");
+                        if(IS_EVENT_SET(r->events, Event_Nonexist))
+                                StringBuffer_append(res->outputbuffer, "Nonexist ");
+                        if(IS_EVENT_SET(r->events, Event_Permission))
+                                StringBuffer_append(res->outputbuffer, "Permission ");
+                        if(IS_EVENT_SET(r->events, Event_Pid))
+                                StringBuffer_append(res->outputbuffer, "PID ");
+                        if(IS_EVENT_SET(r->events, Event_PPid))
+                                StringBuffer_append(res->outputbuffer, "PPID ");
+                        if(IS_EVENT_SET(r->events, Event_Resource))
+                                StringBuffer_append(res->outputbuffer, "Resource ");
+                        if(IS_EVENT_SET(r->events, Event_Size))
+                                StringBuffer_append(res->outputbuffer, "Size ");
+                        if(IS_EVENT_SET(r->events, Event_Status))
+                                StringBuffer_append(res->outputbuffer, "Status ");
+                        if(IS_EVENT_SET(r->events, Event_Timeout))
+                                StringBuffer_append(res->outputbuffer, "Timeout ");
+                        if(IS_EVENT_SET(r->events, Event_Timestamp))
+                                StringBuffer_append(res->outputbuffer, "Timestamp ");
+                        if(IS_EVENT_SET(r->events, Event_Uid))
+                                StringBuffer_append(res->outputbuffer, "Uid ");
+                        if(IS_EVENT_SET(r->events, Event_Uptime))
+                                StringBuffer_append(res->outputbuffer, "Uptime ");
+                }
+                
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+                
+                if(r->reminder) {
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Alert reminder</td><td>%u cycles</td></tr>",
+                                  r->reminder);
+                }
+                
+        }
+        
+}
+
+
+static void print_buttons(HttpRequest req, HttpResponse res, Service_T s) {
+        
+        if(is_readonly(req)) {
+                /*
+                 * A read-only REMOTE_USER does not get access to these buttons
+                 */
+                return;
+        }
+        
+        StringBuffer_append(res->outputbuffer, "<table id='buttons'><tr><td>");
+        /* Start program */
+        if(s->start)
+                StringBuffer_append(res->outputbuffer, 
+                          "<td><form method=POST action=%s>"
+                          "<input type=hidden value='start' name=action>"
+                          "<input type=submit value='Start service'></form></td>", s->name);
+        /* Stop program */
+        if(s->stop)
+                StringBuffer_append(res->outputbuffer, 
+                          "<td><form method=POST action=%s>"
+                          "<input type=hidden value='stop' name=action>"
+                          "<input type=submit value='Stop service'></form></td>", s->name);
+        /* Restart program */
+        if(s->start && s->stop)
+                StringBuffer_append(res->outputbuffer, 
+                          "<td><form method=POST action=%s>"
+                          "<input type=hidden value='restart' name=action>"
+                          "<input type=submit value='Restart service'></form></td>", s->name);
+        /* (un)monitor */
+        StringBuffer_append(res->outputbuffer, 
+                  "<td><form method=POST action=%s>"
+                  "<input type=hidden value='%s' name=action>"
+                  "<input type=submit value='%s'></form></td></tr></table>",
+                  s->name,
+                  s->monitor ? "unmonitor" : "monitor",
+                  s->monitor ? "Disable monitoring" : "Enable monitoring");
+}
+
+
+static void print_service_rules_port(HttpResponse res, Service_T s) {
+        if(s->portlist) {
+                char buf[STRLEN];
+                Port_T        p;
+                EventAction_T a;
+                for(p= s->portlist; p; p= p->next) {
+                        a= p->action;
+                        if(p->family == AF_INET) {
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Port</td><td>If failed [%s:%d%s [%s via %s] with timeout %d seconds and retry %d time(s)] %s ", p->hostname, p->port, p->request ? p->request : "", p->protocol->name, Util_portTypeDescription(p), p->timeout, p->retry > 1 ? p->retry : 0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                if(p->SSL.certmd5 != NULL)
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "<tr><td>Server certificate md5 sum</td><td>%s</td></tr>",
+                                                  p->SSL.certmd5);
+                        } else if(p->family == AF_UNIX) {
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Unix Socket</td><td>If failed [%s [%s] with timeout %ds and retry %d time(s)] %s ", p->pathname, p->protocol->name, p->timeout, p->retry > 1 ? p->retry : 0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        }
+                }
+        }
+}
+
+
+static void print_service_rules_icmp(HttpResponse res, Service_T s) {
+        if(s->icmplist) {
+                char buf[STRLEN];
+                Icmp_T        i;
+                EventAction_T a;
+                for(i= s->icmplist; i; i= i->next) {
+                        a= i->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>ICMP</td><td>If failed [%s count %d with timeout %d seconds] %s ", icmpnames[i->type], i->count, i->timeout, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                }
+        }
+}
+
+
+static void print_service_rules_perm(HttpResponse res, Service_T s) {
+        if(s->perm) {
+                char buf[STRLEN];
+                EventAction_T a= s->perm->action;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Associated permission</td><td>If failed %o %s ", s->perm->perm, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+        }
+}
+
+
+static void print_service_rules_uid(HttpResponse res, Service_T s) {
+        if(s->uid) {
+                char buf[STRLEN];
+                EventAction_T a= s->uid->action;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Associated UID</td><td>If failed %d %s ", (int)s->uid->uid, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+        }
+}
+
+
+static void print_service_rules_gid(HttpResponse res, Service_T s) {
+        if(s->gid) {
+                char buf[STRLEN];
+                EventAction_T a= s->gid->action;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Associated GID</td><td>If failed %d %s ", (int)s->gid->gid, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+        }
+}
+
+
+static void print_service_rules_timestamp(HttpResponse res, Service_T s) {
+        if(s->timestamplist) {
+                char buf[STRLEN];
+                Timestamp_T   t;
+                EventAction_T a;
+                for(t= s->timestamplist; t; t= t->next) {
+                        a= t->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Associated timestamp</td><td>");
+                        if(t->test_changes) {
+                                StringBuffer_append(res->outputbuffer, "If changed %s ", Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        } else {
+                                StringBuffer_append(res->outputbuffer, "If %s %d second(s) %s ", operatornames[t->operator], t->time, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        }
+                        StringBuffer_append(res->outputbuffer, "</td></tr>");
+                }
+        }
+}
+
+
+static void print_service_rules_filesystem(HttpResponse res, Service_T s) {
+        char buf[STRLEN];
+        
+        if(s->type == TYPE_FILESYSTEM) {
+                StringBuffer_append(res->outputbuffer, "<tr><td>Filesystem flags</td><td>If changed %s ", Util_getEventratio(s->action_FSFLAG->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(s->action_FSFLAG->failed, buf, sizeof(buf)));
+        }
+        
+        if(s->filesystemlist) {
+                Filesystem_T  dl;
+                EventAction_T a;
+                
+                for(dl= s->filesystemlist; dl; dl= dl->next) {
+                        
+                        a= dl->action;
+                        
+                        if(dl->resource == RESOURCE_ID_INODE) {
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Inodes usage limit</td><td>");
+                                if(dl->limit_absolute > -1) {
+                                        StringBuffer_append(res->outputbuffer, "If %s %ld %s ", operatornames[dl->operator], dl->limit_absolute, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                } else {
+                                        StringBuffer_append(res->outputbuffer, "If %s %.1f%% %s ", operatornames[dl->operator], dl->limit_percent / 10., Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                }
+                                StringBuffer_append(res->outputbuffer, "</td></tr>");
+                        } else if(dl->resource == RESOURCE_ID_SPACE) {
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Space usage limit</td><td>");
+                                if(dl->limit_absolute > -1) {
+                                        StringBuffer_append(res->outputbuffer, "If %s %ld blocks %s ", operatornames[dl->operator], dl->limit_absolute, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                } else {
+                                        StringBuffer_append(res->outputbuffer, "If %s %.1f%% %s ", operatornames[dl->operator], dl->limit_percent / 10., Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                }
+                                StringBuffer_append(res->outputbuffer, "</td></tr>");
+                        }
+                }
+        }
+}
+
+
+static void print_service_rules_size(HttpResponse res, Service_T s) {
+        if(s->sizelist) {
+                char buf[STRLEN];
+                Size_T        sl;
+                EventAction_T a;
+                
+                for(sl= s->sizelist; sl; sl= sl->next) {
+                        a= sl->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Associated size</td><td>");
+                        if(sl->test_changes) {
+                                StringBuffer_append(res->outputbuffer, "If changed %s ", Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        } else {
+                                StringBuffer_append(res->outputbuffer, "If %s %llu byte(s) %s ", operatornames[sl->operator], sl->size, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        }
+                        StringBuffer_append(res->outputbuffer, "</td></tr>");
+                }
+        }
+}
+
+static void print_service_rules_uptime(HttpResponse res, Service_T s) {
+        if(s->uptimelist) {
+                char buf[STRLEN];
+                Uptime_T      ul;
+                EventAction_T a;
+
+                for(ul= s->uptimelist; ul; ul= ul->next) {
+                        a= ul->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Associated uptime</td><td>");
+                        StringBuffer_append(res->outputbuffer, "If %s %llu second(s) %s ", operatornames[ul->operator], ul->uptime, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "</td></tr>");
+                }
+        }
+}
+
+static void print_service_rules_match(HttpResponse res, Service_T s) {
+        if (s->type != TYPE_PROCESS) {
+                char buf[STRLEN];
+                Match_T ml;
+                EventAction_T a;
+                for (ml = s->matchignorelist; ml; ml = ml->next) {
+                        a = ml->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Associated ignore pattern</td><td>If %smatch \"%s\" %s ", ml->not ? "not " : "", ml->match_string, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->failed, buf, sizeof(buf)));
+                }
+                for (ml = s->matchlist; ml; ml = ml->next) {
+                        a = ml->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Associated pattern</td><td>If %smatch \"%s\" %s ", ml->not ? "not " : "", ml->match_string, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->failed, buf, sizeof(buf)));
+                }
+        }
+}
+
+
+static void print_service_rules_checksum(HttpResponse res, Service_T s) {
+        if(s->checksum) {
+                char buf[STRLEN];
+                Checksum_T     cs= s->checksum;
+                EventAction_T  a= cs->action;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Associated regex</td><td>");
+                if(cs->test_changes) {
+                        StringBuffer_append(res->outputbuffer, "If changed %s %s ", checksumnames[cs->type], Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                } else {
+                        StringBuffer_append(res->outputbuffer, "If failed %s(%s) %s ", cs->hash, checksumnames[cs->type], Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                }
+                StringBuffer_append(res->outputbuffer, "</td></tr>");
+        }
+}
+
+
+static void print_service_rules_process(HttpResponse res, Service_T s) {
+        if(s->type == TYPE_PROCESS) {
+                char buf[STRLEN];
+                StringBuffer_append(res->outputbuffer, "<tr><td>Pid</td><td>If changed %s ", Util_getEventratio(s->action_PID->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(s->action_PID->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "<tr><td>Ppid</td><td>If changed %s ", Util_getEventratio(s->action_PPID->failed, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(s->action_PPID->failed, buf, sizeof(buf)));
+        }
+}
+
+
+static void print_service_rules_program(HttpResponse res, Service_T s) {
+        if(s->type == TYPE_PROGRAM) {
+                char buf[STRLEN];
+                Program_T p = s->program;
+                EventAction_T a= p->action;
+                StringBuffer_append(res->outputbuffer, "<tr><td>Test Exit value</td><td>if exit value %s %d within %d seconds ", operatorshortnames[p->operator], p->return_value, p->timeout);
+                StringBuffer_append(res->outputbuffer, "then %s</td></tr>", Util_describeAction(a->failed, buf, sizeof(buf)));
+        }
+}
+
+
+static void print_service_rules_resource(HttpResponse res, Service_T s) {
+        if(s->resourcelist) {
+                char buf[STRLEN];
+                Resource_T    q;
+                EventAction_T a;
+                
+                for (q= s->resourcelist; q; q= q->next) {
+                        a= q->action;
+                        StringBuffer_append(res->outputbuffer, "<tr><td>");
+                        switch (q->resource_id) {
+                                case RESOURCE_ID_CPU_PERCENT: 
+                                        StringBuffer_append(res->outputbuffer, "CPU usage limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_TOTAL_CPU_PERCENT: 
+                                        StringBuffer_append(res->outputbuffer, "CPU usage limit (incl. children)");
+                                        break;
+                                        
+                                case RESOURCE_ID_CPUUSER: 
+                                        StringBuffer_append(res->outputbuffer, "CPU user limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_CPUSYSTEM: 
+                                        StringBuffer_append(res->outputbuffer, "CPU system limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_CPUWAIT: 
+                                        StringBuffer_append(res->outputbuffer, "CPU wait limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_MEM_PERCENT: 
+                                        StringBuffer_append(res->outputbuffer, "Memory usage limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_MEM_KBYTE: 
+                                        StringBuffer_append(res->outputbuffer, "Memory amount limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_SWAP_PERCENT: 
+                                        StringBuffer_append(res->outputbuffer, "Swap usage limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_SWAP_KBYTE: 
+                                        StringBuffer_append(res->outputbuffer, "Swap amount limit");
+                                        break;
+                                        
+                                case RESOURCE_ID_LOAD1: 
+                                        StringBuffer_append(res->outputbuffer, "Load average (1min)");
+                                        break;
+                                        
+                                case RESOURCE_ID_LOAD5: 
+                                        StringBuffer_append(res->outputbuffer, "Load average (5min)");
+                                        break;
+                                        
+                                case RESOURCE_ID_LOAD15: 
+                                        StringBuffer_append(res->outputbuffer, "Load average (15min)");
+                                        break;
+                                        
+                                case RESOURCE_ID_CHILDREN:
+                                        StringBuffer_append(res->outputbuffer, "Children");
+                                        break;
+                                        
+                                case RESOURCE_ID_TOTAL_MEM_KBYTE:
+                                        StringBuffer_append(res->outputbuffer, "Memory amount limit (incl. children)");
+                                        break;
+                                        
+                                case RESOURCE_ID_TOTAL_MEM_PERCENT:
+                                        StringBuffer_append(res->outputbuffer, "Memory usage limit (incl. children)");
+                                        break;
+                        }
+                        StringBuffer_append(res->outputbuffer, "</td><td>");
+                        switch (q->resource_id) {
+                                case RESOURCE_ID_CPU_PERCENT: 
+                                case RESOURCE_ID_TOTAL_CPU_PERCENT:
+                                case RESOURCE_ID_TOTAL_MEM_PERCENT:
+                                case RESOURCE_ID_CPUUSER:
+                                case RESOURCE_ID_CPUSYSTEM:
+                                case RESOURCE_ID_CPUWAIT:
+                                case RESOURCE_ID_MEM_PERCENT:
+                                case RESOURCE_ID_SWAP_PERCENT:
+                                        StringBuffer_append(res->outputbuffer, "If %s %.1f%% %s ", operatornames[q->operator], q->limit / 10., Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                        break;
+                                        
+                                case RESOURCE_ID_MEM_KBYTE:
+                                case RESOURCE_ID_SWAP_KBYTE:
+                                        StringBuffer_append(res->outputbuffer, "If %s %ldkB %s ", operatornames[q->operator], q->limit, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                        break;
+                                        
+                                case RESOURCE_ID_LOAD1:
+                                case RESOURCE_ID_LOAD5:
+                                case RESOURCE_ID_LOAD15:
+                                        StringBuffer_append(res->outputbuffer, "If %s %.1f %s ", operatornames[q->operator], q->limit / 10.0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                        break;
+                                        
+                                case RESOURCE_ID_CHILDREN:
+                                case RESOURCE_ID_TOTAL_MEM_KBYTE:
+                                        StringBuffer_append(res->outputbuffer, "If %s %ld %s ", operatornames[q->operator], q->limit, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                        StringBuffer_append(res->outputbuffer, "then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                        break;
+                        }
+                        StringBuffer_append(res->outputbuffer, "</td></tr>");
+                }
+        }
+}
+
+
+static void print_service_params_port(HttpResponse res, Service_T s) {
+        
+        if((s->type == TYPE_HOST ||
+            s->type == TYPE_PROCESS) &&
+           s-> portlist) {
+                
+                Port_T p;
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        for(p= s->portlist; p; p= p->next)
+                                if(p->family == AF_INET) {
+                                        StringBuffer_append(res->outputbuffer, "<tr><td>Port Response time</td><td>-</td></tr>");
+                                } else if(p->family == AF_UNIX) {
+                                        StringBuffer_append(res->outputbuffer, "<tr><td>Unix Socket Response time</td><td>-</td></tr>");
+                                }
+                        
+                } else {
+                        
+                        for(p= s->portlist; p; p= p->next) {
+                                if(p->family == AF_INET) {
+                                        if(!p->is_available) {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "<tr><td>Port Response time</td>"
+                                                          "<td class='red-text'>connection failed to %s:%d%s [%s via %s]</td>"
+                                                          "</tr>",
+                                                          p->hostname, p->port, p->request?p->request:"",
+                                                          p->protocol->name, Util_portTypeDescription(p));
+                                        } else {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "<tr><td>Port Response time</td>"
+                                                          "<td>%.3fs to %s:%d%s [%s via %s]</td></tr>",
+                                                          p->response, p->hostname, p->port, p->request?p->request:"",
+                                                          p->protocol->name, Util_portTypeDescription(p));
+                                        }
+                                } else if(p->family == AF_UNIX) {
+                                        if(!p->is_available) {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "<tr><td>Unix Socket Response time</td>"
+                                                          "<td class='red-text'>connection failed to %s [%s]</td>"
+                                                          "</tr>",
+                                                          p->pathname, p->protocol->name);
+                                        } else {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "<tr><td>Unix Socket Response time</td>"
+                                                          "<td>%.3fs to %s [%s]</td></tr>",
+                                                          p->response, p->pathname, p->protocol->name);
+                                        }
+                                }
+                        }
+                }
+        }
+}
+
+
+static void print_service_params_icmp(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_HOST && s->icmplist) {
+                
+                Icmp_T i;
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        for(i= s->icmplist; i; i= i->next)
+                                StringBuffer_append(res->outputbuffer, "<tr><td>ICMP Response time</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        for(i= s->icmplist; i; i= i->next) {
+                                if(!i->is_available) {
+                                        StringBuffer_append(res->outputbuffer, "<tr><td>ICMP Response time</td><td class='red-text'>connection failed [%s]</td></tr>", icmpnames[i->type]);
+                                } else {
+                                        StringBuffer_append(res->outputbuffer, "<tr><td>ICMP Response time</td><td>%.3fs [%s]</td></tr>", i->response, icmpnames[i->type]);
+                                }
+                        }
+                }
+        }
+}
+
+
+static void print_service_params_perm(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE ||
+           s->type == TYPE_FIFO ||
+           s->type == TYPE_DIRECTORY ||
+           s->type == TYPE_FILESYSTEM) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Permission</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Permission</td><td class='%s'>%o</td></tr>",
+                                  (s->error & Event_Permission)?"red-text":"",
+                                  s->inf->st_mode & 07777);
+                        
+                }
+        }
+}
+
+
+static void print_service_params_uid(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE ||
+           s->type == TYPE_FIFO ||
+           s->type == TYPE_DIRECTORY ||
+           s->type == TYPE_FILESYSTEM) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer, "<tr><td>UID</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>UID</td><td class='%s'>%d</td></tr>",
+                                  (s->error & Event_Uid)?"red-text":"",
+                                  (int)s->inf->st_uid);
+                        
+                }
+        }
+}
+
+
+static void print_service_params_gid(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE ||
+           s->type == TYPE_FIFO ||
+           s->type == TYPE_DIRECTORY ||
+           s->type == TYPE_FILESYSTEM) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer, "<tr><td>GID</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>GID</td><td class='%s'>%d</td></tr>",
+                                  (s->error & Event_Gid)?"red-text":"",
+                                  (int)s->inf->st_gid);
+                        
+                }
+        }
+}
+
+
+static void print_service_params_timestamp(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE ||
+           s->type == TYPE_FIFO ||
+           s->type == TYPE_DIRECTORY) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Timestamp</td><td>-</td></tr>");
+                        
+                } else {
+                        char t[32];
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Timestamp</td><td class='%s'>%s</td></tr>",
+                                  (s->error & Event_Timestamp)?"red-text":"", Time_string(s->inf->timestamp, t));
+                }
+        }
+}
+
+
+static void print_service_params_filesystem(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILESYSTEM) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Filesystem flags</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks total</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks free for non superuser</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks free total</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Block size</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Inodes total</td><td>-</td></tr>");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Inodes free</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Filesystem flags</td><td>0x%x</td></tr>",
+                                  s->inf->priv.filesystem.flags);
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks total</td><td>%ld [%.1f MB]</td></tr>",
+                                  s->inf->priv.filesystem.f_blocks,
+                                  s->inf->priv.filesystem.f_bsize > 0 ? ((float) s->inf->priv.filesystem.f_blocks/1048576*s->inf->priv.filesystem.f_bsize) : 0);
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks free for non superuser</td>"
+                                  "<td>%ld [%.1f MB] [%.1f%%]</td></tr>",
+                                  s->inf->priv.filesystem.f_blocksfree,
+                                  s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.f_blocksfree / (float)1048576 * (float)s->inf->priv.filesystem.f_bsize) : 0,
+                                  s->inf->priv.filesystem.f_blocks > 0 ? ((float)100 * (float)s->inf->priv.filesystem.f_blocksfree / (float)s->inf->priv.filesystem.f_blocks) : 0);
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Blocks free total</td>"
+                                  "<td class='%s'>%ld [%.1f MB] [%.1f%%]</td></tr>",
+                                  (s->error & Event_Resource)?"red-text":"",
+                                  s->inf->priv.filesystem.f_blocksfreetotal,
+                                  s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.f_blocksfreetotal / (float)1048576 * (float)s->inf->priv.filesystem.f_bsize) : 0,
+                                  s->inf->priv.filesystem.f_blocks > 0 ? ((float)100 * (float)s->inf->priv.filesystem.f_blocksfreetotal / (float)s->inf->priv.filesystem.f_blocks) : 0);
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Block size</td><td>%ld B</td></tr>", s->inf->priv.filesystem.f_bsize);
+                        
+                        if(s->inf->priv.filesystem.f_files > 0) {
+                                
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Inodes total</td><td>%ld</td></tr>", s->inf->priv.filesystem.f_files);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Inodes free</td><td class='%s'>%ld [%.1f%%]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.filesystem.f_filesfree,
+                                          (float)100 * (float)s->inf->priv.filesystem.f_filesfree / (float)s->inf->priv.filesystem.f_files);
+                                
+                        }
+                }
+        }
+}
+
+
+static void print_service_params_size(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Size</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Size</td><td class='%s'>%llu B</td></tr>",
+                                  (s->error & Event_Size)?"red-text":"",
+                                  (unsigned long long) s->inf->priv.file.st_size);
+                        
+                }
+        }
+}
+
+static void print_service_params_match(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Match regex</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Match regex</td><td class='%s'>%s</td></tr>",
+                                  (s->error & Event_Content)?"red-text":"",
+                                  (s->error & Event_Content)?"yes":"no");
+                }
+        }
+}
+
+
+static void print_service_params_checksum(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_FILE && s->checksum) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer, "<tr><td>Checksum</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Checksum</td><td class='%s'>%s(%s)</td></tr>",
+                                  (s->error & Event_Checksum)?"red-text":"", s->inf->priv.file.cs_sum,
+                                  checksumnames[s->checksum->type]);
+                        
+                }
+        }
+}
+
+
+static void print_service_params_process(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_PROCESS) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Process id </td><td>-</td></tr>"
+                                  "<tr><td>Parent process id </td><td>-</td></tr>"
+                                  "<tr><td>Process uptime</td><td>-</td></tr>");
+                        
+                } else {
+                        
+                        char *uptime;
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Process id </td><td>%d</td></tr>",
+                                  s->inf->priv.process.pid > 0 ? s->inf->priv.process.pid : 0);
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Parent process id </td><td>%d</td></tr>",
+                                  s->inf->priv.process.ppid > 0 ? s->inf->priv.process.ppid : 0);
+                        
+                        uptime= Util_getUptime(s->inf->priv.process.uptime, "&nbsp;");
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Process uptime</td><td>%s</td></tr>",
+                                  uptime);
+                        FREE(uptime);
+                }
+        }
+}
+
+
+static void print_service_params_resource(HttpResponse res, Service_T s) {
+        
+        if(Run.doprocess && (s->type == TYPE_PROCESS || s->type == TYPE_SYSTEM) ) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        if(s->type == TYPE_PROCESS) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>CPU usage</td><td>-</td></tr>"
+                                          "<tr><td>Memory usage</td><td>-</td></tr>"
+                                          "<tr><td>Children</td><td>-</td></tr>"
+                                          "<tr><td>Total CPU usage (incl. children)</td><td>-</td></tr>"
+                                          "<tr><td>Total memory usage (incl. children)</td><td>-</td></tr>");
+                        } else if(s->type == TYPE_SYSTEM) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Load average</td><td>-</td></tr>"
+                                          "<tr><td>CPU usage</td><td>-</td></tr>"
+                                          "<tr><td>Memory usage</td><td>-</td></tr>");
+                        }
+                } else {
+                        
+                        if(s->type == TYPE_PROCESS) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Children</td><td class='%s'>%d</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.children);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>CPU usage</td><td class='%s'>%.1f%%  &nbsp;&nbsp;(Usage / Number of CPUs)</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.cpu_percent/10.0);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Total CPU usage (incl. children)</td><td class='%s'>%.1f%%</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.total_cpu_percent/10.0);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Memory usage</td><td class='%s'>%.1f%% [%ldkB]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.mem_percent/10.0, s->inf->priv.process.mem_kbyte);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Total memory usage (incl. children)</td><td class='%s'>%.1f%% [%ldkB]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          s->inf->priv.process.total_mem_percent/10.0, s->inf->priv.process.total_mem_kbyte);
+                        } else if(s->type == TYPE_SYSTEM) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Load average</td><td class='%s'>[%.2f] [%.2f] [%.2f]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          systeminfo.loadavg[0],
+                                          systeminfo.loadavg[1],
+                                          systeminfo.loadavg[2]);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>CPU usage</td><td class='%s'>%.1f%%us %.1f%%sy"
+#ifdef HAVE_CPU_WAIT
+                                          " %.1f%%wa"
+#endif
+                                          "%s",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          systeminfo.total_cpu_user_percent > 0 ? systeminfo.total_cpu_user_percent/10. : 0,
+                                          systeminfo.total_cpu_syst_percent > 0 ? systeminfo.total_cpu_syst_percent/10. : 0,
+#ifdef HAVE_CPU_WAIT
+                                          systeminfo.total_cpu_wait_percent > 0 ? systeminfo.total_cpu_wait_percent/10. : 0,
+#endif
+                                          "</td></tr>");
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Memory usage</td><td class='%s'>%ld kB [%.1f%%]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          systeminfo.total_mem_kbyte,
+                                          systeminfo.total_mem_percent/10.);
+                                StringBuffer_append(res->outputbuffer,
+                                          "<tr><td>Swap usage</td><td class='%s'>%ld kB [%.1f%%]</td></tr>",
+                                          (s->error & Event_Resource)?"red-text":"",
+                                          systeminfo.total_swap_kbyte,
+                                          systeminfo.total_swap_percent/10.);
+                        }
+                }
+        }
+}
+
+
+static void print_service_params_program(HttpResponse res, Service_T s) {
+        
+        if(s->type == TYPE_PROGRAM) {
+                
+                if(!Util_hasServiceStatus(s)) {
+                        
+                        StringBuffer_append(res->outputbuffer,
+                                  "<tr><td>Last started</td><td>-</td></tr>"
+                                  "<tr><td>Last Exit value</td><td>-</td></tr>");
+                        
+                } else {
+                        if (s->program->started) {
+                                char t[32];
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Last started</td><td>%s</td></tr>", Time_string(s->program->started, t));
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Last Exit value</td><td>%d</td></tr>", s->program->exitStatus);
+                        } else {
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Last started</td><td>Not yet started</td></tr>");
+                                StringBuffer_append(res->outputbuffer, "<tr><td>Last Exit value</td><td>N/A</td></tr>");
+                        }
+                }
+        }
+}
+
+
+static int is_readonly(HttpRequest req) {
+        
+        if(req->remote_user) {
+                Auth_T user_creds = Util_getUserCredentials(req->remote_user);
+                return ( user_creds?user_creds->is_readonly:TRUE );
+        }
+        
+        return FALSE;
+        
+}
+
+
+/* ----------------------------------------------------------- Status output */
+
+
+/* Print status in the given format. Text status is default. */
+static void print_status(HttpRequest req, HttpResponse res, int version)
+{
+        Service_T s;
+        short level = LEVEL_FULL;
+        const char *stringFormat = get_parameter(req, "format");
+        const char *stringLevel = get_parameter(req, "level");
+        
+        if(stringLevel && Str_startsWith(stringLevel, LEVEL_NAME_SUMMARY))
+        {
+                level = LEVEL_SUMMARY;
+        }
+        
+        if(stringFormat && Str_startsWith(stringFormat, "xml"))
+        {
+                StringBuffer_T sb = StringBuffer_create(256);
+                status_xml(sb, NULL, level, version, socket_get_local_host(req->S));
+                StringBuffer_append(res->outputbuffer, "%s", StringBuffer_toString(sb));
+                StringBuffer_free(&sb);
+                set_content_type(res, "text/xml");
+        }
+        else
+        {
+                char *uptime = Util_getUptime(Util_getProcessUptime(Run.pidfile), " ");
+                StringBuffer_append(res->outputbuffer, "The Monit daemon %s uptime: %s\n\n", VERSION, uptime);
+                FREE(uptime);
+                
+                for(s= servicelist_conf; s; s= s->next_conf)
+                {
+                        status_service_txt(s, res, level);
+                }
+                set_content_type(res, "text/plain");
+        }
+}
+
+
+static void status_service_txt(Service_T s, HttpResponse res, short level) {
+        char buf[STRLEN];
+        if(level == LEVEL_SUMMARY)
+        {
+                char prefix[STRLEN];
+                snprintf(prefix, STRLEN, "%s '%s'", servicetypes[s->type], s->name);
+                StringBuffer_append(res->outputbuffer, "%-35s %s\n", prefix, get_service_status(s, buf, sizeof(buf)));
+        }
+        else
+        {
+                StringBuffer_append(res->outputbuffer,
+                          "%s '%s'\n"
+                          "  %-33s %s\n",
+                          servicetypes[s->type], s->name,
+                          "status", get_service_status(s, buf, sizeof(buf)));
+                StringBuffer_append(res->outputbuffer,
+                          "  %-33s %s\n",
+                          "monitoring status", get_monitoring_status(s, buf, sizeof(buf)));
+                
+                if(Util_hasServiceStatus(s)) {
+                        if(s->type == TYPE_FILE ||
+                           s->type == TYPE_FIFO || 
+                           s->type == TYPE_DIRECTORY || 
+                           s->type == TYPE_FILESYSTEM) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s %o\n"
+                                          "  %-33s %d\n"
+                                          "  %-33s %d\n",
+                                          "permission", s->inf->st_mode & 07777,
+                                          "uid", (int)s->inf->st_uid,
+                                          "gid", (int)s->inf->st_gid);
+                        }
+                        if(s->type == TYPE_FILE ||
+                           s->type == TYPE_FIFO || 
+                           s->type == TYPE_DIRECTORY) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s %s\n",
+                                          "timestamp", Time_string(s->inf->timestamp, buf));
+                        }
+                        if(s->type == TYPE_FILE) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s %llu B\n",
+                                          "size", (unsigned long long) s->inf->priv.file.st_size);
+                                if(s->checksum) {
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s %s (%s)\n",
+                                                  "checksum", s->inf->priv.file.cs_sum, 
+                                                  checksumnames[s->checksum->type]);
+                                }
+                        }
+                        if(s->type == TYPE_FILESYSTEM) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s 0x%x\n"
+                                          "  %-33s %ld B\n"
+                                          "  %-33s %ld [%.1f MB]\n"
+                                          "  %-33s %ld [%.1f MB] [%.1f%%]\n"
+                                          "  %-33s %ld [%.1f MB] [%.1f%%]\n",
+                                          "filesystem flags",
+                                          s->inf->priv.filesystem.flags,
+                                          "block size",
+                                          s->inf->priv.filesystem.f_bsize,
+                                          "blocks total",
+                                          s->inf->priv.filesystem.f_blocks,
+                                          s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.f_blocks / (float)1048576* (float)s->inf->priv.filesystem.f_bsize) : 0,
+                                          "blocks free for non superuser",
+                                          s->inf->priv.filesystem.f_blocksfree,
+                                          s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.f_blocksfree / (float)1048576* (float)s->inf->priv.filesystem.f_bsize) : 0,
+                                          s->inf->priv.filesystem.f_blocks > 0 ? ((float)100 * (float)s->inf->priv.filesystem.f_blocksfree / (float)s->inf->priv.filesystem.f_blocks) : 0,
+                                          "blocks free total",
+                                          s->inf->priv.filesystem.f_blocksfreetotal,
+                                          s->inf->priv.filesystem.f_bsize > 0 ? ((float)s->inf->priv.filesystem.f_blocksfreetotal/(float)1048576* (float)s->inf->priv.filesystem.f_bsize) : 0,
+                                          s->inf->priv.filesystem.f_blocks > 0 ? ((float)100 * (float)s->inf->priv.filesystem.f_blocksfreetotal / (float)s->inf->priv.filesystem.f_blocks) : 0);
+                                if(s->inf->priv.filesystem.f_files > 0) {
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s %ld\n"
+                                                  "  %-33s %ld [%.1f%%]\n",
+                                                  "inodes total",
+                                                  s->inf->priv.filesystem.f_files,
+                                                  "inodes free",
+                                                  s->inf->priv.filesystem.f_filesfree,
+                                                  ((float)100*(float)s->inf->priv.filesystem.f_filesfree/ (float)s->inf->priv.filesystem.f_files));
+                                }
+                        }
+                        if(s->type == TYPE_PROCESS) {
+                                char *uptime= Util_getUptime(s->inf->priv.process.uptime, " ");
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s %d\n"
+                                          "  %-33s %d\n"
+                                          "  %-33s %s\n",
+                                          "pid", s->inf->priv.process.pid > 0 ? s->inf->priv.process.pid : 0,
+                                          "parent pid", s->inf->priv.process.ppid > 0 ? s->inf->priv.process.ppid : 0,
+                                          "uptime", uptime);
+                                FREE(uptime);
+                                if(Run.doprocess)        {
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s %d\n"
+                                                  "  %-33s %ld\n"
+                                                  "  %-33s %ld\n"
+                                                  "  %-33s %.1f%%\n"
+                                                  "  %-33s %.1f%%\n"
+                                                  "  %-33s %.1f%%\n"
+                                                  "  %-33s %.1f%%\n",
+                                                  "children", s->inf->priv.process.children,
+                                                  "memory kilobytes", s->inf->priv.process.mem_kbyte,
+                                                  "memory kilobytes total", s->inf->priv.process.total_mem_kbyte,
+                                                  "memory percent", s->inf->priv.process.mem_percent/10.0,
+                                                  "memory percent total", s->inf->priv.process.total_mem_percent/10.0,
+                                                  "cpu percent", s->inf->priv.process.cpu_percent/10.0,
+                                                  "cpu percent total", s->inf->priv.process.total_cpu_percent/10.0);
+                                }
+                        }
+                        if(s->type == TYPE_HOST && s->icmplist) {
+                                Icmp_T i;
+                                for(i= s->icmplist; i; i= i->next) {
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s %.3fs [%s]\n",
+                                                  "icmp response time", i->is_available ? i->response : 0.,
+                                                  icmpnames[i->type]);
+                                }
+                        }
+                        if((s->type == TYPE_HOST || s->type == TYPE_PROCESS) && s-> portlist) {
+                                Port_T p;
+                                for(p= s->portlist; p; p= p->next) {
+                                        if(p->family == AF_INET) {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "  %-33s %.3fs to %s:%d%s [%s via %s]\n",
+                                                          "port response time", p->is_available ? p->response : 0., 
+                                                          p->hostname,
+                                                          p->port, p->request?p->request:"", p->protocol->name,
+                                                          Util_portTypeDescription(p));
+                                        } else if(p->family == AF_UNIX) {
+                                                StringBuffer_append(res->outputbuffer,
+                                                          "  %-33s %.3fs to %s [%s]\n",
+                                                          "unix socket response time", p->is_available ? p->response : 0.,
+                                                          p->pathname, p->protocol->name);
+                                        }
+                                }
+                        }
+                        if(s->type == TYPE_SYSTEM && Run.doprocess) {
+                                StringBuffer_append(res->outputbuffer,
+                                          "  %-33s [%.2f] [%.2f] [%.2f]\n"
+                                          "  %-33s %.1f%%us %.1f%%sy"
+#ifdef HAVE_CPU_WAIT
+                                          " %.1f%%wa"
+#endif
+                                          "\n"
+                                          "  %-33s %ld kB [%.1f%%]\n"
+                                          "  %-33s %ld kB [%.1f%%]\n",
+                                          "load average",
+                                          systeminfo.loadavg[0],
+                                          systeminfo.loadavg[1],
+                                          systeminfo.loadavg[2],
+                                          "cpu",
+                                          systeminfo.total_cpu_user_percent > 0 ? systeminfo.total_cpu_user_percent/10. : 0,
+                                          systeminfo.total_cpu_syst_percent > 0 ? systeminfo.total_cpu_syst_percent/10. : 0,
+#ifdef HAVE_CPU_WAIT
+                                          systeminfo.total_cpu_wait_percent > 0 ? systeminfo.total_cpu_wait_percent/10. : 0,
+#endif
+                                          "memory usage",
+                                          systeminfo.total_mem_kbyte,
+                                          systeminfo.total_mem_percent/10.,
+                                          "swap usage",
+                                          systeminfo.total_swap_kbyte,
+                                          systeminfo.total_swap_percent/10.);
+                        }
+                        if(s->type == TYPE_PROGRAM) {
+                                if (s->program->started) {
+                                        char t[32];
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s %s\n"
+                                                  "  %-33s %d\n",
+                                                  "last started", Time_string(s->program->started, t),
+                                                  "last exit value", s->program->exitStatus);
+                                } else
+                                        StringBuffer_append(res->outputbuffer,
+                                                  "  %-33s\n",
+                                                  "not yet started");
+                        }
+                }
+                StringBuffer_append(res->outputbuffer, "  %-33s %s\n\n", "data collected", Time_string(s->collected.tv_sec, buf));
+        }
+}
+
+
+static char *get_monitoring_status(Service_T s, char *buf, int buflen) {
+        ASSERT(s);
+        ASSERT(buf);
+        if (s->monitor == MONITOR_NOT)
+                snprintf(buf, buflen, "Not monitored");
+        else if (s->monitor & MONITOR_WAITING)
+                snprintf(buf, buflen, "Waiting");
+        else if (s->monitor & MONITOR_INIT)
+                snprintf(buf, buflen, "Initializing");
+        else if (s->monitor & MONITOR_YES)
+                snprintf(buf, buflen, "Monitored");
+        return buf;
+}
+
+
+static char *get_service_status(Service_T s, char *buf, int buflen) {
+        EventTable_T *et = Event_Table;
+        ASSERT(s);
+        ASSERT(buf);
+        if(s->monitor == MONITOR_NOT || s->monitor & MONITOR_INIT || s->monitor & MONITOR_WAITING) {
+                get_monitoring_status(s, buf, buflen);
+        } else if (s->error == 0) {
+                snprintf(buf, buflen, "%s", statusnames[s->type]);
+        } else {
+                // In the case that the service has actualy some failure, error will be non zero. We will check the bitmap and print the description of the first error found
+                while((*et).id) {
+                        if(s->error & (*et).id) {
+                                snprintf(buf, buflen, "%s", (s->error_hint & (*et).id) ? (*et).description_changed : (*et).description_failed);
+                                break;
+                        }
+                        et++;
+                }
+        }
+        if(s->doaction)
+                snprintf(buf + strlen(buf), buflen - strlen(buf), " - %s pending", actionnames[s->doaction]);
+
+        return buf;
+}
+
+
+static char *get_service_status_html(Service_T s, char *buf, int buflen) {
+        ASSERT(s);
+        ASSERT(buf);
+        snprintf(buf, buflen, "<span class='%s-text'>", (s->monitor == MONITOR_NOT || s->monitor & MONITOR_INIT || s->monitor & MONITOR_WAITING) ? "gray" : ((! s->error) ? "green" : "red"));
+        get_service_status(s, buf + strlen(buf), buflen - (int)strlen(buf));
+        snprintf(buf + strlen(buf), buflen - strlen(buf), "</span>");
+        return buf;
+}
+
diff --git a/monit-5.4/src/http/cervlet.h b/monit-5.4/src/http/cervlet.h
new file mode 100644
index 0000000..6159020
--- /dev/null
+++ b/monit-5.4/src/http/cervlet.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef CERVLET_H
+#define CERVLET_H
+
+#include "config.h"
+
+#include "monit.h"
+
+#define HEAD_HTML \
+"<!DOCTYPE html>"\
+"<html>"\
+"<head>"\
+"<title>Monit: %s</title> "\
+"<style type=\"text/css\"> "\
+" html, body {height: 100%%;margin: 0;} "\
+" body {background-color: white;font: normal normal normal 14px/18px 'HelveticaNeue', Helvetica, Arial, sans-serif; color:#222;} "\
+" h1 {padding:30px 0 10px 0; text-align:center;color:#222;font-size:28px;} "\
+" h2 {padding:20px 0 10px 0; text-align:center;color:#555;font-size:22px;} "\
+" a:hover {text-decoration: none;} "\
+" a {text-decoration: underline;color:#222} "\
+" table {border-collapse:collapse; border:0;} "\
+" .stripe {background:#EDF5FF} "\
+" .red-text {color:#ff0000;} "\
+" .green-text {color:#00ff00;} "\
+" .gray-text {color:#999999;} "\
+" .blue-text {color:#0000ff;} "\
+" .orange-text {color:#ff8800;} "\
+" #wrap {min-height: 100%%;} "\
+" #main {overflow:auto; padding-bottom:50px;} "\
+" /*Opera Fix*/body:before {content:\"\";height:100%%;float:left;width:0;margin-top:-32767px;/} "\
+" #footer {position: relative;margin-top: -50px; height: 50px; clear:both; font-size:11px;color:#777;text-align:center;} "\
+" #footer a {color:#333;} #footer a:hover {text-decoration: none;} "\
+" #nav {background:#ddd;font:normal normal normal 14px/0px 'HelveticaNeue', Helvetica;} "\
+" #nav td {padding:5px 10px;} "\
+" #header {margin-bottom:30px;background:#EFF7FF} "\
+" #nav, #header {border-bottom:1px solid #555;} "\
+" #header-row {width:95%%;} "\
+" #header-row th {padding:30px 10px 10px 10px;font-size:120%%;} "\
+" #header-row td {padding:3px 10px;} "\
+" #header-row .first {min-width:200px;width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} "\
+" #status-table {width:95%%;} "\
+" #status-table th {text-align:left;background:#edf5ff;font-weight:normal;} "\
+" #status-table th, #status-table td, #status-table tr {border:1px solid #999;padding:5px;} "\
+" #buttons {font-size:20px; margin:40px 0 20px 0;} "\
+" #buttons td {padding-right:50px;} "\
+" #buttons input {font-size:18px;padding:5px;} "\
+"</style>"\
+"<meta HTTP-EQUIV='REFRESH' CONTENT=%d> "\
+"<meta HTTP-EQUIV='Expires' Content=0> "\
+"<meta HTTP-EQUIV='Pragma' CONTENT='no-cache'> "\
+"</head>"\
+"<body><div id='wrap'><div id='main'>" \
+"<table id='nav' width='100%%'>"\
+"  <tr>"\
+"    <td width='20%%'><a href='.'>Home</a>&nbsp;&gt;&nbsp;<a href='%s'>%s</a></td>"\
+"    <td width='60%%' style='text-align:center;'>Use <a href='http://mmonit.com/'>M/Monit</a> to manage all your Monit instances</td>"\
+"    <td width='20%%'><p align='right'><a href='_about'>Monit " VERSION "</a></td>"\
+"  </tr>"\
+"</table>"\
+"<center>"
+
+
+#define FOOT_HTML "</center></div></div>"\
+"<div id='footer'>"\
+"Copyright &copy; 2001-2012 <a href=\"http://tildeslash.com/\">Tildeslash</a>. All rights reserved. "\
+"<span style='margin-left:5px;'></span>"\
+"<a href=\"http://mmonit.com/monit/\">Monit web site</a> | "\
+"<a href=\"http://mmonit.com/wiki/\">Monit Wiki</a> | "\
+"<a href=\"http://mmonit.com/\">M/Monit</a>"\
+"</div></body></html>"
+
+
+#define HEAD(path, name, refresh) \
+   StringBuffer_append(res->outputbuffer, HEAD_HTML, Run.localhostname, refresh, path, name);
+
+#define FOOT  StringBuffer_append(res->outputbuffer, FOOT_HTML);
+
+
+/* Public prototypes */
+void init_service();
+
+#endif
diff --git a/monit-5.4/src/http/engine.c b/monit-5.4/src/http/engine.c
new file mode 100644
index 0000000..5c41dde
--- /dev/null
+++ b/monit-5.4/src/http/engine.c
@@ -0,0 +1,685 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#include "engine.h"
+#include "socket.h"
+
+
+/**
+ *  A naive http 1.0 server. The server delegates handling of a HTTP
+ *  request and response to the processor module.
+ *
+ *  NOTE
+ *    This server does not use threads or forks; Requests are
+ *    serialized and pending requests will be popped from the
+ *    connection queue when the current request finish.
+ *
+ *    Since this server is written for monit, low traffic is expected.
+ *    Connect from not-authenicated clients will be closed down
+ *    promptly. The authentication schema or access control is based
+ *    on client name/address/pam and only requests from known clients are
+ *    accepted. Hosts allowed to connect to this server should be
+ *    added to the access control list by calling add_host_allow().
+ *
+ *  @file 
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+static int myServerSocket= 0;
+static HostsAllow hostlist= NULL;
+static volatile int stopped= FALSE;
+ssl_server_connection *mySSLServerConnection= NULL;
+static pthread_mutex_t hostlist_mutex= PTHREAD_MUTEX_INITIALIZER;
+struct ulong_net {
+  unsigned long network;
+  unsigned long mask;
+};
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void check_Impl();
+static void initialize_service();
+static int  authenticate(const struct in_addr);
+static int  is_host_allow(const struct in_addr);
+static void destroy_host_allow(HostsAllow);
+static Socket_T socket_producer(int, int, void*);
+static int  parse_network(char *, struct ulong_net *);
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Start the HTTPD server
+ * @param port The Port number to start the server at
+ * @param backlog The maximum length of the incomming connection queue 
+ * @param bindAddr the local address the server will bind to
+ */
+void start_httpd(int port, int backlog, char *bindAddr) {
+
+  Socket_T S= NULL;
+
+  stopped= Run.stopped;
+
+  if((myServerSocket= create_server_socket(port, backlog, bindAddr)) < 0) {
+    
+    LogError("http server: Could not create a server socket at port %d -- %s\n",
+	port, STRERROR);
+    
+    LogError("monit HTTP server not available\n");
+    
+    if(Run.init) {
+      
+      sleep(1);
+      kill_daemon(SIGTERM);
+      
+    }
+    
+  } else {
+    
+    initialize_service();
+    
+    if(Run.httpdssl) {
+      
+      mySSLServerConnection= init_ssl_server( Run.httpsslpem,
+					      Run.httpsslclientpem);
+      
+      if(mySSLServerConnection == NULL) {
+	
+	LogError("http server: Could not initialize SSL engine\n");
+	
+	LogError("monit HTTP server not available\n");
+	
+	return;
+      }
+      
+#ifdef HAVE_OPENSSL
+      mySSLServerConnection->server_socket= myServerSocket;
+#endif
+    }
+    
+    while(! stopped) {
+      
+      if(!(S= socket_producer(myServerSocket, port, mySSLServerConnection))) {
+	continue;
+      }
+
+      http_processor(S);
+      
+    }
+
+    delete_ssl_server_socket(mySSLServerConnection);  
+    close_socket(myServerSocket);
+
+  }
+
+}
+
+
+/**
+ * Stop the HTTPD server. 
+ */
+void stop_httpd() {
+
+  stopped= TRUE;
+
+}
+
+
+/* -------------------------------------------------------------- Properties */
+
+
+/**
+ * Add hosts allowed to connect to this server.
+ * @param name A hostname (A-Record) or IP address to be added to the
+ * hosts allow list
+ * @return FALSE if the given host does not resolve, otherwise TRUE
+ */
+int add_host_allow(char *name) {
+
+  struct addrinfo hints;
+  struct addrinfo *res;
+  struct addrinfo *_res;
+
+  ASSERT(name);
+
+  memset(&hints, 0, sizeof(struct addrinfo));
+  hints.ai_family = PF_INET; /* we support just IPv4 currently */
+
+  if(getaddrinfo(name, NULL, &hints, &res) != 0)
+    return FALSE;
+
+  for(_res = res; _res; _res = _res->ai_next) {
+    if(_res->ai_family == AF_INET) {
+       HostsAllow h;
+       struct sockaddr_in *sin = (struct sockaddr_in *)_res->ai_addr;
+
+       NEW(h);      
+       memcpy(&h->network, &sin->sin_addr, 4);
+       h->mask=    0xffffffff;
+       LOCK(hostlist_mutex)
+       if(hostlist) {
+         HostsAllow p, n;
+         for(n= p= hostlist; p; n= p, p= p->next) {
+           if((p->network == h->network) && ((p->mask == h->mask))) {
+             DEBUG("%s: Debug: Skipping redundant host '%s'\n", prog, name); 
+             destroy_host_allow(h);
+             goto done;
+           }
+         }
+         DEBUG("%s: Debug: Adding host allow '%s'\n", prog, name); 
+         n->next= h;
+       } else {
+         DEBUG("%s: Debug: Adding host allow '%s'\n", prog, name);
+        
+         hostlist= h;
+       }
+       done:
+       END_LOCK;
+    }
+  }
+
+  freeaddrinfo(res);
+  return TRUE;
+}
+
+/**
+ * Add network allowed to connect to this server.
+ * @param s_network A network identifier in IP/mask format to be added
+ * to the hosts allow list
+ * @return FALSE if no correct network identifier is provided,
+ * otherwise TRUE
+ */
+
+int add_net_allow(char *s_network) {
+
+  struct ulong_net net={0, 0};
+  HostsAllow h;
+
+  ASSERT(s_network);
+
+  /* Add the network */
+
+  if (!parse_network(s_network, &net)) {
+
+    return FALSE;
+    
+  }
+
+  NEW(h);
+
+  h->network=net.network;
+  h->mask=net.mask;
+  
+  LOCK(hostlist_mutex)
+          
+  if(hostlist) {
+      
+    HostsAllow p, n;
+    
+    for(n= p= hostlist; p; n= p, p= p->next) {
+      
+      if((p->network == net.network) && ((p->mask == net.mask))) {
+	
+        DEBUG("%s: Debug: Skipping redundant net '%s'.\n",
+              prog, s_network); 
+        destroy_host_allow(h);
+        goto done;
+	
+      }
+      
+    }
+
+    DEBUG("%s: Debug: Adding net allow '%s'.\n",
+          prog, s_network); 
+    
+    n->next= h;
+    
+  } else {
+    
+    DEBUG("%s: Debug: Adding net allow '%s'.\n",
+          prog, s_network); 
+
+    hostlist= h;
+    
+  }
+
+  done:
+  END_LOCK;
+
+  return TRUE;
+}
+
+
+/**
+ * Are any hosts present in the host allow list?
+ * @return TRUE if the host allow list is non-empty, otherwise FALSE
+ */
+int has_hosts_allow() {
+
+  int rv;
+
+  LOCK(hostlist_mutex)
+      rv= (hostlist != NULL);
+  END_LOCK;
+
+  return rv;
+
+}
+
+
+/** 
+ * Free the host allow list
+ */
+void destroy_hosts_allow() {
+
+  if(has_hosts_allow()) {
+    
+    LOCK(hostlist_mutex)
+	destroy_host_allow(hostlist);
+        hostlist= NULL;
+    END_LOCK;
+    
+  }
+
+}
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Setup the cervlet service and verify that a cervlet implementation
+ * exist. Only one cervlet is supported in this version. In a standalone
+ * versions this function will load cervlets from a repository and
+ * initialize each cervlet.
+ */
+static void initialize_service() {
+
+  init_service();
+  check_Impl();
+
+}
+
+
+/**
+ * Abort if no Service implementors are found
+ */
+static void check_Impl() {
+
+  if((Impl.doGet == 0) || (Impl.doPost == 0)) {
+    
+    LogError("http server: Service Methods not implemented\n");
+    _exit(1);
+    
+  }
+  
+}
+
+
+/**
+ * Returns TRUE if remote host is allowed to connect, otherwise return
+ * FALSE. If allow Basic Authentication is defined in the Run.Auth
+ * object, authentication is delegated to the processor module.
+ */
+static int authenticate(const struct in_addr addr) {
+
+  if(is_host_allow(addr)) {
+
+    return TRUE;
+    
+  }
+
+  if(! has_hosts_allow() && (Run.credentials!=NULL)) {
+
+    return TRUE;
+
+  }
+
+  LogError("%s: Denied connection from non-authorized client [%s]\n", prog,
+      inet_ntoa(addr));
+  
+  return FALSE;
+
+}
+
+
+/**
+ * Returns TRUE if host is allowed to connect to
+ * this server
+ */
+static int is_host_allow(const struct in_addr addr) { 
+
+  HostsAllow p;
+  int rv= FALSE;
+
+  LOCK(hostlist_mutex)
+  
+  for(p= hostlist; p; p= p->next) {
+
+    if((p->network & p->mask) == (addr.s_addr & p->mask)) {
+
+      rv= TRUE;
+      break;
+      
+    }
+    
+  }
+
+  END_LOCK;
+
+  if (rv)
+      return rv;
+  
+  return rv;
+
+}
+
+
+/**
+ * Parse network string and return numeric IP and netmask
+ * @param s_network A network identifier in IP/mask format to be parsed
+ * @param net A structure holding IP and mask of the network
+ * @return FALSE if parsing fails otherwise TRUE
+ */
+static int parse_network(char *s_network, struct ulong_net *net) {
+
+  char *temp=NULL;
+  char *copy=NULL;
+  char *longmask=NULL;
+  int   shortmask=0;
+  int   slashcount=0;
+  int   dotcount=0;
+  int   count=0;
+  int   rv=FALSE;
+  struct in_addr inp;
+
+  ASSERT(s_network);
+  ASSERT(net);
+
+  temp= copy= Str_dup(s_network);
+
+  /* decide if we have xxx.xxx.xxx.xxx/yyy or
+                       xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy */
+  while (*temp!=0) {
+    if (*temp=='/') {
+
+      /* We have found a "/" -> we are preceeding to the netmask */
+      
+      if ((slashcount==1) || (dotcount !=3)) {
+
+        /* We have already found a "/" or we haven't had enough dots
+           before finding the slash -> Error! */
+        
+        goto done;
+        
+      }
+      
+      *temp=0;
+      longmask= *(temp+1)?temp+1:NULL;
+      count=0;
+      slashcount=1;
+      dotcount=0;
+
+    } else if (*temp=='.') {
+
+      /* We have found the next dot! */
+      
+      dotcount++;
+      
+    } else if (!isdigit((int)*temp)) {
+
+      /* No number, "." or "/" -> Error! */
+      
+      goto done;
+      
+    }
+    
+    count++;
+    temp++;
+  }
+
+  if (slashcount == 0) {
+
+    /* We have just host portion */
+
+    shortmask= 32;
+
+  } else if ((dotcount==0) && (count > 1) && (count < 4)) {
+
+    /* We have no dots but 1 or 2 numbers after the slash -> short netmask */
+
+    if (longmask!=NULL) {
+      
+      shortmask=atoi(longmask);
+      longmask=NULL;
+      
+    }
+    
+  } else if (dotcount != 3) {
+
+    /* A long netmask requires three dots */
+    
+    goto done;
+    
+  }
+
+  /* Parse the network */
+  
+  if (inet_aton(copy, &inp) == 0) {
+
+    /* Failed! */
+    goto done;
+
+  }
+  net->network=inp.s_addr;
+
+  /* Convert short netmasks to integer */
+  if (longmask==NULL) {
+    
+    if ((shortmask > 32) || (shortmask < 0)) {
+      
+      goto done;
+      
+    } else if ( shortmask == 32 ) {
+
+      net->mask=-1;
+
+    } else {
+      
+      net->mask= (1<<shortmask)-1;
+      net->mask= htonl(net->mask<<(32-shortmask));
+
+    }
+
+  } else { 	 
+  	 
+    /* Parse long netmasks */ 	 
+    if (inet_aton(longmask, &inp) == 0) { 	 
+
+      goto done; 	 
+
+    }
+
+    net->mask=inp.s_addr;
+
+  }
+
+  /* Remove bogus network components */
+  net->network&=net->mask;
+
+  /* Everything went fine, so we return TRUE! */
+  rv=TRUE;
+  
+  done:
+
+  FREE(copy);
+  return rv;
+  
+}
+
+/* --------------------------------------------------------------- Factories */
+
+
+/**
+ * Accept connections from Clients and create a Socket_T object for
+ * each successful accept. If accept fails, return a NULL object
+ */
+static Socket_T socket_producer(int server, int port, void *sslserver) {
+  
+  int client;
+  struct sockaddr_in in;
+  socklen_t len= sizeof(struct sockaddr_in);
+  
+  if(can_read(server, 1)) {
+    
+    if( (client= accept(server, (struct sockaddr*)&in, &len)) < 0) {
+
+      if(stopped) {
+        LogError("http server: service stopped\n");
+      }  else {
+        LogError("http server: cannot accept connection -- %s\n", STRERROR);
+      }
+
+      return NULL;
+
+    }
+
+  } else {
+
+    /* If timeout or error occured, return NULL to allow the caller to
+     * handle various states (such as stopped) which can occure in the
+     * meantime */
+    return NULL;
+
+  }
+
+  if(set_noblock(client) < 0) {
+    goto error;
+  }
+  
+  if(!check_socket(client)) {
+    goto error;
+  }
+  
+  if(! authenticate(in.sin_addr)) {
+    goto error;
+  }
+
+
+  return socket_create_a(client, inet_ntoa(in.sin_addr), port, sslserver);
+
+  error:
+  close_socket(client);
+  return NULL;
+
+}
+
+
+/* ----------------------------------------------------------------- Cleanup */
+
+
+/**
+ * Free a (linked list of) host_allow ojbect(s). 
+ */
+static void destroy_host_allow(HostsAllow p) {
+  
+  HostsAllow a= p; 
+  
+  if(a->next) {
+    destroy_host_allow(a->next);
+  }
+
+  FREE(a);
+ 
+}
+
diff --git a/monit-5.4/src/http/engine.h b/monit-5.4/src/http/engine.h
new file mode 100644
index 0000000..ee19618
--- /dev/null
+++ b/monit-5.4/src/http/engine.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef ENGINE_H
+#define ENGINE_H
+
+#include "config.h"
+
+#include "net.h"
+#include "processor.h"
+#include "cervlet.h"
+
+/*
+ * The maximum queue length for incoming connection
+ * indications (a request to connect)
+ */
+#define DEFAULT_QUEUE_LEN  10
+
+typedef struct host_allow {
+  unsigned long network;
+  unsigned long mask;
+  /* For internal use */
+  struct host_allow *next;
+} *HostsAllow;
+
+/* Public prototypes */
+void start_httpd(int port, int backlog, char *bindAddr);
+void stop_httpd();
+int add_host_allow(char *);
+int add_net_allow(char *);
+int has_hosts_allow();
+void destroy_hosts_allow();
+
+
+#endif
diff --git a/monit-5.4/src/http/httpstatus.h b/monit-5.4/src/http/httpstatus.h
new file mode 100644
index 0000000..15b1669
--- /dev/null
+++ b/monit-5.4/src/http/httpstatus.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef HTTPSTATUS_H
+#define HTTPSTATUS_H
+
+/* HTTP Status Codes */
+#define SC_CONTINUE                      100
+#define SC_SWITCHING_PROTOCOLS           101
+#define SC_PROCESSING                    102
+#define SC_OK                            200
+#define SC_CREATED                       201
+#define SC_ACCEPTED                      202
+#define SC_NON_AUTHORITATIVE             203
+#define SC_NO_CONTENT                    204
+#define SC_RESET_CONTENT                 205
+#define SC_PARTIAL_CONTENT               206
+#define SC_MULTI_STATUS                  207
+#define SC_MULTIPLE_CHOICES              300
+#define SC_MOVED_PERMANENTLY             301
+#define SC_MOVED_TEMPORARILY             302
+#define SC_SEE_OTHER                     303
+#define SC_NOT_MODIFIED                  304
+#define SC_USE_PROXY                     305
+#define SC_TEMPORARY_REDIRECT            307
+#define SC_BAD_REQUEST                   400
+#define SC_UNAUTHORIZED                  401
+#define SC_PAYMENT_REQUIRED              402
+#define SC_FORBIDDEN                     403
+#define SC_NOT_FOUND                     404
+#define SC_METHOD_NOT_ALLOWED            405
+#define SC_NOT_ACCEPTABLE                406
+#define SC_PROXY_AUTHENTICATION_REQUIRED 407
+#define SC_REQUEST_TIMEOUT               408
+#define SC_CONFLICT                      409
+#define SC_GONE                          410
+#define SC_LENGTH_REQUIRED               411
+#define SC_PRECONDITION_FAILED           412
+#define SC_REQUEST_ENTITY_TOO_LARGE      413
+#define SC_REQUEST_URI_TOO_LARGE         414
+#define SC_UNSUPPORTED_MEDIA_TYPE        415
+#define SC_RANGE_NOT_SATISFIABLE         416
+#define SC_EXPECTATION_FAILED            417
+#define SC_UNPROCESSABLE_ENTITY          422
+#define SC_LOCKED                        423
+#define SC_FAILED_DEPENDENCY             424
+#define SC_INTERNAL_SERVER_ERROR         500
+#define SC_NOT_IMPLEMENTED               501
+#define SC_BAD_GATEWAY                   502
+#define SC_SERVICE_UNAVAILABLE           503
+#define SC_GATEWAY_TIMEOUT               504
+#define SC_VERSION_NOT_SUPPORTED         505
+#define SC_VARIANT_ALSO_VARIES           506
+#define SC_INSUFFICIENT_STORAGE          507
+#define SC_NOT_EXTENDED                  510
+
+#endif
diff --git a/monit-5.4/src/http/processor.c b/monit-5.4/src/http/processor.c
new file mode 100644
index 0000000..a2b3aaa
--- /dev/null
+++ b/monit-5.4/src/http/processor.c
@@ -0,0 +1,847 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#include "processor.h"
+#include "base64.h"
+
+// libmonit
+#include "util/Str.h"
+
+
+/**
+ *  A naive quasi HTTP Processor module that can handle HTTP requests
+ *  received from a client, and return responses based on those
+ *  requests.
+ *
+ *  This Processor delegates the actual handling of the request and
+ *  reponse to so called cervlets, which must implement two methods;
+ *  doGet and doPost. 
+ *
+ *  NOTES
+ *    This Processor is command oriented and if a second slash '/' is
+ *    found in the URL it's asumed to be the PATHINFO. In other words
+ *    this processor perceive an URL as:
+ *
+ *                      /COMMAND?QUERYSTRING/PATHINFO
+ *
+ *     The doGet/doPost routines act's on the COMMAND. See the
+ *     cervlet.c code in this dir. for an example. 
+ *
+ *  @file
+ */
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void do_service(Socket_T);
+static void destroy_entry(void *);
+static char *get_date(char *, int);
+static char *get_server(char *, int); 
+static void create_headers(HttpRequest);
+static void send_response(HttpResponse);
+static int basic_authenticate(HttpRequest);
+static void done(HttpRequest, HttpResponse);
+static void destroy_HttpRequest(HttpRequest);
+static void reset_response(HttpResponse res);
+static HttpParameter parse_parameters(char *);
+static int create_parameters(HttpRequest req);
+static void destroy_HttpResponse(HttpResponse);
+static HttpRequest create_HttpRequest(Socket_T);
+static void internal_error(Socket_T, int, char *);
+static HttpResponse create_HttpResponse(Socket_T);
+static int is_authenticated(HttpRequest, HttpResponse);
+static int get_next_token(char *s, int *cursor, char **r);
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Process a HTTP request. This is done by dispatching to the service
+ * function. 
+ * @param s A Socket_T representing the client connection
+ */
+void *http_processor(Socket_T s) {
+
+  if(! can_read(socket_get_socket(s), REQUEST_TIMEOUT)) {
+    internal_error(s, SC_REQUEST_TIMEOUT, "Time out when handling the Request");
+  } else {
+    do_service(s);
+  }
+  socket_free(&s);
+
+  return NULL;
+
+}
+
+
+/**
+ * Callback for implementors of cervlet functions.
+ * @param doGetFunc doGet function
+ * @param doPostFunc doPost function 
+ */
+void add_Impl(void(*doGet)(HttpRequest, HttpResponse), void(*doPost)(HttpRequest, HttpResponse)) {
+  Impl.doGet= doGet;
+  Impl.doPost= doPost;
+}
+
+
+/**
+ * Send an error message
+ * @param res HttpResponse object
+ * @param code Error Code to lookup and send
+ * @param msg Optional error message (may be NULL)
+ */
+void send_error(HttpResponse res, int code, const char *msg) {
+  char server[STRLEN];
+  const char *err= get_status_string(code);
+
+  reset_response(res);
+  set_content_type(res, "text/html");
+  set_status(res, code);
+  StringBuffer_append(res->outputbuffer,
+	   "<html><head><title>%d %s</title></head>"\
+	   "<body bgcolor=#FFFFFF><h2>%s</h2>%s<p>"\
+	   "<hr><a href='%s'><font size=-1>%s</font></a>"\
+	   "</body></html>\r\n",
+	    code, err, err, msg?msg:"", SERVER_URL, get_server(server, STRLEN));
+  DEBUG("HttpRequest error: %s %d %s\n", SERVER_PROTOCOL, code, msg ? msg : err);
+}
+
+
+/* -------------------------------------------------------------- Properties */
+
+
+/**
+ * Adds a response header with the given name and value. If the header
+ * had already been set the new value overwrites the previous one.
+ * @param res HttpResponse object
+ * @param name Header key name
+ * @param value Header key value
+ */
+void set_header(HttpResponse res, const char *name, const char *value) {
+  HttpHeader h= NULL;
+
+  ASSERT(res);
+  ASSERT(name);
+
+  NEW(h);
+  h->name= Str_dup(name);
+  h->value= Str_dup(value);
+  if(res->headers) {
+    HttpHeader n, p;
+    for( n= p= res->headers; p; n= p, p= p->next) {
+      if(!strcasecmp(p->name, name)) {
+	FREE(p->value);
+	p->value= Str_dup(value);
+	destroy_entry(h);
+	return;
+      }
+    }
+    n->next= h;
+  } else {
+    res->headers= h;
+  }
+}
+
+
+/**
+ * Sets the status code for the response
+ * @param res HttpResponse object
+ * @param code A HTTP status code <100-510>
+ * @param msg The status code string message 
+ */
+void set_status(HttpResponse res, int code) {
+  res->status= code;
+  res->status_msg= get_status_string(code);
+}
+
+
+/**
+ * Set the response content-type
+ * @param res HttpResponse object
+ * @param mime Mime content type, e.g. text/html
+ */
+void set_content_type(HttpResponse res, const char *mime) {
+  set_header(res, "Content-Type", mime);
+}
+
+
+/**
+ * Returns the value of the specified header
+ * @param req HttpRequest object
+ * @param name Header name to lookup the value for
+ * @return The value of the specified header, NULL if not found
+ */
+const char *get_header(HttpRequest req, const char *name) {
+  HttpHeader p;
+
+  for(p= req->headers; p; p= p->next) {
+    if(!strcasecmp(p->name, name)) {
+      return (p->value);
+    }
+  }
+  return NULL;
+}
+
+
+/**
+ * Returns the value of the specified parameter
+ * @param req HttpRequest object
+ * @param name The request parameter key to lookup the value for
+ * @return The value of the specified parameter, or NULL if not found
+ */
+const char *get_parameter(HttpRequest req, const char *name) {
+  HttpParameter p;
+
+  for(p= req->params; p; p= p->next) {
+    if(!strcasecmp(p->name, name)) {
+      return (p->value);
+    }
+  }
+  return NULL;
+}
+
+
+/**
+ * Returns a string containing all (extra) headers found in the
+ * response.  The headers are newline separated in the returned
+ * string.
+ * @param res HttpResponse object
+ * @return A String containing all headers set in the Response object
+ */
+char *get_headers(HttpResponse res) {
+  HttpHeader p;
+  char buf[RES_STRLEN];
+  char *b= buf;
+
+  *buf=0;
+  for(p= res->headers; (((b-buf) + STRLEN) < RES_STRLEN) && p; p= p->next) {
+    b+= snprintf(b, STRLEN,"%s: %s\r\n", p->name, p->value);
+  }
+  return buf[0]?Str_dup(buf):NULL;
+}
+
+
+/**
+ * Lookup the corresponding HTTP status string for the given status
+ * code
+ * @param status A HTTP status code
+ * @return A default status message for the specified HTTP status
+ * code.
+ */
+const char *get_status_string(int status) {
+  switch (status) {
+  case SC_OK:
+      return "OK";
+  case SC_ACCEPTED:
+      return "Accepted";
+  case SC_BAD_GATEWAY:
+      return "Bad Gateway";
+  case SC_BAD_REQUEST:
+      return "Bad Request";
+  case SC_CONFLICT:
+      return "Conflict";
+  case SC_CONTINUE:
+      return "Continue";
+  case SC_CREATED:
+      return "Created";
+  case SC_EXPECTATION_FAILED:
+      return "Expectation Failed";
+  case SC_FORBIDDEN:
+      return "Forbidden";
+  case SC_GATEWAY_TIMEOUT:
+      return "Gateway Timeout";
+  case SC_GONE:
+      return "Gone";
+  case SC_VERSION_NOT_SUPPORTED:
+      return "HTTP Version Not Supported";
+  case SC_INTERNAL_SERVER_ERROR:
+      return "Internal Server Error";
+  case SC_LENGTH_REQUIRED:
+      return "Length Required";
+  case SC_METHOD_NOT_ALLOWED:
+      return "Method Not Allowed";
+  case SC_MOVED_PERMANENTLY:
+      return "Moved Permanently";
+  case SC_MOVED_TEMPORARILY:
+      return "Moved Temporarily";
+  case SC_MULTIPLE_CHOICES:
+      return "Multiple Choices";
+  case SC_NO_CONTENT:
+      return "No Content";
+  case SC_NON_AUTHORITATIVE:
+      return "Non-Authoritative Information";
+  case SC_NOT_ACCEPTABLE:
+      return "Not Acceptable";
+  case SC_NOT_FOUND:
+      return "Not Found";
+  case SC_NOT_IMPLEMENTED:
+      return "Not Implemented";
+  case SC_NOT_MODIFIED:
+      return "Not Modified";
+  case SC_PARTIAL_CONTENT:
+      return "Partial Content";
+  case SC_PAYMENT_REQUIRED:
+      return "Payment Required";
+  case SC_PRECONDITION_FAILED:
+      return "Precondition Failed";
+  case SC_PROXY_AUTHENTICATION_REQUIRED:
+      return "Proxy Authentication Required";
+  case SC_REQUEST_ENTITY_TOO_LARGE:
+      return "Request Entity Too Large";
+  case SC_REQUEST_TIMEOUT:
+      return "Request Timeout";
+  case SC_REQUEST_URI_TOO_LARGE:
+      return "Request URI Too Large";
+  case SC_RANGE_NOT_SATISFIABLE:
+      return "Requested Range Not Satisfiable";
+  case SC_RESET_CONTENT:
+      return "Reset Content";
+  case SC_SEE_OTHER:
+      return "See Other";
+  case SC_SERVICE_UNAVAILABLE:
+      return "Service Unavailable";
+  case SC_SWITCHING_PROTOCOLS:
+      return "Switching Protocols";
+  case SC_UNAUTHORIZED:
+      return "Unauthorized";
+  case SC_UNSUPPORTED_MEDIA_TYPE:
+      return "Unsupported Media Type";
+  case SC_USE_PROXY:
+      return "Use Proxy";
+  default: {
+      return "Unknown HTTP status";
+    } 
+  }
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Receives standard HTTP requests from a client socket and dispatches
+ * them to the doXXX methods defined in a cervlet module.
+ */
+static void do_service(Socket_T s) {
+  volatile HttpResponse res= create_HttpResponse(s);
+  volatile HttpRequest req= create_HttpRequest(s);
+  
+  if(res && req) {
+    if(is_authenticated(req, res)) {
+      if(IS(req->method, METHOD_GET)) {
+	Impl.doGet(req, res);
+      } else if(IS(req->method, METHOD_POST)) {
+	Impl.doPost(req, res);
+      } else {
+	send_error(res, SC_NOT_IMPLEMENTED, "Method not implemented");
+      }
+    }
+    send_response(res);
+  }
+  done(req, res);
+}
+
+
+/**
+ * Return a (RFC1123) Date string
+ */
+static char *get_date(char *result, int size) {
+  time_t now;
+  
+  time(&now);
+  if(strftime(result, size, DATEFMT, gmtime(&now)) <= 0) {
+    *result= 0;
+  }
+  return result;
+}
+
+
+/**
+ * Return this server name + version
+ */
+static char *get_server(char *result, int size) {
+  snprintf(result, size, "%s %s", SERVER_NAME, Run.httpdsig?SERVER_VERSION:"");
+  return result;
+}
+
+
+/**
+ * Send the response to the client. If the response has already been
+ * commited, this function does nothing.
+ */
+static void send_response(HttpResponse res) {
+  Socket_T S= res->S;
+
+  if(!res->is_committed) {
+    char date[STRLEN];
+    char server[STRLEN];
+    char *headers= get_headers(res);
+    int length = StringBuffer_length(res->outputbuffer);
+
+    res->is_committed= TRUE;
+    get_date(date, STRLEN);
+    get_server(server, STRLEN);
+    socket_print(S, "%s %d %s\r\n", res->protocol, res->status,
+		 res->status_msg);
+    socket_print(S, "Date: %s\r\n", date);
+    socket_print(S, "Server: %s\r\n", server);
+    socket_print(S, "Content-Length: %d\r\n", length);
+    socket_print(S, "Connection: close\r\n");
+    if(headers)
+	socket_print(S, "%s", headers);
+    socket_print(S, "\r\n");
+    if(length)
+	socket_write(S, (unsigned char *)StringBuffer_toString(res->outputbuffer), length);
+    FREE(headers);
+  }
+}
+
+
+/* --------------------------------------------------------------- Factories */
+
+
+/**
+ * Returns a new HttpRequest object wrapping the client request
+ */
+static HttpRequest create_HttpRequest(Socket_T S) {
+  HttpRequest req= NULL;
+  char url[REQ_STRLEN];
+  char line[REQ_STRLEN];
+  char protocol[STRLEN]; 
+  char method[REQ_STRLEN];
+
+  if(socket_readln(S, line, REQ_STRLEN) == NULL) {
+    internal_error(S, SC_BAD_REQUEST, "No request found");
+    return NULL;
+  }
+  Str_chomp(line);
+  if(sscanf(line, "%1023s %1023s HTTP/%3[1.0]", method, url, protocol) != 3) {
+    internal_error(S, SC_BAD_REQUEST, "Cannot parse request");
+    return NULL;
+  }
+  if(strlen(url) >= MAX_URL_LENGTH) {
+    internal_error(S, SC_BAD_REQUEST, "[error] URL too long");
+    return NULL;
+  }
+  NEW(req);
+  req->S= S;
+  Util_urlDecode(url);
+  req->url= Str_dup(url);
+  req->method= Str_dup(method);
+  req->protocol= Str_dup(protocol); 
+  create_headers(req);
+  if(!create_parameters(req)) {
+    destroy_HttpRequest(req);
+    internal_error(S, SC_BAD_REQUEST, "Cannot parse Request parameters");
+    return NULL;
+  }
+  return req;
+}
+
+
+/**
+ * Returns a new HttpResponse object wrapping a default response. Use
+ * the set_XXX methods to change the object.
+ */
+static HttpResponse create_HttpResponse(Socket_T S) {
+  HttpResponse res= NULL;
+
+  NEW(res);
+  res->S= S;
+  res->status= SC_OK;
+  res->outputbuffer= StringBuffer_create(256);
+  res->is_committed= FALSE;
+  res->protocol= SERVER_PROTOCOL;
+  res->status_msg= get_status_string(SC_OK);
+  return res;
+}
+
+
+/**
+ * Create HTTP headers for the given request
+ */
+static void create_headers(HttpRequest req) {
+  Socket_T S;
+  char *value;
+  HttpHeader header= NULL;
+  char line[REQ_STRLEN];
+
+  S= req->S;
+  while(1) {
+    if(! socket_readln(S, line, sizeof(line)))
+	break;
+    if(!strcasecmp(line, "\r\n") || !strcasecmp(line, "\n"))
+	break;
+    if(NULL != (value= strchr(line, ':'))) {
+      NEW(header);
+      *value++= 0;
+      Str_trim(line);
+      Str_trim(value);
+      Str_chomp(value);
+      header->name= Str_dup(line);
+      header->value= Str_dup(value);
+      header->next= req->headers;
+      req->headers= header;
+    }
+  }
+}
+
+
+/**
+ * Create parameters for the given request. Returns FALSE if an error
+ * occurs.
+ */
+static int create_parameters(HttpRequest req) {
+  char query_string[REQ_STRLEN]= {0};
+
+  if(IS(req->method, METHOD_POST) && get_header(req, "Content-Length")) {
+    int n;
+    int len; 
+    Socket_T S = req->S;
+    const char *cl = get_header(req, "Content-Length");
+    if(! cl || sscanf(cl, "%d", &len) != 1) {
+      return FALSE;
+    }
+    if(len < 0 || len >= REQ_STRLEN)
+      return FALSE;
+    if(len==0)
+      return TRUE;
+    if(((n= socket_read(S, query_string, len)) <= 0) || (n != len)) {
+      return FALSE;
+    }
+    query_string[n]= 0;
+  } else if(IS(req->method, METHOD_GET)) {
+    char *p;
+    if(NULL != (p= strchr(req->url, '?'))) {
+      *p++= 0;
+      strncpy(query_string, p, sizeof(query_string) - 1);
+      query_string[sizeof(query_string) - 1] = 0;
+    }
+  }
+  if(*query_string) {
+    char *p;
+    if(NULL != (p= strchr(query_string, '/'))) {
+      *p++= 0;
+      req->pathinfo= Str_dup(p);
+    }
+    req->params= parse_parameters(query_string);
+  }
+  return TRUE;
+}
+
+
+/* ----------------------------------------------------------------- Cleanup */
+
+
+/**
+ * Clear the response output buffer and headers
+ */
+static void reset_response(HttpResponse res) {
+  if(res->headers) {
+    destroy_entry(res->headers);
+    res->headers= NULL; /* Release Pragma */
+  }
+  StringBuffer_clear(res->outputbuffer);
+}
+
+
+/**
+ * Finalize the request and response object.
+ */
+static void done(HttpRequest req, HttpResponse res) {
+  destroy_HttpRequest(req);
+  destroy_HttpResponse(res);
+}
+
+
+/**
+ * Free a HttpRequest object
+ */
+static void destroy_HttpRequest(HttpRequest req) {
+  if(req) {
+    FREE(req->method);
+    FREE(req->url); 
+    FREE(req->pathinfo);
+    FREE(req->protocol);
+    FREE(req->remote_user);
+    if(req->headers)
+      destroy_entry(req->headers);
+    if(req->params)
+      destroy_entry(req->params);
+    FREE(req);
+  }
+}
+
+
+/**
+ * Free a HttpResponse object
+ */
+static void destroy_HttpResponse(HttpResponse res) {
+  if(res) {
+    StringBuffer_free(&(res->outputbuffer));
+    if(res->headers) 
+      destroy_entry(res->headers);
+    FREE(res);
+  }
+}
+
+
+/**
+ * Free a (linked list of) http entry object(s). Both HttpHeader and
+ * HttpParameter are of this type.
+ */
+static void destroy_entry(void *p) {
+  struct entry *h= p; 
+  
+  if(h->next) {
+    destroy_entry(h->next);
+  }
+  FREE(h->name);
+  FREE(h->value);
+  FREE(h);
+}
+
+
+/* ----------------------------------------------------- Checkers/Validators */
+
+
+/**
+ * Do Basic Authentication if this auth. style is allowed. 
+ */
+static int is_authenticated(HttpRequest req, HttpResponse res) {
+  if(Run.credentials!=NULL) {
+    if(! basic_authenticate(req)) {
+      send_error(res, SC_UNAUTHORIZED,
+		 "You are <b>not</b> authorized to access <i>monit</i>. "
+		 "Either you supplied the wrong credentials (e.g. bad "
+		 "password), or your browser doesn't understand how to supply "
+		 "the credentials required");
+      set_header(res, "WWW-Authenticate", "Basic realm=\"monit\"");
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+
+/**
+ * Authenticate the basic-credentials (uname/password) submitted by
+ * the user.
+ */
+static int basic_authenticate(HttpRequest req) {
+  size_t n;
+  char *password;
+  char buf[STRLEN];
+  char uname[STRLEN];
+  const char *credentials= get_header(req, "Authorization");
+
+  if(! (credentials && Str_startsWith(credentials, "Basic "))) {
+    return FALSE;
+  }
+  strncpy(buf, &credentials[6], sizeof(buf) - 1);
+  buf[sizeof(buf) - 1] = 0;
+  if((n= decode_base64((unsigned char*)uname, buf))<=0) {
+    return FALSE;
+  }
+  uname[n]= 0;
+  password= strchr(uname, ':');
+  if(password==NULL) {
+    return FALSE;
+  }
+  *password++= 0;
+  if(*uname==0 || *password==0) {
+    return FALSE;
+  }
+  /* Check if user exist */
+  if(NULL==Util_getUserCredentials(uname)) {
+    LogError("Warning: Client '%s' supplied unknown user '%s'"
+	" accessing monit httpd\n", socket_get_remote_host(req->S), uname); 
+    return FALSE;
+  }
+  /* Check if user has supplied the right password */
+  if(! Util_checkCredentials(uname,  password)) {
+    LogError("Warning: Client '%s' supplied wrong password for user '%s'"
+	" accessing monit httpd\n", socket_get_remote_host(req->S), uname); 
+    return FALSE;
+  }
+  req->remote_user= Str_dup(uname);
+  return TRUE;
+}
+
+
+/* --------------------------------------------------------------- Utilities */
+
+
+/**
+ * Send an error message to the client. This is a helper function,
+ * used internal if the service function fails to setup the framework
+ * properly; i.e. with a valid HttpRequest and a valid HttpResponse.
+ */
+static void internal_error(Socket_T S, int status, char *msg) {
+  char date[STRLEN];
+  char server[STRLEN];
+  const char *status_msg= get_status_string(status);
+  
+  get_date(date, STRLEN);
+  get_server(server, STRLEN);
+  socket_print(S, 
+	       "%s %d %s\r\n"
+	       "Date: %s\r\n"
+	       "Server: %s\r\n"
+	       "Content-Type: text/html\r\n"
+	       "Connection: close\r\n"
+	       "\r\n"
+	       "<html><head><title>%s</title></head>"
+	       "<body bgcolor=#FFFFFF><h2>%s</h2>%s<p>"
+	       "<hr><a href='%s'><font size=-1>%s</font></a>"
+	       "</body></html>\r\n",
+	       SERVER_PROTOCOL, status, status_msg, date, server,
+	       status_msg, status_msg, msg, SERVER_URL, server);
+  DEBUG("HttpRequest error: %s %d %s\n", SERVER_PROTOCOL, status, msg ? msg : status_msg);
+}
+
+
+/**
+ * Parse request parameters from the given query string and return a
+ * linked list of HttpParameters
+ */
+static HttpParameter parse_parameters(char *query_string) {
+#define KEY 1
+#define VALUE 2
+  int token;
+  int cursor= 0;
+  char *key= NULL;
+  char *value= NULL;
+  HttpParameter head= NULL;
+
+  while((token= get_next_token(query_string, &cursor, &value))) {
+    if(token==KEY)
+      key= value;
+    else if(token==VALUE) {
+      HttpParameter p= NULL;
+      if(!key) goto error;
+      NEW(p);
+      p->name= key;
+      p->value= value;
+      p->next= head;
+      head= p;
+      key= NULL;
+    }
+  }
+  return head;
+error:
+  FREE(key);
+  FREE(value);
+  if ( head != NULL ) {
+    destroy_entry(head);
+  }
+  return NULL;
+}
+
+
+/**
+ * A mini-scanner for tokenizing a query string
+ */
+static int get_next_token(char *s, int *cursor, char **r) {
+  int i= *cursor;
+
+  while(s[*cursor]) {
+    if(s[*cursor+1]=='=') {
+      *cursor+= 1;
+      *r= Str_ndup(&s[i], (*cursor-i));
+      return KEY;
+    } 
+    if(s[*cursor]=='=') {
+      while(s[*cursor] && s[*cursor]!='&') *cursor+= 1;
+      if(s[*cursor]=='&') {
+	*r= Str_ndup(&s[i+1], (*cursor-i)-1);
+	*cursor+= 1;
+      }  else
+	*r= Str_ndup(&s[i+1], (*cursor-i));
+      return VALUE;
+    }
+    *cursor+= 1;
+  }
+  return FALSE;
+}
diff --git a/monit-5.4/src/http/processor.h b/monit-5.4/src/http/processor.h
new file mode 100644
index 0000000..ea0864f
--- /dev/null
+++ b/monit-5.4/src/http/processor.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef PROCESSOR_H
+#define PROCESSOR_H
+
+#include "config.h"
+#include <stdio.h>
+
+#include "monit.h"
+#include "net.h"
+#include "socket.h"
+#include "httpstatus.h"
+
+/* Server masquerade */
+#define SERVER_NAME        "monit" 
+#define SERVER_VERSION     VERSION
+#define SERVER_URL         "http://mmonit.com/monit/"
+#define SERVER_PROTOCOL    "HTTP/1.0"
+#define DATEFMT             "%a, %d %b %Y %H:%M:%S GMT"
+
+/* Protocol methods supported */
+#define METHOD_GET         "GET"
+#define METHOD_POST        "POST"
+
+
+/* Initial buffer sizes */
+#define STRLEN             256
+#define REQ_STRLEN         1024
+#define RES_STRLEN         2048
+#define MAX_URL_LENGTH     512
+
+/* Request timeout in seconds */
+#define REQUEST_TIMEOUT    30 
+
+#define TRUE               1
+#define FALSE              0
+
+struct entry {
+  char *name;
+  char *value;
+  /* For internal use */
+  struct entry *next;
+};
+typedef struct entry *HttpHeader;
+typedef struct entry *HttpParameter;
+
+typedef struct request {
+  char *url;
+  Socket_T S;
+  char *method;
+  char *protocol;
+  char *pathinfo;
+  char *remote_user;
+  HttpHeader headers;
+  ssl_connection *ssl;
+  HttpParameter params;
+} *HttpRequest;
+
+typedef struct response {
+  int status;
+  Socket_T S;
+  const char *protocol;
+  int is_committed;
+  HttpHeader headers;
+  ssl_connection *ssl;
+  const char *status_msg; 
+  StringBuffer_T outputbuffer;
+} *HttpResponse;
+
+
+struct  ServiceImpl {
+  void(*doGet)(HttpRequest, HttpResponse);
+  void(*doPost)(HttpRequest, HttpResponse);
+};
+
+/*
+ * An object for implementors of the service functions; doGet and
+ * doPost. Implementing modules i.e. CERVLETS, must implement the
+ * doGet and doPost functions and the engine will call the add_Impl
+ * function to setup the callback to these functions.
+ */
+struct ServiceImpl Impl;
+
+/* Public prototypes */
+void *http_processor(Socket_T);
+char *get_headers(HttpResponse res);
+void set_status(HttpResponse res, int status);
+const char *get_status_string(int status_code);
+void add_Impl(void(*doGet)(HttpRequest, HttpResponse), void(*doPost)(HttpRequest, HttpResponse));
+void set_content_type(HttpResponse res, const char *mime);
+const char *get_header(HttpRequest req, const char *header_name);
+void send_error(HttpResponse, int status, const char *message);
+const char *get_parameter(HttpRequest req, const char *parameter_name);
+void set_header(HttpResponse res, const char *name, const char *value);
+
+#endif
diff --git a/monit-5.4/src/l.l b/monit-5.4/src/l.l
new file mode 100644
index 0000000..e08a7c5
--- /dev/null
+++ b/monit-5.4/src/l.l
@@ -0,0 +1,846 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+%option noyywrap
+
+
+%{
+  
+/*
+ * DESCRIPTION
+ *
+ *   Lexical grammar for tokenizing the control file. 
+ *
+ */
+
+#include "config.h"
+  
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_GLOB_H
+#include <glob.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "monit.h"
+#include "tokens.h"
+        
+// libmonit
+#include "util/Str.h"
+
+
+#define MAX_STACK_DEPTH 512
+
+  int buffer_stack_ptr=0;
+
+  struct buffer_stack_s {
+    int             lineno;
+    char           *currentfile;
+    YY_BUFFER_STATE buffer;
+  } buffer_stack[MAX_STACK_DEPTH];
+  
+  
+  int lineno= 1;
+  int arglineno= 1;
+  char *currentfile=NULL;
+  char *argcurrentfile=NULL;
+  char *argyytext=NULL;
+
+  
+  /* Prototypes */
+  extern void yyerror(const char*,...);
+  extern void yywarning(const char *,...);
+  static void steplinenobycr(char *);
+  static void save_arg(void);
+  static void include_file(char *);
+  static char *handle_quoted_string(char *);
+  static void push_buffer_state(YY_BUFFER_STATE, char*);
+  static int  pop_buffer_state(void);
+  static URL_T create_URL(char *proto);
+  
+%}
+
+ws          [ \r\t]+
+wws         [ \r\t;,()]+
+number      [0-9]+
+real        [0-9]+([.][0-9]+)?
+str         [^\000-\041@:{}"';(),%]+
+hostname    {str}(\.{str})*
+greater     ("greater"|"gt"|">")
+less        ("less"|"lt"|"<")
+equal       ("equal"|"eq"|"=="|"=")
+notequal    ("notequal"|"ne"|"!=")
+loadavg1    load(avg)[ ]*(\([ ]*1[ ]*(m|min)?[ ]*\))?
+loadavg5    load(avg)[ ]*\([ ]*5[ ]*(m|min)?[ ]*\)
+loadavg15   load(avg)[ ]*\([ ]*15[ ]*(m|min)?[ ]*\)
+cpuuser     cpu[ ]*(usage)*[ ]*\([ ]*(us|usr|user)?[ ]*\)
+cpusyst     cpu[ ]*(usage)*[ ]*\([ ]*(sy|sys|system)?[ ]*\)
+cpuwait     cpu[ ]*(usage)*[ ]*\([ ]*(wa|wait)?[ ]*\)
+startarg    start{ws}?(program)?{ws}?([=]{ws})?["]
+stoparg     stop{ws}?(program)?{ws}?([=]{ws})?["]
+restartarg  restart{ws}?(program)?{ws}?([=]{ws})?["]
+execarg     exec(ute)?{ws}?["]
+percent     ("percent"|"%")
+byte        ("byte"|"b")
+kilobyte    ("kilobyte"|"kb")
+megabyte    ("megabyte"|"mb")
+gigabyte    ("gigabyte"|"gb")
+
+%x ARGUMENT_COND DEPEND_COND SERVICE_COND URL_COND STRING_COND EVERY_COND INCLUDE
+
+%%
+
+{wws}             { /* Wide white space */ }
+(#.*)?\\?\n       { lineno++; } 
+
+is                {/* EMPTY */}
+as                {/* EMPTY */}
+are               {/* EMPTY */}
+for               {/* EMPTY */}
+on(ly)?           {/* EMPTY */}
+with(in|out)?     {/* EMPTY */}
+program(s)?       {/* EMPTY */}
+and               {/* EMPTY */}
+has               {/* EMPTY */}
+using             {/* EMPTY */}
+use               {/* EMPTY */}
+the               {/* EMPTY */}
+sum               {/* EMPTY */}
+than              {/* EMPTY */}
+usage             {/* EMPTY */}
+was               {/* EMPTY */}
+times             {/* EMPTY */}
+but               {/* EMPTY */}
+of                {/* EMPTY */}
+does              {/* EMPTY */}
+
+{startarg}        { BEGIN(ARGUMENT_COND); return START; }
+{stoparg}         { BEGIN(ARGUMENT_COND); return STOP; }
+{restartarg}      { BEGIN(ARGUMENT_COND); return RESTART; }
+{execarg}         { BEGIN(ARGUMENT_COND); return EXEC; }
+
+if                { return IF; }
+or                { return OR; }
+then              { return THEN; }
+failed            { return FAILED; }
+ssl               { return HTTPDSSL; }
+enable            { return ENABLE; }
+disable           { return DISABLE; }
+set               { return SET; }
+daemon            { return DAEMON; }
+delay             { return DELAY; }
+logfile           { return LOGFILE; }
+syslog            { return SYSLOG; }
+facility          { return FACILITY; }
+httpd             { return HTTPD; }
+address           { return ADDRESS; }
+clientpemfile     { return CLIENTPEMFILE; }
+allowselfcertification  { return ALLOWSELFCERTIFICATION; }
+certmd5           { return CERTMD5; }
+pemfile           { return PEMFILE; }
+init              { return INIT; }
+allow             { return ALLOW; }
+read[-]?only      { return READONLY; }
+pidfile           { return PIDFILE; }
+idfile            { return IDFILE; }
+statefile         { return STATEFILE; }
+path              { return PATHTOK; }
+start             { return START; }
+stop              { return STOP; }
+port(number)?     { return PORT; }
+unix(socket)?     { return UNIXSOCKET; }
+type              { return TYPE; }
+proto(col)?       { return PROTOCOL; }
+tcp               { return TCP; }
+tcpssl            { return TCPSSL; }
+udp               { return UDP; }
+alert             { return ALERT; }
+noalert           { return NOALERT; }
+mail-format       { return MAILFORMAT; }
+resource          { return RESOURCE; }
+restart(s)?       { return RESTART; }
+cycle(s)?         { return CYCLE;}
+timeout           { return TIMEOUT; }
+retry             { return RETRY; }
+checksum          { return CHECKSUM; }
+mailserver        { return MAILSERVER; }
+host              { return HOST; }
+hostheader        { return HOSTHEADER; }
+status            { return STATUS; }
+system            { return SYSTEM; }
+default           { return DEFAULT; }
+http              { return HTTP; }
+apache-status     { return APACHESTATUS; }
+ftp               { return FTP; }
+smtp              { return SMTP; }
+postfix-policy    { return POSTFIXPOLICY; }
+pop               { return POP; }
+imap              { return IMAP; }
+clamav            { return CLAMAV; }
+dns               { return DNS; }
+mysql             { return MYSQL; }
+nntp              { return NNTP; }
+ntp3              { return NTP3; }
+ssh               { return SSH; }
+dwp               { return DWP; }
+ldap2             { return LDAP2; }
+ldap3             { return LDAP3; }
+rdate             { return RDATE; }
+lmtp              { return LMTP; }
+rsync             { return RSYNC; }
+tns               { return TNS; }
+pgsql             { return PGSQL; }
+sip               { return SIP; } 
+gps               { return GPS; } 
+radius            { return RADIUS; }
+memcache          { return MEMCACHE; }
+target            { return TARGET; }
+maxforward        { return MAXFORWARD; }
+mode              { return MODE; }
+active            { return ACTIVE; }
+passive           { return PASSIVE; }
+manual            { return MANUAL; }
+uid               { return UID; }
+gid               { return GID; }
+request           { return REQUEST; }
+secret            { return SECRET; }
+loglimit          { return LOGLIMIT; }
+closelimit        { return CLOSELIMIT; }
+dnslimit          { return DNSLIMIT; }
+keepalivelimit    { return KEEPALIVELIMIT; }
+replylimit        { return REPLYLIMIT; }
+requestlimit      { return REQUESTLIMIT; }
+startlimit        { return STARTLIMIT; }
+waitlimit         { return WAITLIMIT; }
+gracefullimit     { return GRACEFULLIMIT; }
+cleanuplimit      { return CLEANUPLIMIT; }
+mem(ory)?         { return MEMORY; }
+swap              { return SWAP; }
+totalmem(ory)?    { return TOTALMEMORY; }
+cpu               { return CPU; }
+totalcpu          { return TOTALCPU; }
+child(ren)        { return CHILDREN; }
+timestamp         { return TIMESTAMP; }
+changed           { return CHANGED; }
+second(s)?        { return SECOND; }
+minute(s)?        { return MINUTE; }
+hour(s)?          { return HOUR; }
+day(s)?           { return DAY; }
+sslv2             { return SSLV2; }
+sslv3             { return SSLV3; }
+tlsv1             { return TLSV1; }
+sslauto           { return SSLAUTO; }
+inode(s)?         { return INODE; }
+space             { return SPACE; }
+perm(ission)?     { return PERMISSION; }
+exec(ute)?        { return EXEC; }
+size              { return SIZE; }
+uptime            { return UPTIME; }
+basedir           { return BASEDIR; }
+slot(s)?          { return SLOT; }
+eventqueue        { return EVENTQUEUE; }
+match(ing)?       { return MATCH; }
+not               { return NOT; }
+ignore            { return IGNORE; }
+connection        { return CONNECTION; }
+unmonitor         { return UNMONITOR; }
+action            { return ACTION; }
+icmp              { return ICMP; }
+echo              { return ICMPECHO; }
+send              { return SEND; }
+expect            { return EXPECT; }
+expectbuffer      { return EXPECTBUFFER; }
+cleartext         { return CLEARTEXT; }
+md5               { return MD5HASH; }
+sha1              { return SHA1HASH; }
+crypt             { return CRYPT; }
+signature         { return SIGNATURE; }
+nonexist          { return NONEXIST; }
+exist             { return EXIST; }
+invalid           { return INVALID; }
+data              { return DATA; }
+recovered         { return RECOVERED; }
+passed            { return PASSED; }
+succeeded         { return SUCCEEDED; }
+else              { return ELSE; }
+mmonit            { return MMONIT; }
+url               { return URL; }
+content           { return CONTENT; }
+pid               { return PID; }
+ppid              { return PPID; }
+count             { return COUNT; }
+reminder          { return REMINDER; }
+instance          { return INSTANCE; }
+hostname          { return HOSTNAME; }
+username          { return USERNAME; }
+password          { return PASSWORD; }
+credentials       { return CREDENTIALS; }
+register          { return REGISTER; }
+fsflag(s)?        { return FSFLAG; }
+fips              { return FIPS; }
+{byte}            { return BYTE; }
+{kilobyte}        { return KILOBYTE; }
+{megabyte}        { return MEGABYTE; }
+{gigabyte}        { return GIGABYTE; }
+{loadavg1}        { return LOADAVG1; }
+{loadavg5}        { return LOADAVG5; }
+{loadavg15}       { return LOADAVG15; }
+{cpuuser}         { return CPUUSER; }
+{cpusyst}         { return CPUSYSTEM; }
+{cpuwait}         { return CPUWAIT; }
+{greater}         { return GREATER; }
+{less}            { return LESS; }
+{equal}           { return EQUAL; }
+{notequal}        { return NOTEQUAL; }
+
+include           { BEGIN(INCLUDE); }
+
+not[ ]+every      { 
+                    BEGIN(EVERY_COND);
+                    return NOTEVERY;
+                  }
+
+every             { 
+                    BEGIN(EVERY_COND);
+                    return EVERY;
+                  }
+
+depend(s)?[ \t]+(on[ \t]*)? {
+                    BEGIN(DEPEND_COND);
+                    return DEPENDS;
+                  } 
+
+check[ \t]+(process[ \t])? {
+                    BEGIN(SERVICE_COND);
+                    return CHECKPROC;
+                  }
+
+check[ \t]+(program[ \t])? {
+                    BEGIN(SERVICE_COND);
+                    return CHECKPROGRAM;
+                  }
+
+check[ \t]+device { /* Filesystem alias for backward compatibility  */
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILESYS;
+                  }
+
+check[ \t]+filesystem {
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILESYS;
+                  }
+
+check[ \t]+file   {
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILE;
+                  }
+
+check[ \t]+directory {
+                    BEGIN(SERVICE_COND);
+                    return CHECKDIR;
+                  }
+
+check[ \t]+host   {
+                    BEGIN(SERVICE_COND);
+                    return CHECKHOST;
+                  }
+
+check[ \t]+system {
+                    BEGIN(SERVICE_COND);
+                    return CHECKSYSTEM;
+                  }
+
+check[ \t]+fifo   {
+                    BEGIN(SERVICE_COND);
+                    return CHECKFIFO;
+                  }
+
+check[ \t]+program   {
+                    BEGIN(SERVICE_COND);
+                        return CHECKPROGRAM;
+                  }
+
+group[ \t]+       {
+                    BEGIN(STRING_COND);
+                    return GROUP;
+                  }
+
+[a-zA-Z0-9]+"://" {
+		    yylval.url= 
+		      create_URL(Str_ndup(yytext, strlen(yytext)-3));
+                    BEGIN(URL_COND);
+                  }
+[0-9]{2}":"[0-9]{2}":"[0-9]{2} {
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return TIMESPEC;
+                  }
+
+{number}          {
+                    yylval.number= atoi(yytext);
+                    save_arg(); return NUMBER;
+                  }
+
+{real}            {
+                    yylval.real= atof(yytext);
+                    save_arg(); return REAL;
+                  }
+
+{percent}         {
+	            return PERCENT;
+                  }
+
+[a-zA-Z0-9]{str}  {
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return STRING;
+                  }
+
+\"[/][^\"\n]*\"   {
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return PATH;
+                  }
+
+\'[/][^\'\n]*\'   {
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return PATH;
+                  }
+
+\"[^\"]*\"        {
+                    steplinenobycr(yytext);
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return STRING;
+                  }
+
+\'[^\']*\'        {
+                    steplinenobycr(yytext);
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return STRING;
+                  }
+
+{str}[@]{str}     {
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return MAILADDR;
+                  }
+
+[/]{str}          {
+                     yylval.string= Str_dup(yytext);
+                     save_arg(); return PATH;
+                  }
+
+"/"               {
+                     yylval.string= Str_dup(yytext);
+                     save_arg(); return PATH;
+                  }
+
+"from:"[ \t]*{str}[@]{str} {
+                      char *p= yytext+strlen("from:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILFROM;
+                  }
+
+"reply-to:"[ \t]*{str}[@]{str} {
+                      char *p= yytext+strlen("reply-to:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILREPLYTO;
+                  }
+
+"subject:"[^}\n]* {
+                      char *p= yytext+strlen("subject:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILSUBJECT;
+                  }
+
+"message:"[^}]*   {
+                      char *p= yytext+strlen("message:");
+                      steplinenobycr(yytext);
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILBODY;
+                  }
+
+{hostname}        {
+                      yylval.string = Str_dup(yytext);
+                      save_arg(); return STRING;
+                  }
+
+[\"\']            {
+                      yyerror("unbalanced quotes");
+                  }
+
+<SERVICE_COND>{
+
+  {ws}            ;
+
+  [\n]            {
+                    lineno++;
+                  }
+
+  {str}           {
+                    yylval.string= Str_dup(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+
+  \"{str}\"       {
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+
+  \'{str}\'       {
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+
+  [\"\']          {
+                      yyerror("unbalanced quotes");
+                  }
+
+}
+
+<DEPEND_COND>{
+
+  {wws}           ;
+
+  {wws}?[\n]{wws}? {
+                    lineno++;
+                  }
+
+  {str}           {
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return SERVICENAME;
+                  }
+
+  [ \r\n\t]+[^,]  {
+                    steplinenobycr(yytext);
+                    unput(yytext[strlen(yytext)-1]);
+                    BEGIN(INITIAL);
+                  }
+
+}
+
+<ARGUMENT_COND>{
+
+  {ws}            ;
+
+  [\n]            {
+                    lineno++;
+                  }
+
+  \"              {
+                      BEGIN(INITIAL);
+                  }
+
+  \'[^\']*\'      {
+                      steplinenobycr(yytext);
+                      yylval.string= handle_quoted_string(yytext);
+                      save_arg(); return STRING;
+                  }
+
+  \'              {
+                      yyerror("unbalanced quotes");
+                  }
+
+  [^ \t\n\"]+     {
+                      yylval.string= Str_dup(yytext);
+                      save_arg(); return STRING;
+                  }
+
+}
+
+<URL_COND>{
+
+  {ws}|[\n]       {
+                      BEGIN(INITIAL);
+		      if(!yylval.url->hostname)
+			yyerror("missing hostname in URL");
+		      if(!yylval.url->path)
+			yylval.url->path= Str_dup("/");
+                      yylval.url->url= Str_cat("%s://%s:%d%s%s%s",
+                        yylval.url->protocol,
+                        /* possible credentials are hidden */
+                        yylval.url->hostname,
+                        yylval.url->port,
+                        yylval.url->path,
+                        yylval.url->query?"?":"",
+                        yylval.url->query?yylval.url->query:"");
+		      save_arg(); return URLOBJECT;
+                  }
+
+  [^:@ ]+/[:][^@: ]+[@] {
+	              yylval.url->user= Str_dup(yytext);
+                  }
+
+  [:][^@ ]+[@]    {
+	              yytext++;
+	              yylval.url->password= Str_ndup(yytext, strlen(yytext)-1);
+                  }
+
+  [^/?:#\r\n ]+   {
+	              yylval.url->hostname= Str_dup(yytext);
+                  }
+
+  [:]{number}     {
+	              yylval.url->port= atoi(++yytext);
+                  }
+
+  [/][^?#\r\n ]*  {
+	              yylval.url->path= Util_urlEncode(yytext);
+                  }
+
+  [?][^#\r\n ]*   {
+	              yylval.url->query= Util_urlEncode(++yytext);
+                  }
+
+  [#][^\r\n ]*    { 
+	              /* EMPTY - reference is ignored */ 
+                  }
+
+}
+
+<STRING_COND>{
+
+  {str}           {
+                    yylval.string= Str_dup(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+
+  \"{str}\"       {
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+
+  \'{str}\'       {
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+
+  [\"\']          {
+                      yyerror("unbalanced quotes");
+                  }
+
+}
+
+<EVERY_COND>{
+        
+  {ws}            ;
+
+  {number}        {
+                    yylval.number= atoi(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return NUMBER;
+                  }
+        
+  ['"]{ws}?[0-9,*-]+{ws}[0-9,*-]+{ws}[0-9,*-]+{ws}[0-9,*-]+{ws}[0-9,*-]+{ws}?['"] { // A minimal syntax check of the cron format string; 5 fields separated with white-space
+                    yylval.string= Str_dup(Str_unquote(yytext));
+                    BEGIN(INITIAL);
+                    save_arg(); return TIMESPEC;
+                  }
+
+  .               {
+                      BEGIN(INITIAL);
+                      yyerror("invalid every format");
+                  }
+
+}
+
+
+<INITIAL,ARGUMENT_COND,SERVICE_COND,DEPEND_COND,URL_COND,STRING_COND,EVERY_COND>. {
+                      return yytext[0];
+                  }  
+
+
+<INCLUDE>[ \t]*      /* eat the whitespace */
+
+<INCLUDE>\"[^\"\r\n]+\" { /* got the include file name with double quotes */
+                     char *temp=Str_dup(yytext);
+                     Str_unquote(temp);    
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+
+<INCLUDE>\'[^\'\r\n]+\' { /* got the include file name with single quotes*/
+                     char *temp=Str_dup(yytext);
+                     Str_unquote(temp);    
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+
+<INCLUDE>[^ \t\r\n]+ { /* got the include file name without quotes*/
+                     char *temp=Str_dup(yytext);
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+
+
+<<EOF>>           {
+                       
+                       if ( !pop_buffer_state() )
+                       {
+                         yyterminate();
+                       } else {
+                         BEGIN(INITIAL);
+                       }
+                  }
+
+%%
+
+/*
+ * Do lineno++ for every occurrence of '\n' in a string.  This is
+ * necessary whenever a yytext has an unknown number of CRs.
+ */
+
+static void steplinenobycr(char *string) {
+
+  char *pos= string;
+
+  while(*pos)
+    if('\n'==*pos++) {
+      lineno++;
+    }
+
+}
+
+
+static char *handle_quoted_string(char *string) {
+  char *buf= Str_dup(string);
+  Str_unquote(buf);
+  Util_handleEscapes(buf);
+  return buf;
+}
+
+
+static void include_file(char *pattern) {
+  glob_t globbuf;
+  int i;
+
+  if (glob(pattern,  GLOB_MARK, NULL, &globbuf) != 0)
+    return; // no include files found
+
+  for (i = 0; i < globbuf.gl_pathc; i++) {
+    FILE *yyin;
+    size_t filename_length = strlen(globbuf.gl_pathv[i]);
+
+    /* check whenever we have caught a directory or file backup copy */
+    if ((filename_length == 0) || (globbuf.gl_pathv[i][filename_length-1] == '~' ) || (globbuf.gl_pathv[i][filename_length-1] == '/' ))
+      continue;
+
+    yyin = fopen( globbuf.gl_pathv[i], "r" );
+    
+    if (! yyin)
+      yyerror( "failed to include file" );
+    else
+      push_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ), globbuf.gl_pathv[i]);
+  }
+  globfree(&globbuf);
+}
+
+
+static void push_buffer_state(YY_BUFFER_STATE buffer, char *filename) {
+
+  if ( buffer_stack_ptr >= MAX_STACK_DEPTH )
+  {
+
+    yyerror("include files are nested too deeply" );
+    exit( 1 );
+    
+  }
+
+  buffer_stack[buffer_stack_ptr].lineno = lineno;
+  buffer_stack[buffer_stack_ptr].currentfile = currentfile;
+  buffer_stack[buffer_stack_ptr].buffer = YY_CURRENT_BUFFER;
+
+  buffer_stack_ptr++;
+
+  lineno = 1;
+  currentfile = Str_dup(filename);
+      
+  yy_switch_to_buffer(buffer);
+
+  BEGIN(INITIAL);
+  
+}
+
+
+static int pop_buffer_state(void) {
+
+  if ( --buffer_stack_ptr < 0 ) {
+
+    return 0;
+
+  } else {
+    
+    fclose(yyin);
+    lineno=buffer_stack[buffer_stack_ptr].lineno;
+
+    FREE(currentfile);
+    currentfile=buffer_stack[buffer_stack_ptr].currentfile;
+
+    yy_delete_buffer( YY_CURRENT_BUFFER );
+    yy_switch_to_buffer( buffer_stack[buffer_stack_ptr].buffer );
+    
+  }
+
+  return 1;
+ 
+}
+
+
+static void save_arg(void) {
+  
+  arglineno=lineno;
+  argcurrentfile=currentfile;
+  FREE(argyytext);
+  argyytext=Str_dup(yytext);
+  
+}
+
+
+static URL_T create_URL(char *proto) {
+  URL_T url;
+  ASSERT(proto);
+  NEW(url);
+  url->protocol= proto;
+  if(IS(url->protocol, "https")) {
+    url->port= 443;
+    if(!have_ssl())
+      yyerror("HTTPS protocol not supported -- SSL support disabled" );
+  } else if(IS(url->protocol, "http")) {
+    url->port= 80;
+  } else {
+    yyerror("URL protocol not supported -- ");
+  }
+  return url;
+}
diff --git a/monit-5.4/src/lex.yy.c b/monit-5.4/src/lex.yy.c
new file mode 100644
index 0000000..2696e28
--- /dev/null
+++ b/monit-5.4/src/lex.yy.c
@@ -0,0 +1,5812 @@
+#line 2 "src/lex.yy.c"
+
+#line 4 "src/lex.yy.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif	/* defined (__STDC__) */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart(yyin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart (FILE *input_file  );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
+void yy_delete_buffer (YY_BUFFER_STATE b  );
+void yy_flush_buffer (YY_BUFFER_STATE b  );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
+
+void *yyalloc (yy_size_t  );
+void *yyrealloc (void *,yy_size_t  );
+void yyfree (void *  );
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        yyensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define yywrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	yyleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 271
+#define YY_END_OF_BUFFER 272
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_acclist[2441] =
+    {   0,
+      267,  267,  272,  266,  271,    1,  266,  271,    2,  271,
+      266,  271,  233,  266,  271,  232,  266,  271,  232,  266,
+      271,  219,  266,  271,  233,  266,  271,  227,  232,  266,
+      271,  217,  218,  232,  266,  271,  197,  232,  266,  271,
+      198,  232,  266,  271,  196,  232,  266,  271,  232,  266,
+      271,  186,  232,  266,  271,  232,  266,  271,  232,  266,
+      271,  232,  266,  271,  232,  266,  271,  232,  266,  271,
+      232,  266,  271,  232,  266,  271,  232,  266,  271,  232,
+      266,  271,  232,  266,  271,  232,  266,  271,  232,  266,
+      271,  232,  266,  271,  232,  266,  271,  232,  266,  271,
+
+      232,  266,  271,  232,  266,  271,  232,  266,  271,  232,
+      266,  271,  232,  266,  271,  249,  266,  271,  244,  266,
+      271,  245,  271,  244,  249,  266,  271,  246,  266,  271,
+      248,  249,  266,  271,  240,  266,  271,  241,  271,  242,
+      266,  271,  240,  266,  271,  234,  266,  271,  235,  271,
+      239,  266,  271,  236,  266,  271,  239,  266,  271,  253,
+      266,  271,16635,  250,  253,  266,  271,16635,  250,  271,
+    16635,  250,  266,  271,16635,  250,  266,  271,  257,  266,
+      271,16635,  255,  266,  271,16635,  266,  271,  256,  266,
+      271,16635,  253,  266,  271,  271,  261,  266,  271,  258,
+
+      266,  271,  261,  266,  271,  265,  266,  271,  262,  265,
+      266,  271,  265,  266,  271,  263,  265,  266,  271,  270,
+      271,  267,  271,  270,  271,  270,  271,    1,  199,  223,
+        2,  232,  232,  232,  232,  232,  224,  226,  232,  226,
+      232,  220,  232,  220,  232,  217,  218,  220,  232,  220,
+      232,  198,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,    4,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+
+      220,  232,  220,  232,  220,  232,  220,  232,  198,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  189,  220,  232,
+      220,  232,  220,  232,  220,  232,  196,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,   27,
+      220,  232,  220,  232,  220,  232,  220,  232,    3,  220,
+      232,  187,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  197,  220,  232,  220,
+      232,  188,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  199,  220,  232,  220,
+
+      232,  220,  232,  220,  232,   21,  220,  232,    7,  220,
+      232,   28,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      249,  244,  244,  249,  249,  247,  249,  243,  240,  243,
+
+      241,  243,  240,  243,  240,  241,  243,  243,  241,  243,
+      241,  242,  241,  234,  236,  253,16635,16635,  253,  250,
+      253,16635,  250,16635,  250,  257,16635,  257,  257,  255,
+    16635,  255,  255,  254,  256,16635,  256,  256,  258,  262,
+      263,  270,  267,  270,  270,  221,  223,  232,  232,  225,
+      225,  232,  225,  222,  224,  226,  232,  220,  232,  218,
+      220,  232,  217,  218,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,   10,  220,  232,  220,  232,    5,
+      220,  232,  220,  232,   20,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  125,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  133,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,   85,  220,  232,  220,  232,   90,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,    6,  220,  232,  220,  232,  220,  232,
+       79,  220,  232,  109,  220,  232,  220,  232,   99,  220,
+      232,  220,  232,  220,  232,  220,  232,   11,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  159,  220,  232,  220,
+      232,  122,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      148,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  174,  220,  232,
+       82,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,   34,  220,  232,
+      220,  232,  220,  232,   98,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,   89,  220,  232,   31,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,   15,
+      220,  232,  220,  232,  220,  232,  220,  232,   59,  220,
+      232,  220,  232,   14,  220,  232,  220,  232,  220,  232,
+       96,  220,  232,  220,  232,  220,  232,   61,  220,  232,
+      108,  220,  232,  220,  232,  220,  232,  220,  232,  172,
+      220,  232,  220,  232,   13,  220,  232,  220,  232,  220,
+
+      232,   18,  220,  232,  220,  232,  247,  237,  238,  257,
+      255,  252,  256,  259,  260,  268,  270,  268,  269,  270,
+      269,  215,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  186,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  166,
+      220,  232,  133,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,   22,  220,  232,  154,  220,
+      232,  170,  220,  232,  220,  232,  220,  232,  220,  232,
+
+      220,  232,  141,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  185,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,   72,  220,
+      232,  132,  220,  232,   77,  220,  232,  153,  220,  232,
+      220,  232,  220,  232,   83,  220,  232,  220,  232,   46,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  197,  220,  232,   94,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  104,  220,  232,  220,
+
+      232,   87,  220,  232,  220,  232,  220,  232,  220,  232,
+       88,  220,  232,    7,  220,  232,  220,  232,   52,  220,
+      232,  220,  232,  220,  232,  140,  220,  232,  220,  232,
+      220,  232,   55,  220,  232,  220,  232,  175,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  155,  220,  232,  160,  220,  232,  220,  232,
+      142,  220,  232,  145,  220,  232,   80,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,   54,
+
+      220,  232,  220,  232,  220,  232,  123,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,   16,  220,  232,
+       29,  220,  232,  220,  232,  220,  232,  220,  232,   57,
+      220,  232,   56,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,    8,  220,  232,
+     8443, 8443,  257, 8443,  255, 8443,  256,  220,  232,  220,
+      232,  220,  232,   62,  220,  232,   47,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  176,  220,  232,  193,  194,
+
+      195,  220,  232,  220,  232,  161,  220,  232,   67,  220,
+      232,  220,  232,  220,  232,   36,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  198,  220,  232,  220,
+      232,  202,  220,  232,   26,  220,  232,  164,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      132,  220,  232,   40,  220,  232,  220,  232,  220,  232,
+      220,  232,  138,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,   91,  220,  232,   92,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+
+      232,  147,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,   86,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,   97,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+       58,  220,  232,  220,  232,   93,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,   69,  220,  232,   95,
+      220,  232,  220,  232,  220,  232,  220,  232,  145,  220,
+      232,  139,  220,  232,  220,  232,  134,  220,  232,  135,
+
+      220,  232,   53,  220,  232,  220,  232,  220,  232,   24,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,   19,  220,
+      232,  136,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,   17,  220,  232,  220,  232,   12,  220,  232,
+      220,  232,  220,  232,  220,  232,  152,  220,  232,  105,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  204,  205,  220,  232,  220,  232,
+       84,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,   67,
+
+      220,  232,   35,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,   32,  220,  232,  220,  232,  220,  232,
+      156,  220,  232,  220,  232,   30,  220,  232,  184,  220,
+      232,  220,  232,  220,  232,  220,  232,  214,  220,  232,
+      220,  232,   50,  220,  232,  149,  220,  232,  220,  232,
+      138,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  107,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  122,  220,  232,  220,  232,  131,  220,  232,
+      171,  220,  232,  220,  232,  220,  232,  220,  232,  168,
+
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  100,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  130,  220,  232,  111,  220,
+      232,  220,  232,  220,  232,   23,  220,  232,  220,  232,
+      220,  232,  220,  232,   74,  220,  232,  220,  232,  220,
+      232,  220,  232,   38,  220,  232,   75,  220,  232,  102,
+      220,  232,   60,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  143,  220,  232,
+
+      220,  232,  220,  232,    8,  220,  232,  220,  232,   41,
+      220,  232,  220,  232,  220,  232,  144,  220,  232,   44,
+      220,  232,  129,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  173,
+      220,  232,  194,  193,  195,  220,  232,  220,  232,   76,
+      220,  232,  203,  220,  232,   33,  220,  232,  220,  232,
+      220,  232,  141,  220,  232,  220,  232,  220,  232,  215,
+      184,  220,  232,  220,  232,  220,  232,  196,  220,  232,
+      220,  232,  220,  232,  200,  220,  232,  220,  232,  165,
+      220,  232,  220,  232,  220,  232,  190,  220,  232,   37,
+
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  131,  220,
+      232,   63,  220,  232,  220,  232,  220,  232,  106,  220,
+      232,  220,  232,   45,  220,  232,  219,  220,  232,  220,
+      232,   49,  220,  232,  220,  232,  220,  232,    9,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  110,  220,  232,
+      220,  232,   66,  220,  232,  130,  220,  232,  220,  232,
+      137,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  220,  232,  220,  232,   68,  220,  232,  220,  232,
+
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      220,  232,    8,  220,  232,  216,  220,  232,  220,  232,
+       70,  220,  232,  127,  220,  232,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      114,  220,  232,  220,  232,  220,  232,   39,  220,  232,
+      228,  189,  220,  232,  220,  232,  220,  232,  179,  220,
+      232,  178,  220,  232,  220,  232,  187,  220,  232,  190,
+      112,  220,  232,  220,  232,  220,  232,  147,  220,  232,
+      220,  232,  188,  220,  232,  101,  220,  232,  231,  163,
+      220,  232,  199,  220,  232,  181,  220,  232,  220,  232,
+
+      220,  232,  220,  232,    9,  220,  232,   58,  220,  232,
+      220,  232,   48,  220,  232,  220,  232,  183,  220,  232,
+      177,  220,  232,  220,  232,  220,  232,  220,  232,   65,
+      220,  232,   25,  220,  232,  220,  232,   66,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+      230,  220,  232,  220,  232,  126,  220,  232,  124,  220,
+      232,  220,  232,  220,  232,  180,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  158,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  203,  220,  232,
+      220,  232,  220,  232,  220,  232,  220,  232,  220,  232,
+
+      220,  232,  220,  232,  231,  231,  201,  220,  232,  220,
+      232,  220,  232,   48,  220,  232,  167,  220,  232,  220,
+      232,  220,  232,  220,  232,  162,  220,  232,  220,  232,
+      220,  232,   51,  220,  232,  220,  232,  230,  230,  169,
+      220,  232,  128,  220,  232,  220,  232,  220,  232,  151,
+      220,  232,  119,  220,  232,  220,  232,  220,  232,  212,
+      208,  210,  220,  232,  220,  232,  113,  220,  232,  150,
+      220,  232,  220,  232,  203,  146,  220,  232,  220,  232,
+      220,  232,   73,  220,  232,  220,  232,  190,  191,  220,
+      232,   71,  220,  232,  103,  220,  232,  215,  231,  140,
+
+      220,  232,   55,  220,  232,  220,  232,  116,  220,  232,
+      220,  232,  220,  232,  118,  220,  232,  220,  232,  220,
+      232,  215,  230,  220,  232,   56,  220,  232,  220,  232,
+      220,  232,  220,  232,  220,  232,  182,  220,  232,  220,
+      232,  220,  232,  220,  232,  192,   64,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,  220,  232,  124,
+      220,  232,  264,  220,  232,  220,  232,  206,  211,  121,
+      220,  232,  220,  232,  157,  220,  232,  220,  232,  220,
+      232,  220,  232,  229,  117,  220,  232,  220,  232,  220,
+      232,  220,  232,   78,  220,  232,  213,   42,  220,  232,
+
+      120,  220,  232,  220,  232,  220,  232,  220,  232,  220,
+      232,  204,  205,  115,  220,  232,   81,  220,  232,  220,
+      232,  220,  232,  209,  220,  232,  207,  220,  232,  220,
+      232,  220,  232,  220,  232,  220,  232,   43,  220,  232
+    } ;
+
+static yyconst flex_int16_t yy_accept[1306] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    2,    3,    4,    6,    9,
+       11,   13,   16,   19,   22,   25,   28,   32,   37,   41,
+       45,   49,   52,   56,   59,   62,   65,   68,   71,   74,
+       77,   80,   83,   86,   89,   92,   95,   98,  101,  104,
+      107,  110,  113,  116,  119,  122,  124,  128,  131,  135,
+      138,  140,  143,  146,  149,  151,  154,  157,  160,  164,
+      169,  172,  176,  179,  183,  187,  189,  193,  196,  197,
+      200,  203,  206,  209,  213,  216,  220,  222,  224,  226,
+      228,  229,  230,  230,  231,  231,  231,  232,  233,  234,
+
+      234,  235,  236,  237,  237,  237,  238,  238,  240,  242,
+      244,  246,  250,  250,  252,  254,  256,  258,  260,  262,
+      264,  266,  268,  271,  273,  275,  277,  279,  281,  283,
+      285,  287,  289,  291,  293,  295,  297,  299,  301,  303,
+      305,  307,  309,  312,  314,  316,  318,  320,  322,  324,
+      326,  328,  331,  333,  335,  337,  340,  342,  344,  346,
+      348,  350,  353,  355,  357,  359,  362,  365,  367,  369,
+      371,  373,  375,  377,  380,  382,  385,  387,  389,  391,
+      393,  395,  397,  400,  402,  404,  406,  409,  412,  415,
+      417,  419,  421,  423,  425,  427,  429,  431,  433,  435,
+
+      437,  439,  441,  443,  445,  447,  449,  451,  453,  455,
+      457,  459,  461,  463,  465,  467,  469,  471,  473,  475,
+      477,  479,  481,  483,  485,  487,  489,  491,  492,  493,
+      495,  496,  496,  498,  499,  501,  503,  505,  506,  508,
+      509,  511,  512,  513,  514,  515,  515,  516,  516,  518,
+      519,  519,  520,  523,  525,  526,  528,  529,  530,  532,
+      533,  534,  534,  535,  537,  538,  539,  539,  540,  540,
+      541,  541,  541,  542,  543,  544,  545,  545,  546,  546,
+      546,  548,  548,  549,  550,  551,  552,  553,  554,  554,
+      556,  558,  560,  563,  567,  567,  567,  569,  571,  573,
+
+      575,  578,  580,  583,  585,  588,  590,  592,  594,  596,
+      598,  600,  602,  604,  606,  608,  610,  613,  615,  617,
+      619,  621,  623,  626,  628,  630,  632,  634,  637,  639,
+      642,  644,  646,  648,  650,  652,  654,  656,  658,  660,
+      662,  664,  667,  669,  671,  674,  677,  679,  682,  684,
+      686,  688,  691,  693,  695,  697,  699,  701,  703,  705,
+      707,  709,  711,  713,  715,  717,  719,  721,  723,  725,
+      727,  729,  731,  733,  735,  737,  740,  742,  745,  747,
+      749,  751,  753,  755,  757,  759,  761,  764,  766,  768,
+      770,  772,  774,  776,  778,  781,  784,  786,  788,  790,
+
+      792,  794,  796,  798,  800,  802,  804,  806,  808,  810,
+      812,  814,  816,  818,  821,  823,  825,  828,  830,  832,
+      834,  836,  839,  842,  844,  846,  848,  850,  853,  855,
+      857,  859,  862,  864,  867,  869,  871,  874,  876,  878,
+      881,  884,  886,  888,  890,  893,  895,  898,  900,  902,
+      905,  907,  908,  909,  910,  910,  911,  912,  913,  914,
+      915,  916,  916,  918,  919,  921,  922,  922,  923,  925,
+      927,  929,  931,  933,  935,  938,  940,  942,  944,  946,
+      948,  950,  952,  954,  956,  958,  960,  960,  960,  962,
+      964,  966,  968,  970,  973,  976,  978,  980,  982,  984,
+
+      986,  989,  992,  995,  997,  999, 1001, 1003, 1006, 1008,
+     1010, 1012, 1014, 1017, 1019, 1021, 1023, 1025, 1027, 1029,
+     1032, 1035, 1038, 1041, 1043, 1045, 1048, 1050, 1053, 1055,
+     1057, 1059, 1061, 1063, 1065, 1068, 1071, 1073, 1075, 1077,
+     1079, 1081, 1083, 1085, 1087, 1089, 1091, 1093, 1095, 1097,
+     1100, 1102, 1105, 1107, 1109, 1109, 1111, 1114, 1117, 1119,
+     1122, 1124, 1126, 1129, 1131, 1133, 1136, 1138, 1141, 1143,
+     1145, 1147, 1149, 1151, 1153, 1155, 1157, 1159, 1161, 1163,
+     1165, 1167, 1169, 1171, 1173, 1176, 1179, 1181, 1184, 1187,
+     1190, 1192, 1194, 1196, 1198, 1200, 1203, 1205, 1207, 1210,
+
+     1212, 1214, 1216, 1218, 1221, 1224, 1226, 1228, 1230, 1233,
+     1236, 1238, 1240, 1242, 1244, 1246, 1248, 1251, 1252, 1254,
+     1256, 1258, 1258, 1258, 1260, 1262, 1264, 1267, 1270, 1272,
+     1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292,
+     1294, 1296, 1299, 1299, 1299, 1302, 1302, 1302, 1302, 1304,
+     1306, 1309, 1312, 1314, 1316, 1319, 1321, 1323, 1325, 1327,
+     1330, 1332, 1335, 1335, 1336, 1338, 1341, 1343, 1345, 1347,
+     1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1364, 1367,
+     1369, 1371, 1373, 1376, 1378, 1380, 1382, 1384, 1387, 1390,
+     1392, 1394, 1396, 1398, 1400, 1402, 1405, 1407, 1409, 1411,
+
+     1413, 1415, 1417, 1419, 1422, 1424, 1426, 1426, 1428, 1430,
+     1432, 1434, 1436, 1438, 1440, 1443, 1445, 1447, 1449, 1451,
+     1454, 1456, 1459, 1461, 1463, 1465, 1467, 1469, 1471, 1473,
+     1475, 1477, 1480, 1483, 1485, 1487, 1489, 1492, 1495, 1497,
+     1500, 1503, 1506, 1508, 1510, 1510, 1511, 1513, 1515, 1517,
+     1519, 1521, 1523, 1525, 1527, 1529, 1532, 1535, 1537, 1539,
+     1541, 1543, 1546, 1548, 1551, 1553, 1555, 1557, 1557, 1557,
+     1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579,
+     1581, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1596, 1596,
+     1596, 1596, 1598, 1600, 1603, 1606, 1608, 1610, 1612, 1614,
+
+     1617, 1619, 1621, 1624, 1626, 1629, 1629, 1629, 1629, 1632,
+     1634, 1636, 1638, 1639, 1641, 1643, 1646, 1649, 1651, 1654,
+     1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1675,
+     1677, 1679, 1681, 1683, 1686, 1688, 1691, 1694, 1696, 1698,
+     1698, 1700, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717,
+     1719, 1721, 1723, 1726, 1728, 1730, 1732, 1734, 1736, 1738,
+     1740, 1742, 1744, 1746, 1749, 1752, 1754, 1756, 1756, 1757,
+     1759, 1761, 1763, 1765, 1768, 1768, 1768, 1768, 1770, 1772,
+     1774, 1777, 1780, 1783, 1786, 1788, 1790, 1792, 1794, 1796,
+     1798, 1801, 1803, 1805, 1808, 1810, 1810, 1810, 1813, 1815,
+
+     1817, 1820, 1823, 1826, 1826, 1826, 1826, 1826, 1826, 1828,
+     1830, 1832, 1834, 1836, 1838, 1840, 1843, 1843, 1843, 1844,
+     1844, 1844, 1845, 1845, 1845, 1845, 1846, 1846, 1848, 1850,
+     1853, 1854, 1856, 1859, 1861, 1863, 1866, 1868, 1870, 1870,
+     1871, 1874, 1876, 1878, 1881, 1883, 1885, 1888, 1890, 1893,
+     1895, 1897, 1900, 1903, 1905, 1907, 1909, 1911, 1913, 1915,
+     1917, 1919, 1922, 1925, 1927, 1927, 1929, 1932, 1934, 1937,
+     1940, 1942, 1945, 1947, 1949, 1952, 1954, 1956, 1958, 1960,
+     1962, 1964, 1966, 1968, 1971, 1973, 1976, 1979, 1981, 1984,
+     1984, 1984, 1984, 1986, 1988, 1990, 1990, 1992, 1994, 1996,
+
+     1999, 2001, 2003, 2005, 2007, 2009, 2011, 2013, 2016, 2016,
+     2017, 2019, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2024,
+     2027, 2029, 2031, 2033, 2035, 2037, 2037, 2037, 2037, 2037,
+     2039, 2041, 2041, 2044, 2046, 2048, 2051, 2052, 2055, 2057,
+     2059, 2062, 2065, 2067, 2070, 2071, 2071, 2074, 2076, 2078,
+     2081, 2083, 2086, 2089, 2090, 2093, 2093, 2096, 2099, 2101,
+     2103, 2105, 2108, 2111, 2113, 2116, 2118, 2121, 2124, 2126,
+     2128, 2130, 2133, 2133, 2134, 2136, 2138, 2141, 2143, 2143,
+     2145, 2147, 2149, 2149, 2151, 2152, 2154, 2156, 2159, 2162,
+     2164, 2166, 2169, 2171, 2171, 2173, 2175, 2175, 2175, 2175,
+
+     2175, 2175, 2175, 2175, 2177, 2180, 2182, 2184, 2186, 2186,
+     2186, 2186, 2188, 2189, 2191, 2193, 2195, 2197, 2199, 2199,
+     2199, 2199, 2201, 2203, 2205, 2206, 2207, 2208, 2210, 2212,
+     2214, 2217, 2220, 2220, 2222, 2224, 2224, 2224, 2224, 2226,
+     2229, 2229, 2231, 2233, 2236, 2236, 2238, 2239, 2240, 2243,
+     2246, 2248, 2250, 2253, 2256, 2256, 2258, 2260, 2260, 2260,
+     2261, 2262, 2263, 2263, 2263, 2263, 2265, 2267, 2270, 2273,
+     2273, 2275, 2276, 2279, 2281, 2283, 2286, 2288, 2288, 2289,
+     2289, 2289, 2289, 2290, 2290, 2292, 2295, 2298, 2300, 2303,
+     2306, 2308, 2308, 2308, 2311, 2313, 2313, 2315, 2315, 2318,
+
+     2320, 2320, 2322, 2324, 2326, 2329, 2329, 2331, 2333, 2333,
+     2333, 2333, 2333, 2333, 2333, 2335, 2337, 2340, 2342, 2344,
+     2346, 2346, 2347, 2347, 2347, 2347, 2347, 2347, 2350, 2352,
+     2352, 2354, 2354, 2356, 2356, 2358, 2358, 2360, 2363, 2363,
+     2364, 2366, 2368, 2369, 2369, 2369, 2369, 2369, 2370, 2373,
+     2375, 2378, 2380, 2382, 2382, 2382, 2382, 2382, 2384, 2385,
+     2388, 2388, 2390, 2390, 2392, 2392, 2392, 2394, 2397, 2397,
+     2397, 2397, 2398, 2401, 2404, 2406, 2406, 2408, 2408, 2410,
+     2410, 2410, 2412, 2412, 2412, 2413, 2414, 2417, 2420, 2420,
+     2422, 2424, 2425, 2425, 2425, 2425, 2427, 2428, 2430, 2432,
+
+     2434, 2436, 2438, 2441, 2441
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    5,    6,    7,    8,    9,   10,    9,   11,   12,
+       13,   14,    9,   15,   16,   17,   18,   19,   20,   21,
+       22,   19,   23,   19,   19,   19,   19,   24,   25,   26,
+       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
+       37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+       47,   48,   49,   50,   51,   52,   53,   54,   55,   56,
+        9,   57,    9,    9,    9,    9,   58,   59,   60,   61,
+
+       62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
+       72,   73,   74,   75,   76,   77,   78,   79,   80,   81,
+       82,   83,    1,    9,   84,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9
+    } ;
+
+static yyconst flex_int32_t yy_meta[85] =
+    {   0,
+        1,    2,    3,    4,    5,    1,    6,    7,    8,    1,
+        9,    1,    1,   10,   11,   10,    8,   12,   10,   10,
+       10,   10,   10,   13,    1,    8,    8,    8,   14,   15,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,   16
+    } ;
+
+static yyconst flex_int16_t yy_base[1409] =
+    {   0,
+        0,    0,   83,   93,  104,  188,  272,  356,  118,  135,
+      440,  524,  147,  203,  169,  225,  558, 6744,  229, 6744,
+      506,   84,  608,   82, 6744,  107,  114,  685,  115,  218,
+      116,  735,  804,  856,  908,  960, 1012, 1064,  249, 1116,
+      188,  343, 1168, 1220,  274,  341, 1272,  423, 1324, 1376,
+     1427,  352,  179,    0,  158, 6744,  173, 6744,  248,  424,
+      464,    0,  491,  179, 6744,    0,    0,    0,  325,  538,
+      508,  286,  256,  265,  308,  440,  483,    0, 6744,    0,
+        0,    0, 6744,  260,  555,  489,    0,   87,  296,  337,
+      577, 6744,  490, 6744,  154,   98, 6744, 1504, 1588, 1672,
+
+     1756,  185,  452,    0,  469, 6744,  124,  187,  418,  275,
+      564, 1833,  415, 1883,  276,  383, 1933,  345,  503,  566,
+      425,  338,   53,  264,  161,  170,  275,  591,  600,  596,
+      578,  609,  337,  705,  730,  602,  611,  358,  442,  598,
+      620,  440,  639,  648,  790,  804,  673,  516,  650,  738,
+      725,  190,  789,  671,  838,  270,  680,  798,  334,  747,
+      764,  340,  794,  847,  956,  423,  470,  822,  843,  858,
+      873,  473,  896,  511,  901,  547,  708,  960,  859,  892,
+      907,  949,  557,  604,  969,  898,  668, 1002,  728,  998,
+     1006, 1009, 1016, 1051,  829, 1057, 1048, 1014, 1980, 1056,
+
+     1112, 1086, 1132, 1063,  739, 1123, 1166, 1162, 1224, 1164,
+     1055,  842, 1151, 1218,  915, 1108, 1211,  769, 1160, 1171,
+     1114, 1219,  906, 1222, 1275, 1266,  944,    0,  594,  599,
+      730,  354,    0, 6744, 1520, 1534, 1538, 1552, 1571, 1408,
+     1356, 1383,    0, 1602,  680,  357,    0,  342, 1422,  291,
+        0,    0, 1460, 1324,  734, 1413, 1425,    0, 1617, 1620,
+        0,  256, 1549, 1488, 1627,    0,  274,    0,  246, 1116,
+     1684, 1711, 1460,    0,  247, 1317,  249,  840,  226,  327,
+     6744,  319, 2057, 2141, 2225, 2309,  191,    0,  176, 6744,
+      186,  167, 1633, 2386, 1646,  168, 2436, 1265, 1317, 1312,
+
+      957, 1572, 1014, 1231, 1026, 1273, 1314, 1428, 1577, 1651,
+     1333, 1670, 1435, 1642, 1699, 1675, 1739, 1711, 1563, 1713,
+     1744, 1753, 1698, 1754, 1757, 1756, 1758, 1759, 1755, 1077,
+     1761, 1764, 1770, 1806, 1800, 1848, 1819, 1854, 1234, 1804,
+     1828, 1366, 1859, 1837, 1394, 1492, 1857, 1521, 1888, 1887,
+     1866, 1542, 1889, 1673, 1892, 1925, 1594, 1907, 1928, 1930,
+     1931, 1941, 1937, 1946, 1943, 1976, 1979, 1929, 2000, 2037,
+     2038, 2036, 2040, 1989, 2047, 1595, 2053, 2055, 2046, 2057,
+     2089, 1985, 2050, 2091, 2051, 2097, 2133, 2128, 2119, 2130,
+     1769, 2134, 2143, 2136, 2141, 1656, 2139, 2142, 2154, 2202,
+
+     1799, 2194, 2208, 2145, 1953, 1967, 2179, 2195, 2212, 2215,
+     2214, 2257, 2225, 2060, 2204, 2228, 2095, 2265, 2226, 2262,
+     2297, 2148, 2286, 2298, 2301, 2302, 2310, 2217, 2312, 2311,
+     2317, 2306, 2352, 2353, 2393, 2332, 2320, 2390, 2395, 2321,
+     2323, 2392, 2402, 2351, 2360, 2403, 2431, 2432, 2433, 2383,
+     2439, 6744, 6744, 6744,  155, 2477, 2484, 6744, 2487, 6744,
+     6744, 2514,    0, 6744,    0, 6744, 1914, 6744, 2486, 2461,
+     2476, 2493, 2482, 2505, 2443, 2502, 2485, 2515, 2516, 2530,
+     2531, 2518, 2525, 2528, 2539, 2553, 2581, 2594, 2546, 2565,
+     2559, 2575, 2572, 2446, 2569, 2582, 2574, 2584, 2607, 2576,
+
+     2585, 2587, 2595, 2610, 2615, 2619, 2623, 2686, 2632, 2644,
+     2626, 2662, 2628, 2663, 2668, 2674, 2673, 2661, 2675, 2678,
+     2681, 2684, 2676, 2712, 2707, 2692, 2714, 2693, 2721, 2730,
+     2724, 2731, 2735, 2763, 2729, 2732, 2760, 2737, 2738, 2770,
+     2769, 2767, 2768, 2778, 2781, 2775, 2785, 2772, 2776, 2782,
+     2786, 2791, 2819, 2806, 2826, 2817, 2814, 2820, 2831, 2823,
+     2824, 2830, 2828, 2829, 2834, 2835, 2839, 2837, 2860, 2865,
+     2868, 2874, 2899, 2873, 2875, 2877, 2890, 2888, 2881, 2891,
+     2903, 2922, 2923, 2925, 2914, 2924, 2935, 2929, 2934, 2931,
+     2940, 2945, 2977, 2942, 2970, 3010, 2968, 2985, 2938, 2986,
+
+     3000, 3003, 2979, 2947, 2987, 3001, 3002, 3015, 2994, 3022,
+     3020, 3031, 3040, 3041, 3050, 3051, 3033, 6744,    0,    0,
+        0, 3117,  132, 3064, 3061, 3076, 3043, 3079, 3108, 3085,
+     3095, 3109, 3144, 3102, 3115, 3114, 3119, 3123, 3118, 3139,
+     3120, 3124, 3127, 3193, 6744, 3127, 3139, 3164, 3173, 3158,
+     3162, 3169, 3172, 3184, 3168, 3191, 3194, 3198, 3212, 3174,
+     3209, 3188, 2030, 6744, 3216, 3193, 3222, 3210, 3228,  768,
+     3240, 3226, 3248, 3251, 3293, 3261, 3270, 3219, 3231, 3268,
+     3277, 3276, 3280, 3281, 3252, 3282, 3283, 3287, 3292, 3302,
+     3318, 3301, 3333, 3327, 3322, 3306, 3331, 3335, 3343, 3339,
+
+     3336, 3360, 3365, 3341, 3344, 3346, 3334, 3369, 3377, 3375,
+     3379, 3386, 3390, 3384, 3391, 3397, 3393, 3398, 3409, 3429,
+     3430, 3407, 3448, 3414, 3435, 3433, 3442, 3470, 3438, 3452,
+     3459, 3445, 3449, 3482, 3463, 3478, 3453, 3466, 3483, 3484,
+     3485, 3552, 3499, 3492, 3559, 6744, 3565, 3533, 3514, 3538,
+     3546, 3545, 3537, 3550, 3551, 3557, 3554, 3594, 3583, 3558,
+     3574, 3587, 3599, 3592, 3596, 3600, 3608, 3668, 2416, 3602,
+     3603, 3628, 3613, 3660, 3653, 3657, 3659, 3695, 3656, 3646,
+     3612, 3664, 3670, 3672, 3674, 3677, 3685, 3684, 3701, 3734,
+     3744, 3709, 3713, 3714, 3720, 3722, 3762, 3731, 3726, 3737,
+
+     3755, 3746, 3759, 3739, 3748,  516, 3802, 3817, 3774, 3776,
+     3778, 3788,  550, 3800, 3791, 3785, 3798, 3806, 3804, 3813,
+     3821, 3809, 3826, 3830, 3839, 3820, 3832, 3832, 3842, 3844,
+     3846, 3845, 3851, 3852, 3858, 3870, 3861, 3863, 3882, 3871,
+     3899, 3875, 3893, 3886, 3900, 3903, 3898, 3910, 3911, 3917,
+     3924, 3934, 3904, 3958, 3943, 3912, 3954, 3956, 3967, 3947,
+     3953, 3966, 3957, 3962, 3965, 3976, 3969, 4041, 6744, 4035,
+     3985, 4008, 3994, 3997, 1878, 4001, 4057, 4027, 4019, 4016,
+     4014, 4018, 4028, 4031, 4036, 4040, 4042, 4056, 4068, 4039,
+     4034, 4078, 4080, 4064, 4070, 4137, 4142, 4065, 4101, 4138,
+
+     4071, 4072, 4088, 4110, 4127, 4124, 4123, 4118, 4135, 4136,
+     4140, 4138, 4146, 4145, 4144, 4147, 4152,  258, 6744, 4186,
+      419, 6744, 4142,  509,  721, 6744, 4144, 4183, 4158, 4164,
+     4221, 4223, 4181, 4188, 4194, 4230, 4192, 4202,    0, 4237,
+     4205, 4211, 4209, 4213, 4225, 4237, 4214, 4246, 4216, 4222,
+     4248, 4285, 4253, 4255, 4281, 4261, 4267, 4276, 4281, 4283,
+     4278, 4270, 4284, 4287, 4277, 4296, 4289, 4307, 4291, 4300,
+     4309, 4315, 4328, 4343, 4322, 4330, 4353, 4319, 4341, 4338,
+     4345, 4361, 4369, 4350, 4375, 4419, 4324, 4379, 4363, 2293,
+     4357, 4445, 4391, 4397, 4401, 4372, 4414, 4432, 4420, 4409,
+
+     4421, 4423, 4433, 4438, 4445, 4458, 4434, 4442, 4511, 6744,
+     4473, 4488, 4431, 4446, 4460, 4465, 4474, 4473, 4489, 4496,
+     4498, 4501, 4504, 4503, 4505, 4510, 4513, 1482, 1539, 4547,
+     4522, 4510, 4517, 4534, 4521, 4524,    0, 4527, 4537, 4556,
+     4543, 4550, 4557, 4555,  426, 1430, 4558, 4584, 4569, 4560,
+     4563, 4566, 4568,  123, 4571, 4560, 4578, 4581, 4591, 4604,
+     4616, 4589, 4601, 4628, 4602, 4614, 4610, 4611, 1496, 4612,
+     4613, 4620, 4667, 6744, 4686, 4634, 4621, 4646, 4620, 4645,
+     4656, 4662, 4659, 4659,  106, 4665, 4675, 4663, 4688, 4680,
+     4691, 4666, 4697, 4757, 4704, 4738, 4678, 4683, 4693, 4721,
+
+     4708, 4749, 4717, 4745, 4736, 4751, 4742, 4754, 4792, 4746,
+      539, 4761,  789, 4756, 4771, 4760, 4773, 4789, 3090, 4819,
+     4828, 4819, 4790, 4806,    0,   95, 6744, 4807, 4813, 4830,
+      896, 4814,  875, 4818, 4820, 3641, 4806, 4889, 4837, 4835,
+     4846, 4858, 4865, 4846, 4839, 4861,    0,   75, 4860, 4866,
+     4867, 4868, 4872, 4877, 4942, 4886, 4900, 4889, 4895, 6744,
+     4890, 6744, 4906, 4903, 4918, 4915, 4920, 4921, 4928, 1635,
+     4930, 1344, 4931, 4936, 4933, 4934, 4935, 4977, 6744, 4978,
+     4979, 4980, 6744, 4999, 4978, 4949, 4950,    0, 4966, 4968,
+     4994, 1417, 4395, 4971, 4974, 4969, 4980, 4974, 4986, 4996,
+
+     4995, 4990,    0, 5003, 4991, 5066, 5027, 5044, 5016, 5009,
+     5009, 5018, 5041, 5033, 5040, 5041, 5042, 5048, 5043, 5045,
+     5084, 6744, 5087, 1657, 5054, 1873, 5057, 1038, 5099,    0,
+     5074, 5067, 5073, 5074, 5091, 5075, 5139, 5081, 5165, 6744,
+     5113, 5119, 6744, 5088, 5086, 5088, 5107, 6744, 5116, 5136,
+     5117, 5134, 5119, 1917, 5115, 2126, 2313, 5163,    0, 5135,
+     5133, 5158, 5144, 5202, 5208, 5215, 5152, 1138, 5146, 5149,
+     1525, 1580, 5164, 5186, 5188, 2420, 5214, 5197, 5193, 5243,
+     5270, 5198, 5178, 5204, 6744, 6744, 5201, 1427, 5203, 5274,
+     5214, 6744, 5213, 5280, 5284, 5259, 6744, 5263, 5254, 5251,
+
+     5260, 5256, 5264, 6744, 5340, 5356, 5372, 5388, 5404, 5420,
+     5436, 5452, 5468, 5478, 5493, 5503, 5512, 5527, 5543, 5559,
+     5569, 5577, 5585, 5593, 5607, 5623, 5639, 5655, 5671, 5687,
+     5703, 5713, 5721, 5729, 5743, 5759, 5775, 5791, 5807, 5823,
+     5839, 5855, 5871, 5881, 5890, 5899, 5913, 5929, 5939, 5948,
+     5957, 5966, 5975, 5990, 6006, 6022, 6038, 6048, 6057, 6065,
+     6073, 6087, 6103, 6119, 6135, 6151, 6167, 6183, 6199, 6215,
+     6231, 6247, 6263, 6279, 6295, 6306, 6314, 6322, 6336, 6352,
+     6368, 6384, 6400, 6416, 6432, 6448, 6464, 6474, 6483, 6497,
+     6507, 6516, 6525, 6540, 6556, 6572, 6588, 6604, 6620, 6636,
+
+     6651, 6659, 6668, 6682, 6697, 6711, 6724, 6729
+    } ;
+
+static yyconst flex_int16_t yy_def[1409] =
+    {   0,
+     1304,    1, 1305, 1305, 1306, 1306, 1307, 1307, 1308, 1308,
+     1309, 1309, 1310, 1310, 1311, 1311, 1304, 1304, 1304, 1304,
+     1304, 1312, 1313, 1314, 1304, 1315, 1316, 1317, 1314, 1314,
+     1314, 1317, 1317,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   43,   33,   33,   33,   33,   33,
+       38,   33, 1314, 1318, 1304, 1304, 1318, 1304, 1319, 1320,
+     1320, 1321, 1304, 1304, 1304, 1322, 1323, 1324, 1325, 1325,
+     1326, 1326, 1304, 1327, 1328, 1329, 1330, 1331, 1304, 1332,
+     1333, 1334, 1304, 1304, 1304, 1304, 1335, 1304, 1336, 1337,
+     1304, 1304, 1338, 1304, 1339, 1340, 1304, 1341, 1342, 1343,
+
+     1341, 1344, 1345, 1346, 1347, 1304, 1348, 1349, 1350, 1351,
+     1352, 1353, 1304, 1353, 1344, 1352, 1353,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+      117,  117,  117,  117,  117,  117,  117, 1354, 1304, 1354,
+     1355, 1356, 1354, 1304, 1357, 1357, 1304, 1304, 1357, 1357,
+     1304, 1304, 1358, 1304, 1304, 1359, 1360, 1361, 1362, 1363,
+     1364, 1365, 1362, 1363, 1304, 1366, 1367, 1368, 1369, 1370,
+     1371, 1372, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1304,
+     1304, 1304, 1304, 1379, 1304, 1380, 1381, 1382, 1383, 1384,
+     1304, 1385, 1386, 1386, 1387, 1387, 1388, 1389, 1390, 1304,
+     1391, 1392, 1392, 1393, 1304, 1304, 1393,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297, 1304, 1304, 1304, 1394, 1395, 1396, 1304, 1397, 1304,
+     1304, 1304, 1379, 1304, 1379, 1304, 1304, 1304,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297, 1304, 1304,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297, 1304,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297, 1304, 1398, 1399,
+     1400, 1304, 1304,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297, 1304, 1304, 1304, 1304, 1304, 1304,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297, 1304, 1304,  297,  297,  297,  297,  297, 1401,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297, 1402,  297,  297,  297,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297, 1304,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297, 1402,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297, 1304, 1304, 1402,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297, 1304, 1304,  297,
+      297,  297,  297,  297,  297,  297,  297, 1304,  297,  297,
+      297,  297,  297,  297,  297,  297,  297, 1304, 1304, 1304,
+     1304,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297, 1401, 1401, 1401,  297,  297,
+      297,  297, 1304,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297, 1402,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297, 1304,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297, 1402,  297,  297,  297,  297, 1402,  297,
+      297,  297,  297,  297,  297,  297,  297, 1304, 1304, 1402,
+      297,  297,  297,  297, 1304, 1304, 1304,  297,  297,  297,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297, 1304, 1304,  297,  297, 1402,
+
+      297,  297,  297, 1304, 1304, 1304, 1304, 1304,  297,  297,
+      297,  297,  297,  297,  297,  297, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304,  297,  297,  297,
+     1304,  297,  297,  297,  297,  297,  297,  297, 1403, 1401,
+      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
+      297,  297,  297,  297, 1402,  297,  297,  297,  297,  297,
+      297,  297,  297,  297, 1304,  297,  297,  297,  297,  297,
+      297,  297,  297,  297,  297,  297, 1402,  297,  297,  297,
+      297, 1402,  297,  297,  297,  297,  297,  297,  297, 1304,
+     1304, 1304,  297,  297,  297, 1304,  297,  297,  297,  297,
+
+      297,  297,  297,  297,  297,  297,  297,  297, 1304, 1304,
+      297, 1402, 1304, 1304, 1304, 1304, 1304, 1304,  297,  297,
+      297,  297,  297,  297,  297, 1304, 1304, 1304, 1304,  297,
+      297, 1304,  297,  297,  297,  297, 1403,  297,  297,  297,
+      297,  297,  297,  297, 1304, 1304,  297, 1402,  297,  297,
+      297,  297,  297, 1404,  297, 1304,  297,  297,  297,  297,
+     1402,  297,  297, 1402,  297,  297,  297,  297, 1402,  297,
+      297,  297, 1304, 1304, 1402,  297,  297,  297, 1304,  297,
+      297,  297, 1304,  297, 1405,  297,  297,  297,  297,  297,
+      297,  297,  297, 1304,  297, 1402, 1304, 1304, 1304, 1304,
+
+     1304, 1304, 1304,  297,  297,  297,  297,  297, 1304, 1304,
+     1304,  297, 1304,  297,  297,  297,  297,  297, 1304, 1304,
+     1304, 1402,  297,  297, 1404, 1404, 1304,  297,  297, 1402,
+     1402,  297, 1406,  297,  297, 1304, 1304, 1304,  297,  297,
+     1304,  297,  297,  297, 1304,  297, 1405, 1405,  297,  297,
+      297,  297,  297,  297, 1304,  297, 1402, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304,  297,  297,  297,  297, 1304,
+      297, 1304,  297,  297,  297,  297,  297, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1402,  297,  297, 1404,  297,  297,
+     1402, 1406, 1406,  297,  297, 1304,  297, 1304,  297,  297,
+
+     1304,  297, 1405,  297,  297, 1407,  297, 1402, 1304, 1304,
+     1304, 1304, 1304, 1304,  297,  297,  297,  297,  297,  297,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1402, 1402, 1408,
+      297, 1304,  297, 1304,  297, 1304,  297,  297, 1304, 1304,
+      297, 1402, 1304, 1304, 1304, 1304, 1304, 1304,  297,  297,
+      297,  297,  297, 1304, 1304, 1304, 1304, 1402, 1408,  297,
+     1304,  297, 1304,  297, 1304, 1304,  297, 1402, 1304, 1304,
+     1304, 1304,  297,  297,  297, 1304, 1402, 1304,  297, 1304,
+     1304,  297, 1304, 1304, 1304, 1304,  297, 1402, 1304,  297,
+      297, 1304, 1304, 1304, 1304,  297, 1304,  297,  297,  297,
+
+      297,  297,  297,    0, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304
+    } ;
+
+static yyconst flex_int16_t yy_nxt[6829] =
+    {   0,
+       18,   19,   20,   19,   19,   21,   22,   23,   24,   25,
+       26,   19,   19,   24,   19,   24,   24,   27,   28,   28,
+       28,   28,   28,   18,   19,   29,   30,   31,   24,   18,
+       32,   33,   34,   35,   36,   37,   38,   39,   40,   41,
+       42,   43,   44,   45,   46,   47,   41,   48,   49,   50,
+       51,   41,   52,   41,   41,   41,   53,   32,   33,   34,
+       35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
+       45,   46,   47,   41,   48,   49,   50,   51,   41,   52,
+       41,   41,   41,   18,   55,   56,   57,   55,  275,   58,
+       94,  275, 1203,   59,   55,   56,   57,   55,  103,   58,
+
+       97,   95,  114,   59,   18,   60,   61,   60,   60,   18,
+       18,  104, 1188,   18,   18,   63,   63,  106,   63,   70,
+       71,   72,   73, 1148,  107,   74,  105,   18,   63,  114,
+      109,  103,  103,   18,  290,   75,   70,   71,   72,   73,
+     1126,   76,   74,  104,  104,  104,   77,   78,   84,   79,
+       84,   84,   75,   85,  282,  769,   93,   85,   76,  229,
+      281,  229,  229,   77,   78,   86,   86,   86,   86,   86,
+       88,   79,   79,   88,  229,   89,  230,  229,  105,   90,
+      245,   97,  245,  245,  618,  468,  290,   18,   18,   60,
+       61,   60,   60,   18,   18,  103,  104,   18,   18,   63,
+
+       63,  103,   63,  109,   84,   79,   84,   84,  104,   85,
+      305,   18,   63,   85,  104,  104,  104,   18,  114,  306,
+      104,   86,   86,   86,   86,   86,   88,   79,   79,   88,
+       91,   89,   91,   91,  103,   90,  466,  305,  114,  114,
+       91,   91,  114,   91,  115,  114,  306,  104,  275,  232,
+      232,  275,  232,   91,  232,  464,  461,  255,  233,  255,
+      255,  270,  918,  270,  270,  114,  114,  250,  250,  114,
+      919,   18,   18,   64,   65,   64,   64,   18,   66,  157,
+      460,   18,   68,   18,   18,  458,   18,  254,  257,  254,
+      255,  116,  103,  158,  258,   18,   18,  277,  159,  114,
+
+      277,   18,  274,  114,  104,  104,  157,  114,  183,  251,
+      250,  250,  304,  114,  251,  250,  114,  184,  185,  114,
+      158,   97,  307,  186,  114,  159,  114,  250,  250,   93,
+      114,  260,  250,  281,  114,  183,  250,  261,  279,  304,
+      114,  279,  250,  114,  184,  185,  114,  274,  251,  307,
+      186,  114,  454,  250,  252,   18,   18,   64,   65,   64,
+       64,   18,   66,  453,  452,   18,   68,   18,   18,  320,
+       18,  114,  303,  114,  167,  282,  187,  168,  298,   18,
+       18,  169,  226,  355,  188,   18,  114,  114,  189,  114,
+      227,  114,  329,  114,  114,  114,  320,  114,  114,  303,
+
+      114,  167,  114,  187,  168,  298,  114,  114,  169,  226,
+      355,  188,  104,  114,  114,  189,  114,  227,  114,  329,
+      114,  114,  114,  921,  114,  235,  236,  235,  235,  114,
+     1045,  922,  296,  114,  114,  237,  237, 1046,  238,   18,
+       18,   18,   79,   18,   18,   18,   80,  104,  237,   18,
+       82,   18,   18,  197,   18,  302,  198,  199,  263,  263,
+      263,  263,  263,   18,   18,  239,  240,  239,  239,   18,
+      333,  200,  114,  114,  114,  241,  241,  114,  242,  106,
+      197,  104,  302,  198,  199,  250,  250,  330,  241,  114,
+      250,  114,  238,  244,  238,  238,   94,  333,  200,  114,
+
+      114,  114,  238,  238,  114,  238,  265,  273,  273,  273,
+      273,  273,  266,  921,  330,  238,  114,  806,  114,  114,
+      806,  922,  369,   18,   18,   18,   79,   18,   18,   18,
+       80,  251,   92,   18,   82,   18,   18,  299,   18,  253,
+      250,  254,  255, 1111,  300,  250,  114,   18,   18,  369,
+      488,  813,  114,   18,  813,  250,  271, 1304,  271,  271,
+      114,  251, 1304,  342,  299,  114,  250,  252,  272,  272,
+      272,  300, 1304,  272,  272,  272,  272,  272,   91,  114,
+       91,   91,  293,  293,  293,  293,  293,  114,   91,   91,
+      342,   91,  114,  104, 1304,  229,  114,  229,  229,  301,
+
+      229,   91,  230,  229, 1304, 1304,  114,   18,   96,   96,
+       97,   96,   96,   96,   96,  114, 1304,   96,   96,   96,
+       96,  308,   96,  114,   99,  309,  301,  114,  317,  310,
+      311,   96,   96,  114,  312,  331, 1304,  100,  313,  315,
+      114, 1304,  114,  318,  314,  114,  316,  114,  308,  114,
+      327,  114,  309,  384,  114,  317,  310,  311,  114,  328,
+      114,  312,  331,  319,  101,  313,  315,  114,  332,  114,
+      318,  314,  114,  316,  114, 1304,  114,  327,  114, 1304,
+      384,  245,  335,  245,  245,  114,  328,  114,  114,  334,
+      319,   96,  110,  110,  343,  332,  114,  114,  110,  114,
+
+      110,  111,  110,  112,  112,  112,  112,  112,  113,  335,
+      110,  110,  110,  110,  104,  114,  334,  114,  341,  348,
+      114,  343,  114, 1304,  114,  925,  114, 1304,  352,  114,
+      376,  232,  232,  926,  232,  255,  232,  255,  255,  321,
+      233,  110,  110,  110,  114,  341,  348,  114,  110,  114,
+      110,  116,  110, 1304,  322,  352,  114,  114,  113,  323,
+      110,  110,  110,  110,  104,  324,  321,  117,  118,  806,
+      345,  325,  806,  344,  114,  326,  119,  114,  120,  114,
+      121,  322,  122,  123,  114,  808,  323,  114,  420,  356,
+     1172,  110,  324, 1172,  117,  118,  114,  345,  325,  357,
+
+      344,  114,  326,  119,  114,  120,  114,  121, 1304,  122,
+      123,  110,  110,  114,  114,  420,  356,  110,  438,  110,
+      116,  110,  346,  114,  336,  347,  357,  113,  337,  110,
+      110,  110,  110,  104,  124,  338,  339,  358,  114,  114,
+      114,  279,  340,  114,  279,  438,  353,  114,  354,  346,
+      465,  336,  347,  114,  125,  337,  365, 1304,  126, 1304,
+      110,  124,  338,  339,  358,  114,  114,  399,  349,  340,
+      114,  114,  350,  353,  114,  354, 1192,  359,  114, 1192,
+      114,  125,  351,  365,  366,  126,  114,  114,  367,  431,
+      127,  114,  114,  128,  399,  349,  114,  129,  114,  350,
+
+      130,  131,  380,  132,  359,  114,  114,  114,  114,  351,
+      133,  366,  116,  114,  114,  367,  431,  127,  114,  114,
+      128,  368,  114,  114,  129,  104,  370,  130,  131,  380,
+      132, 1304,  371,  114,  114,  114,  381,  133,  134,  372,
+      382,  114,  135,  388,  373,  114,  136,  114,  368,  114,
+      374,  137,  138,  370,  375,  444,  114,  435,  114,  371,
+      139, 1304,  114,  381,  114,  134,  372,  382,  114,  135,
+      388,  373,  114,  136,  114, 1304, 1304,  374,  137,  138,
+     1304,  375,  444,  114,  435,  114, 1304,  139,  360,  114,
+      114,  114,  140,  451,  361,  114,  377,  383,  114,  385,
+
+      362,  141,  378,  142,  363,  114,  143,  364,  379,  114,
+      114,  144,  386,  145,  114,  360, 1304,  114,  387,  140,
+      451,  361,  114,  377,  383,  114,  385,  362,  141,  378,
+      142,  363,  114,  143,  364,  379,  114,  114,  144,  386,
+      145,  114,  146,  389,  402,  387,  390,  391,  392,  395,
+      147,  114,  114,  393,  116,  114,  148,  394,  114,  149,
+      150,  151,  114,  114,  114,  114,  114,  104, 1304,  146,
+      389,  402, 1304,  390,  391,  392,  395,  147,  114,  114,
+      393,  401,  114,  148,  394,  114,  149,  150,  151,  114,
+      114,  114,  114,  114,  114,  152,  396,  114,  397,  398,
+
+      114,  400,  153,  430,  114,  114,  114,  419,  401,  154,
+      411,  155,  114,  156,  114,  114,  415,  270,  114,  270,
+      270,  114,  152,  396,  114,  397,  398,  114,  400,  153,
+      430,  114,  114,  114,  419,  114,  154,  411,  155,  114,
+      156,  114,  114,  415,  412,  114,  114,  441,  160,  161,
+     1304,  162,  163,  421,  116,  413,  436,  114,  164,  165,
+     1304,  414,  114,  114,  166, 1304,  114,  104,  416, 1304,
+      114,  412,  114,  114,  441,  160,  161,  417,  162,  163,
+      421,  114,  413,  436,  114,  164,  165,  418,  414, 1304,
+      114,  166,  424,  114,  429,  416,  432,  114,  114,  114,
+
+      114,  170,  171,  422,  417,  439,  425,  423,  114,  114,
+      172,  114,  173,  114,  418,  114,  440,  174,  114,  424,
+      114,  429,  114,  432, 1304,  114, 1304,  114,  170,  171,
+      422, 1304,  439,  425,  423, 1304,  114,  172,  114,  173,
+      114, 1304,  114,  440,  174,  114, 1304,  114,  433,  114,
+      175,  176,  434,  177,  178,  426,  427,  442,  179,  437,
+      114,  443,  180,  445,  181,  474,  428,  114,  114,  114,
+      114,  114,  511,  114,  182,  433, 1304,  175,  176,  434,
+      177,  178,  426,  427,  442,  179,  437,  114,  443,  180,
+      445,  181,  474,  428,  114,  114,  114,  114,  114,  511,
+
+      114,  182,  190,  114,  449,  446,  191,  475,  192,  447,
+      193,  114,  470,  448,  450,  114,  194,  195,  277,  196,
+     1304,  277,  114,  463,  114,  254,  114,  254,  255,  190,
+      114,  449,  446,  191,  475,  192,  447,  193,  114,  470,
+      448,  450,  114,  194,  195, 1172,  196,  251, 1172,  114,
+      114,  114,  114,  114,  114,  114,  472,  242,  201,  242,
+      242,  202,  203,  476,  471,  204,  205,  242,  242,  206,
+      242,  114,  207,  208,  209,  480,  210,  114,  211,  114,
+      242,  114,  114,  472,  242,  201,  242,  242,  202,  203,
+      476,  471,  204,  205,  242,  242,  206,  242,  114,  207,
+
+      208,  209,  480,  210,  114,  211,  212,  242,  213,  240,
+      240,  240,  240,  214,  215,  250,  250,  216, 1192,  217,
+      218, 1192, 1304, 1304,  250,  250,  114,  455,  455,  250,
+      219,  114,  114,  212, 1119,  213,  257, 1304, 1304,  250,
+      214,  215,  258,  116,  216,  251,  217,  218,  258, 1120,
+      250,  252, 1121,  114,  258, 1304,  104,  219,  114,  114,
+      220,  253,  250,  254,  255,  221,  114,  250, 1304,  482,
+      222,  477,  223,  114,  224,  225,  114,  250,  273,  273,
+      273,  273,  273,  251, 1304,  114,  921,  220,  250,  252,
+      250,  250,  221,  114,  922,  250,  482,  222,  477,  223,
+
+      114,  224,  225,  114,   96,   96,   97,   96,   96,   96,
+       96,  265,  116,   96,   96,   96,   96,  266,   96, 1133,
+       99,  235,  236,  235,  235,  104, 1285,   96,   96, 1285,
+      114,  237,  237,  100,  238,  239,  240,  239,  239,  238,
+      244,  238,  238,  925,  237,  241,  241, 1304,  242,  238,
+      238,  926,  238,  238,  244,  238,  238,  114,  241,  114,
+      101, 1304,  238,  238,  238, 1304,  238,  263,  263,  263,
+      263,  263,  239,  240,  239,  239,  238, 1304,  458, 1304,
+      114, 1286,  241,  241, 1286,  242,  114,   96,   96,   96,
+       97,   96,   96,   96,   96,  241, 1304,   96,   96,   96,
+
+       96,  114,   96,  242,  473,  242,  242,  114,  491,  478,
+      114,   96,   96,  242,  242,  114,  242,  100, 1304,  250,
+      250, 1304,  455,  455,  250, 1304,  242,  455,  114,  455,
+      455,  473,  524,  114,  455,  491,  478,  114, 1304,  918,
+      260, 1304,  114,  261,  284,  250,  261,  919,  455,  261,
+      266,  293,  293,  293,  293,  293,  266, 1304, 1304,  524,
+      114, 1224,  104,  296,  467,  467,  467,  467,  467, 1179,
+     1304,   96,   96,   96,   97,   96,   96,   96,   96, 1304,
+      114,   96,   96,   96,   96,  271,   96,  271,  271,  114,
+      483, 1304,  479, 1304,  114,   96,   96,  272,  272,  272,
+
+      481,   96,  272,  272,  272,  272,  272,  114,  114, 1304,
+     1304,  114,  462,  114,  462,  462,  114,  483,  486,  479,
+      521,  114, 1304, 1304,  272,  272,  272,  481,  286,  272,
+      272,  272,  272,  272, 1304,  114,  114,  114,  114, 1304,
+      114, 1304,  484,  487,  490,  486,  495,  521,  485,  114,
+      488,  114, 1304, 1304,  492,   96,   96,   96,   97,   96,
+       96,   96,   96,  114,  114,   96,   96,   96,   96,  484,
+       96,  490,   99,  495, 1304,  485,  114,  114,  114,   96,
+       96,  492,  114,  494,  496,  100,  493,  497,  499,  489,
+      498,  114,  114,  114,  114,  114,  114,  114,  503,  114,
+
+      500,  504,  114,  501,  114,  502,  560,  114,  114,  114,
+      494,  496,  101,  493,  497,  499,  489,  498,  114,  114,
+      114,  114,  114,  114,  114,  503,  114,  500,  504,  114,
+      501, 1304,  502,  560,  114,  114,  505,  571,  114,   96,
+      110,  110,  114,  506,  114,  512,  110,  507,  110,  111,
+      110,  294,  294,  294,  294,  294,  295,  114,  110,  110,
+      110,  110,  104,  505,  571,  114,  114,  509, 1304,  114,
+      506,  114,  512, 1304,  507,  114,  513, 1226,  515,  877,
+      508,  877,  877, 1304,  114, 1183,  114,  516,  510,  110,
+      110,  110,  114,  114,  509,  114,  110,  114,  110,  116,
+
+      110,  514,  114,  513,  114,  515,  113,  508,  110,  110,
+      110,  110,  104,  114,  516,  510,  519,  518, 1304,  114,
+      517, 1254,  114, 1304,  114,  114,  114,  114,  514, 1222,
+      114,  114,  623,  623,  623,  623,  623,  522,  520,  110,
+      110,  110, 1304,  519,  518,  114,  110,  517,  110,  116,
+      110,  525,  114,  114,  114, 1304,  113,  114,  110,  110,
+      110,  110,  104,  114,  522,  520,  114,  114,  114,  114,
+      523,  527,  114,  526,  529,  114,  531,  535,  525,  114,
+      528,  114,  297, 1304,  114, 1304,  530, 1304,  532,  110,
+      114,  575, 1304,  114,  114,  114,  114,  523,  527, 1304,
+
+      526,  529,  114,  531,  535,  576,  114,  528,  114,  297,
+      403,  114,  404,  530,  114,  532,  405,  114,  575,  550,
+      533,  542,  406,  114,  534,  407,  408,  114,  409,  410,
+     1304,  663,  576,  663,  663, 1304,  664,  403,  114,  404,
+     1304,  114, 1304,  405,  114,  536,  550,  533,  542,  406,
+      114,  534,  407,  408,  114,  409,  410,   96,   96,   97,
+       96,   96,   96,   96, 1304,  114,   96,   96,   96,   96,
+      537,   96,  536,  538,  114,  114,  114,  540,  114,  539,
+       96,   96,  543,  544,  114,  114,  100,  545,  114,  114,
+      541,  114,  553,  114,  547,  114,  551,  537,  114,  546,
+
+      538,  114,  114,  114,  540,  114,  539,  548, 1304,  543,
+      544,  114,  114,  284,  545,  114,  114,  541,  114,  553,
+      114,  547,  114,  551, 1304,  114,  546,  114, 1304,  114,
+     1224,  554,  549,  114,  548,  114,  552,  555, 1179, 1304,
+       96,   96,   96,   97,   96,   96,   96,   96, 1304,  557,
+       96,   96,   96,   96,  114,   96,  114,  114,  554,  549,
+      114, 1304,  114,  552,   96,   96,  114,  556,  114,  561,
+      100,  114,  114,  558,  114,  562,  565,  114,  559,  114,
+      114,  114,  564,  114,  114,  563,  114,  568,  566,  574,
+     1304,  567,  114,  114,  556,  114,  561,  284,  114,  114,
+
+      558,  114,  562,  565,  114,  559,  114,  114,  114,  564,
+      114, 1304,  563,  114,  568,  566,  574,  114,  567,  114,
+      577, 1304, 1304,  586,   96,   96,   96,   97,   96,   96,
+       96,   96,  114,  114,   96,   96,   96,   96,  569,   96,
+      114,  573,  114,  572,  114,  578,  114,  577,   96,   96,
+      114,  570,  114,  114,   96,  114,  579,  582,  585,  114,
+      114,  580,  581,  114,  114,  569,  114,  114,  573,  114,
+      572,  587,  578,  114, 1304,  589, 1304,  114,  570,  114,
+      114,  286,  114,  579,  582,  585, 1304, 1304,  580,  581,
+      114,  114, 1304,  114,  992,  114,  992,  992,  587,  588,
+
+      114,  583,  589,  114,  584, 1304, 1304,  590,   96,   96,
+       96,   97,   96,   96,   96,   96,  592, 1226,   96,   96,
+       96,   96,  114,   96,  114, 1183,  588,  114,  583,  591,
+      114,  584,   96,   96,  590,  114,  114,  593,   96,  114,
+      114,  597,  598,  592,  114,  594,  596,  595,  114,  114,
+      114,  114,  600,  602,  603,  114,  591,  599,  114,  114,
+      601,  114,  114,  114,  593,  286,  114,  114,  597,  598,
+      114,  114,  594,  596,  595,  114,  114,  114, 1304,  600,
+      602,  603,  114,  607,  599,  114,  114,  601,  114,  612,
+      114,  114,   96,  110,  110,  604,  605,  114,  114,  110,
+
+     1304,  110,  111,  110,  294,  294,  294,  294,  294,  113,
+      607,  110,  110,  110,  110,  104,  612,  114,  114, 1304,
+      608,  114,  604,  605, 1254,  114, 1304,  606,  114,  609,
+      114,  114, 1222,  114,  897,  897,  897,  897,  897,  613,
+      114,  114,  110,  110,  110,  610,  611,  608,  114,  110,
+     1304,  110,  116,  110,  606,  114,  609,  114,  114,  113,
+      114,  110,  110,  110,  110,  104,  613,  114,  114,  114,
+      114,  114,  610,  611,  469,  615,  617,  114,  614,  455,
+      455,  114,  616, 1304,  114, 1304,  455,  455, 1304,  455,
+      455,  455,  110, 1304,  455,  626,  114,  114,  114,  114,
+
+      258,  469,  615,  617,  114,  614,  619,  261,  114,  616,
+      266,  114,  455,  620,  114,  462,  621,  462,  462,  629,
+      114,  632,  626,  114,  114,  627,  114,  622,  622,  622,
+      624,  114,  622,  622,  622,  622,  622,  625,  630, 1304,
+      114,  114, 1304,  114,  631,  628,  629,  114,  632,  634,
+      114,  114,  627,  114,  114,  633,  114,  624,  114,  639,
+      635,  638,  640,  114,  625,  630,  114,  114,  114,  114,
+      114,  631,  628,  641,  636, 1304,  634,  114,  637, 1304,
+      114,  114,  633,  114,  114,  487,  639,  635,  638,  640,
+      114,  114,  488,  114,  649,  114,  114,  114,  644,  650,
+
+      641,  636,  642,  114,  114,  637,  645,  114,  651,  652,
+      114,  114,  114,  114,  658, 1304,  653, 1304,  114, 1304,
+      114,  649,  114,  114,  114,  114,  650,  656,  655,  642,
+      114,  643,  654,  114,  114,  651,  652,  114,  657,  114,
+      114,  658,  646,  653,  647,  114,  648,  114,  114,  114,
+      114,  659,  114,  114,  656,  655,  660,  114,  643,  654,
+      114,  114, 1304, 1304,  114,  657,  114,  668,  661,  646,
+      114,  647,  114,  648, 1304,  114,  667,  662,  659, 1304,
+      114,  666,  114,  660,  114, 1304,  670,  663,  114,  663,
+      663,  114,  664,  114,  668,  661,  669,  114,  671,  114,
+
+      114,  114, 1304,  667,  662,  672,  114,  673,  666,  114,
+      674,  114,  114,  114,  114,  676,  114,  679, 1304,  114,
+      675,  677,  114,  669,  114,  671,  114,  114,  114,  678,
+      114,  114,  672,  114,  673, 1304,  665,  674,  114,  114,
+      114,  114,  676,  114,  679,  114,  114,  675,  677,  114,
+      114,  114,  114,  680,  681,  683,  678,  114,  114,  114,
+      684,  686,  114,  665,  682,  685,  687,  114,  114,  114,
+      114, 1304,  114,  114, 1304,  691,  692,  114, 1304,  114,
+      680,  681,  683,  688,  689,  693,  114,  684,  686,  114,
+      690,  682,  685,  687,  114,  114,  114,  114,  114,  695,
+
+      114,  114,  691,  692,  696,  114,  114,  114,  114,  698,
+      114,  699,  697,  114,  703,  701,  114,  690,  694,  114,
+      114,  702,  700,  114,  114,  114,  695,  704,  114,  114,
+      555,  696,  114,  114,  114,  114,  698,  114,  699,  697,
+      114,  703,  701,  114,  114,  694,  114,  114,  702,  700,
+      114,  114,  114,  705,  704,  114,  114,  114,  114,  706,
+      707,  114,  712,  708,  713,  709,  714,  114,  114,  710,
+      715,  114,  716,  114,  718,  114, 1304,  114,  717,  114,
+      705, 1304,  114,  711,  114,  114,  706,  707,  114,  712,
+      708,  713,  709,  714,  114,  114,  710,  715,  114,  716,
+
+      114,  718,  114,  114,  114,  717,  114,  719,  722,  720,
+      711,  114,  114,  114,  723,  114, 1304, 1304,  721,  114,
+      727,  731,  729,  726,  725,  114,  114, 1304,  114,  114,
+      114,  730, 1304,  114,  719,  722,  720,  114,  114,  114,
+      114,  114,  114,  724,  728,  721,  114,  727,  731,  729,
+      726,  725,  114,  114,  733,  114,  114,  732,  730,  735,
+      114,  114,  114,  114,  114,  736,  734,  114,  114,  114,
+      724,  728,  114,  114,  738, 1304,  114, 1304,  114,  114,
+      114,  733,  737,  114,  732,  114,  735,  114,  114,  114,
+      114,  742,  736,  734,  114,  739,  114,  740,  741,  114,
+
+      114,  738,  749,  114,  743,  114,  114,  114,  114,  737,
+      114,  745,  114,  745,  745,  114,  746,  114,  742,  750,
+      744,  757,  739,  114,  114,  114, 1304,  754, 1304,  749,
+      751,  743,  114,  114,  752,  114,  747,  753,  114,  114,
+      114,  114,  114, 1304,  114,  755,  750,  744,  114,  756,
+      114,  114,  114,  114,  754,  748,  758,  751,  114,  114,
+      114,  752, 1304,  760,  753,  114,  114,  114,  114,  114,
+      759,  766,  755,  761,  762,  114,  756,  767,  114,  114,
+      114,  114,  748,  758,  763,  114,  764,  114,  114,  114,
+      760, 1304,  765, 1304, 1119,  771,  114,  759,  766,  114,
+
+      761,  762,  114, 1304,  767,  114,  114,  770,  114, 1120,
+     1304,  763, 1121,  764,  114,  114,  114,  114,  768,  765,
+      768,  768,  771,  775,  772, 1304,  114,  773,  776,  114,
+      622,  622,  622,  114,  770,  622,  622,  622,  622,  622,
+      114,  114,  774,  777,  114,  778,  114,  114,  778,  780,
+      775,  772,  114,  114,  773,  776,  114,  114,  114,  785,
+      114,  114,  114,  787,  782, 1304,  781,  114,  783,  774,
+      777,  786,  784,  114,  114,  788,  780,  114, 1304,  114,
+      114,  789,  114,  114,  114,  114,  785,  790,  114,  114,
+      787,  782,  779,  781,  791,  783,  114,  644,  786,  784,
+
+      114,  793,  788,  792,  114,  645,  114,  114,  789,  114,
+      114,  114,  114, 1304,  790,  795, 1304,  794, 1304,  779,
+     1304,  791,  114,  114,  797,  796,  114,  114,  793,  114,
+      792,  114,  114,  114,  114,  798,  114,  114,  114,  114,
+      799,  646,  795,  647,  794,  648,  800,  114,  804,  114,
+      114,  797,  796,  114,  114,  801,  114,  114,  114,  114,
+      114,  805,  798,  114,  114,  802,  114,  799,  646,  114,
+      647,  803,  648,  800,  114,  804,  809,  114,  114, 1304,
+      810,  114,  801,  811,  114,  812,  114,  114,  805,  114,
+      821,  114,  802,  114,  813,  814,  114,  813,  803,  114,
+
+      815, 1304,  816,  809, 1304,  114,  114,  810,  114,  818,
+      811,  817,  812,  114,  114,  114,  114,  821,  114,  114,
+      114,  114,  814,  822,  820,  114,  114,  815,  819,  816,
+      114,  114, 1304,  114, 1304,  114,  818,  823,  817,  114,
+      114,  114,  114,  826,  830,  114,  114,  114,  114,  116,
+      822,  820,  114,  824, 1304,  819,  114,  114,  114,  825,
+      114,  828,  104,  829,  823,  114,  114,  114,  827,  114,
+      826,  830,  835,  114,  114,  833, 1304,  114,  831,  114,
+      824,  114,  114,  114,  839,  840,  825,  114,  828,  832,
+      829,  838,  114,  834,  836,  827,  114, 1304,  114,  835,
+
+      114,  114,  833,  114,  114,  831,  114,  114,  114,  114,
+      842,  839,  840,  114,  837,  114,  832,  114,  838,  841,
+      834,  836,  114,  844,  114,  114,  843,  845,  114,  114,
+      114,  114,  847,  846,  114,  114,  850,  842,  848,  851,
+      114,  837,  114,  849,  114,  114,  841,  114, 1304,  114,
+      844,  114,  114,  843,  845,  114,  114,  855,  114,  847,
+      846,  852,  114,  850,  116,  848,  851,  114,  114,  856,
+      849,  114,  114,  114,  114,  858,  114,  104,  853,  114,
+      114, 1304,  857,  114,  855,  859,  861,  114,  852, 1304,
+      114,  114,  854, 1304,  114,  114,  856,  114,  114,  862,
+
+      114,  114,  858,  114,  114,  853,  863,  114,  114,  857,
+      114,  860,  865,  861,  114,  864,  114,  114,  114,  854,
+      114,  114,  114,  114,  114, 1304,  862,  866,  114, 1304,
+      114,  114,  867,  863,  873,  114, 1304,  114,  860,  865,
+      874, 1304,  864,  114, 1304, 1304,  879,  114,  114,  114,
+      114, 1304,  114,  868,  866,  868,  868,  114,  869,  867,
+      745,  873,  745,  745,  114,  746,  877,  874,  877,  877,
+     1304,  114,  880,  879, 1304,  114,  114, 1304,  870,  114,
+      878,  116,  881,  114,  114,  875,  883,  882,  114,  114,
+      114,  884,  114,  871,  104,  114,  890,  872,  114,  880,
+
+     1304,  885,  114,  114,  876, 1304,  886,  878,  891,  881,
+      114,  114,  114,  883,  882,  114,  114,  114,  884,  114,
+      871,  114,  114,  890,  872,  114,  887,  889,  885,  892,
+      114,  876,  114,  886,  893,  891,  888,  114,  114,  114,
+      114,  114, 1138,  894, 1138, 1138,  114,  899,  114, 1304,
+      114,  114,  114,  887,  889, 1304,  892,  114,  895,  114,
+     1304,  893, 1304,  888,  114,  114,  114,  114,  114,  768,
+      894,  768,  768,  114,  899,  900,  898,  114,  114,  902,
+      910,  896,  896,  896,  114,  895,  896,  896,  896,  896,
+      896,  114,  903,  114,  114,  114,  778,  114,  114,  778,
+
+      901, 1304,  114,  898,  912,  918,  909,  910,  114,  911,
+      114,  114,  914,  919,  917,  114, 1304,  913,  114,  903,
+     1304,  114,  114,  114,  114,  114,  915,  901,  904,  114,
+      905,  912,  906,  909,  916,  114,  911,  114,  921,  914,
+      907,  917,  114,  908,  913,  928,  922,  114,  925,  920,
+      114,  114,  114,  915, 1304,  904,  926,  905,  114,  906,
+      114,  916,  929,  931,  934,  933,  931,  907,  923,  114,
+      908,  930,  928, 1304,  114,  114,  920,  114,  114,  114,
+      936,  924,  927, 1304,  114,  114,  114,  114,  938,  929,
+      937,  934,  933,  114, 1304,  923,  114,  114,  930, 1304,
+
+      114, 1304,  114, 1304,  114,  935, 1304,  936,  924,  927,
+      932,  114,  114,  114,  114,  938,  114,  937, 1304, 1304,
+      114, 1304,  941,  114,  114,  942,  114,  114,  943,  114,
+      945,  939,  935,  946,  940,  944,  114,  932,  114,  114,
+      947,  114,  114,  114,  114,  948,  939,  950,  116,  941,
+      114,  114,  942,  114,  949,  943,  114,  945,  954,  114,
+      946,  104,  944,  114,  114,  114,  952,  947,  114,  114,
+      114,  114,  948,  953,  950,  951,  955,  114,  114,  956,
+      114,  949,  114,  114,  114,  954,  114,  957,  960,  114,
+      114,  114,  961,  952,  959,  114,  114,  114,  958,  114,
+
+      953,  114,  951,  955,  114,  965,  956,  114,  114,  114,
+      114,  114,  963,  114,  957,  960,  114,  114,  962,  961,
+      114,  959, 1304,  114,  114,  958,  114,  967,  114,  966,
+      964,  114,  965,  968,  969,  114,  114,  114,  114,  963,
+      114,  114,  114, 1304,  972,  962,  971,  114,  114,  114,
+      114,  114,  970,  973,  967,  114,  966,  964,  114,  979,
+      968,  969,  114,  114,  114,  114,  975, 1304,  114,  114,
+      974,  972,  114,  971,  116,  114,  114,  114,  976,  970,
+      973,  114,  114,  116,  978,  983,  979,  104,  980,  114,
+      981,  114,  114,  975,  114,  114,  104,  974,  985,  114,
+
+      114,  977,  984,  114,  114,  976,  986,  114,  114, 1304,
+      987,  978,  983,  989,  114,  980,  982,  981,  114,  114,
+     1304,  114,  114,  993, 1304,  985,  988,  114,  977,  984,
+      114,  114,  995,  986,  114,  114,  992,  987,  992,  992,
+      989,  114,  868,  982,  868,  868,  114,  869,  996,  999,
+      993,  116,  114,  988,  114,  994,  114,  114,  877,  995,
+      877,  877,  114,  746,  104,  114,  114,  990,  998,  114,
+     1001,  997,  114,  114,  114,  996,  999,  114,  114,  114,
+      114,  114,  994,  114,  114, 1000,  991, 1002, 1005, 1304,
+     1003, 1304,  114,  114,  114,  998,  114, 1001,  997,  114,
+
+     1004,  114,  114,  114,  114,  114,  114,  114,  114,  114,
+      114, 1304, 1000,  991, 1002, 1005,  114, 1003,  114, 1008,
+     1006,  114, 1007, 1304, 1304, 1304,  114, 1004, 1304,  114,
+      114, 1304, 1304,  114, 1304,  114,  114,  114, 1009,  114,
+     1009, 1009, 1011,  114, 1013,  114, 1008, 1006, 1014, 1007,
+      896,  896,  896,  114,  116,  896,  896,  896,  896,  896,
+     1010, 1010, 1010, 1010, 1010, 1015,  114,  104, 1016, 1011,
+     1017, 1013, 1018,  114,  114, 1014,  114, 1019,  114, 1020,
+     1023, 1021, 1025,  114,  114,  114, 1012, 1024, 1026, 1028,
+      918, 1022, 1015, 1029, 1304, 1016, 1031, 1017,  919, 1018,
+
+      114,  114,  114,  114, 1019,  114, 1020, 1023, 1021, 1025,
+      114,  114,  114, 1012, 1024, 1026, 1028, 1030, 1022,  114,
+     1029,  114,  931, 1031,  931,  931,  114,  931, 1034,  114,
+      114,  663,  114,  663,  663, 1027,  664, 1033, 1304, 1304,
+      114, 1304, 1035,  114, 1030, 1038,  114,  114,  114,  114,
+     1039,  114,  114,  114,  114, 1034, 1036,  114, 1040,  114,
+      114,  114, 1027,  114, 1033, 1032,  939,  114,  114, 1035,
+      114, 1041, 1038, 1043,  114,  114,  114, 1039,  114,  114,
+     1042,  114, 1044, 1036,  114, 1040,  114,  114,  114, 1045,
+      114,  114, 1032,  114, 1304,  114, 1046,  116, 1041,  114,
+
+     1043, 1054,  114, 1050, 1047,  114, 1051, 1042,  114, 1044,
+      104,  114, 1049,  114,  114, 1052,  114, 1053,  114,  114,
+      114,  114,  114,  114, 1056,  114,  114,  114, 1048,  114,
+     1050, 1047,  114, 1051,  114,  114, 1055, 1057,  114, 1049,
+     1058,  114, 1052,  114, 1053,  114,  114, 1059,  114,  114,
+      114, 1056,  114,  114,  114, 1048,  114,  114, 1061, 1060,
+      114,  114,  114, 1055, 1057,  114,  114, 1058,  114,  116,
+     1062, 1063,  114, 1065, 1059, 1066,  114,  116, 1304,  114,
+      114,  114,  104,  114,  114, 1067, 1060,  114,  114,  114,
+      104, 1071, 1068,  114, 1064,  114, 1304, 1062, 1063, 1304,
+
+     1065,  114, 1066,  114, 1079, 1069,  114,  114,  114, 1072,
+      114, 1070, 1067,  114, 1304,  114, 1083,  114, 1071, 1068,
+     1073, 1064, 1073, 1073, 1230, 1074, 1078, 1304,  114,  114,
+     1304, 1079, 1069, 1080,  114,  114, 1072, 1304, 1070,  114,
+      114, 1081, 1082, 1083,  114, 1075,  992,  114,  992,  992,
+     1084,  869,  114, 1078, 1086, 1085,  114,  114,  114,  114,
+     1080,  114,  114, 1087, 1076, 1304,  114, 1077, 1081, 1082,
+      114,  114, 1093, 1088,  114, 1089,  114, 1084, 1090,  114,
+      114, 1086, 1097,  114,  114,  114,  114, 1304,  114, 1091,
+     1087, 1076, 1092, 1098, 1077, 1099,  114,  114,  114, 1093,
+
+     1088, 1100, 1089,  114,  116, 1090, 1304,  114, 1095, 1097,
+      114,  114, 1009, 1101, 1009, 1009, 1091,  104, 1102, 1092,
+     1098, 1103, 1099,  114, 1094, 1094, 1094,  114, 1100, 1094,
+     1094, 1094, 1094, 1094,  114, 1095, 1104, 1096,  114,  114,
+     1101, 1107,  114,  114, 1109, 1102, 1106, 1110, 1103, 1108,
+     1105, 1111, 1112, 1113,  114,  114, 1115, 1304,  488,  114,
+      114,  114,  114, 1104, 1096,  114,  114, 1304, 1107,  114,
+      114, 1109,  114, 1106, 1110,  114, 1108, 1105, 1116, 1112,
+     1113,  114,  114, 1115, 1114,  114,  114,  114,  114,  114,
+     1117, 1118,  114,  114,  114,  114,  114,  489,  114,  114,
+
+      116,  114,  114, 1123,  114, 1116,  114,  114,  114,  114,
+     1124, 1114,  114,  104, 1127,  114,  114, 1117, 1118,  114,
+      114,  114,  114,  114,  489,  114, 1122,  114,  114,  114,
+     1123,  114,  116,  114,  114, 1128,  114, 1124, 1129,  114,
+      114, 1127,  114,  114,  116,  104,  114, 1132,  114,  114,
+     1134, 1135,  114, 1122,  114, 1304,  114,  104,  114,  114,
+     1304, 1130, 1128, 1304, 1141, 1129,  114,  114, 1073,  114,
+     1073, 1073,  114, 1074, 1132,  114,  114, 1134, 1135,  114,
+     1140, 1139, 1131, 1142,  114,  114,  114, 1138, 1130, 1138,
+     1138, 1141, 1143, 1136,  114, 1145, 1144,  114, 1149,  114,
+
+      114,  114,  116,  114,  114, 1304, 1146, 1140, 1139, 1131,
+     1142,  114, 1137,  114, 1152,  104, 1158, 1159,  114, 1143,
+     1150,  114, 1145, 1144,  114, 1149,  114,  114,  114,  114,
+      114,  114, 1151, 1146, 1304,  114, 1156, 1160, 1153, 1137,
+      114, 1152,  114, 1158, 1159,  114, 1154, 1150, 1304, 1304,
+     1304, 1304, 1304,  114,  116, 1161,  114, 1162, 1155, 1151,
+     1155, 1155,  114, 1156, 1160, 1153, 1165,  104, 1157,  114,
+     1094, 1094, 1094, 1154,  114, 1094, 1094, 1094, 1094, 1094,
+      114, 1163, 1161,  114, 1162, 1164, 1167, 1166, 1170,  114,
+     1173, 1168,  114, 1165,  114, 1157, 1111, 1169, 1175,  114,
+
+     1304,  114, 1171,  488, 1304, 1304, 1174,  114, 1163,  114,
+      114,  114, 1164, 1167, 1166, 1170,  114, 1173, 1168,  114,
+     1176,  114, 1304, 1178, 1169, 1175,  114,  114,  114, 1171,
+     1177, 1179, 1182, 1174, 1304,  116,  114, 1186,  114, 1187,
+     1183, 1180,  643, 1304,  114,  114,  116, 1176,  104, 1185,
+     1189,  114,  114, 1196,  114,  114,  114, 1177,  114,  104,
+     1190, 1181, 1195, 1304, 1186, 1304, 1187, 1194, 1304,  643,
+     1184,  114,  114,  114, 1191,  114, 1185, 1189,  114,  114,
+     1196, 1197, 1198,  114,  114,  114, 1201, 1190, 1181, 1195,
+     1138, 1202, 1138, 1138, 1194, 1074,  114, 1184,  114,  114,
+
+      114, 1191,  114,  114,  114,  114,  114, 1199, 1197, 1198,
+      114,  114, 1200, 1201, 1204,  114,  116, 1205, 1202, 1304,
+     1207, 1209, 1304,  114,  114,  114,  114, 1210, 1304,  104,
+      114,  114,  114,  114, 1199, 1304, 1304,  114, 1211, 1200,
+     1212, 1204,  114, 1155, 1205, 1155, 1155, 1207, 1209, 1208,
+     1213,  114, 1214, 1215, 1210, 1206, 1206, 1206, 1216,  114,
+     1206, 1206, 1206, 1206, 1206, 1211,  114, 1212,  114,  114,
+     1218,  114,  114, 1220,  114, 1219, 1208, 1213, 1217, 1214,
+     1215, 1178, 1221, 1224, 1182, 1216,  114,  114,  114, 1179,
+     1222, 1179, 1183,  114,  116,  114,  114, 1218,  114,  114,
+
+     1220,  114, 1219, 1226,  114, 1217,  114,  104, 1304,  114,
+      116, 1183, 1231, 1232,  114,  114, 1233, 1225,  114, 1181,
+     1223, 1234, 1184,  104,  114, 1236, 1235, 1228,  114,  114,
+     1304,  114, 1237,  114,  114, 1229,  114, 1227, 1304, 1231,
+     1232,  114, 1304, 1233, 1225,  114, 1181, 1223, 1234, 1184,
+     1243,  114, 1236, 1235, 1228,  114,  114, 1238, 1244, 1237,
+      116,  114, 1229, 1245, 1227,  114, 1246, 1239,  114, 1239,
+     1239, 1247, 1240,  104, 1241, 1248, 1240, 1243,  114,  114,
+      114, 1252, 1250,  114, 1238, 1244,  114, 1253, 1221, 1249,
+     1245, 1254,  114, 1246, 1242, 1251, 1222, 1256, 1247, 1222,
+
+     1257, 1241, 1248, 1261, 1263,  114,  114,  114, 1252, 1250,
+      114,  114,  114,  114, 1253,  116, 1249, 1265, 1304,  114,
+     1262, 1242, 1251, 1260, 1256, 1255, 1223, 1257,  104,  114,
+     1261, 1263, 1269, 1264, 1270,  116, 1271, 1258,  114,  114,
+     1266, 1304, 1266, 1266, 1265,  746,  114, 1262,  104, 1272,
+     1260,  114, 1255, 1223,  114,  114,  114, 1275, 1276, 1269,
+     1264, 1270, 1267, 1271, 1258,  747, 1239, 1268, 1239, 1239,
+     1273, 1240,  114,  114,  114, 1240, 1272,  114,  114,  116,
+     1278,  114,  114, 1274, 1275, 1276, 1280, 1304, 1279, 1267,
+     1282, 1304,  104, 1283, 1268, 1277,  114, 1273, 1284,  114,
+
+      114,  114,  114, 1281,  114, 1281, 1281, 1278,  869, 1266,
+     1274, 1266, 1266, 1280,  746, 1279, 1266, 1282, 1266, 1266,
+     1283,  746, 1277,  114,  114, 1284,  114, 1289,  870,  114,
+      116,  114, 1292, 1291,  875, 1290,  114, 1287, 1293,  114,
+      114,  875, 1304,  104, 1281, 1294, 1281, 1281, 1304,  869,
+     1304,  114, 1296,  114, 1289, 1297, 1304, 1304,  114, 1292,
+     1291, 1304, 1290,  114, 1287, 1293,  114,  114, 1288,  990,
+     1304, 1281, 1294, 1281, 1281, 1295,  869, 1295, 1295, 1296,
+     1074, 1295, 1297, 1295, 1295, 1295, 1074, 1295, 1295, 1301,
+     1074, 1298,  114, 1299,  114, 1288,  990,  114,  114, 1303,
+
+     1075,  114,  114, 1300, 1302, 1304, 1136, 1304, 1304, 1304,
+     1136, 1304,  114, 1304, 1304, 1304, 1301, 1304, 1298,  114,
+     1299,  114, 1304, 1304,  114,  114, 1303, 1304,  114,  114,
+     1300, 1302, 1304, 1304, 1304, 1304, 1304, 1304, 1304,  114,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+
+       69,   69,   69,   69,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   93,   93,   93,   93,   93,   93,   93,   93,
+       93,   93,   93,   93,   93,   93,   93,   93,   98,   98,
+       98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+       98,   98,   98,   98,  102,  102, 1304,  102, 1304,  102,
+     1304,  102,  102,  105,  105,  105,  105,  105,  105,  105,
+
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  108,
+      108, 1304,  108, 1304,  108, 1304,  108,  108,  114,  114,
+     1304,  114, 1304,  114,  114,  114,  114,  228, 1304, 1304,
+      228, 1304, 1304,  228,  228,  228,  228,  228,  228,  228,
+      228,  228,  228,  231,  231,  231,  231,  231,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  231,  234,
+      234,  234,  234,  234,  234,  234,  234,  234,  234,  234,
+      234,  234,  234,  234,  234,  243,  243, 1304,  243, 1304,
+      243, 1304,  243,  246,  246, 1304,  246, 1304,  246, 1304,
+      246,  247,  247, 1304,  247, 1304,  247, 1304,  247,  248,
+
+      248, 1304,  248, 1304,  248, 1304,  248,  249,  249,  249,
+      249, 1304,  249,  249,  249,  249,  249,  249,  249,  249,
+      249,  249,  249,  250,  250,  250,  250, 1304,  250,  250,
+      250,  250,  250,  250,  250,  250,  250, 1304,  250,  256,
+      256,  256,  256, 1304,  256,  256,  256,  256,  256,  256,
+      256,  256,  256,  256,  256,  259,  259,  259,  259, 1304,
+      259,  259,  259,  259,  259,  259,  259,  259,  259,  259,
+      259,  262,  262,  262,  262, 1304,  262,  262,  262,  262,
+      262,  262,  262,  262,  262, 1304,  262,  264,  264,  264,
+      264, 1304,  264,  264,  264,  264,  264,  264,  264,  264,
+
+      264,  264,  264,  252,  252, 1304, 1304, 1304,  252, 1304,
+      252,  252,  252,  252, 1304, 1304, 1304,  252,  252,  267,
+      267, 1304,  267, 1304,  267, 1304,  267,  268,  268, 1304,
+      268, 1304,  268, 1304,  268,  269,  269, 1304,  269, 1304,
+      269, 1304,  269,  274, 1304, 1304, 1304, 1304,  274,  274,
+      274,  274,  274,  274,  274,  274,  274,  274,  274,  276,
+      276, 1304, 1304,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  278,  278, 1304, 1304,  278,
+      278,  278,  278,  278,  278,  278,  278,  278,  278,  278,
+      278,   93,   93,   93,   93,   93,   93,   93,   93,   93,
+
+       93,   93,   93,   93,   93,   93,   93,  280,  280,  280,
+      280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+      280,  280,  280,   96,   96,   96,   96,   96,   96,   96,
+       96,   96,   96,   96,   96,   96,   96,   96,   96,   98,
+       98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
+       98,   98,   98,   98,   98,  283,  283,  283,  283,  283,
+      283,  283,  283,  283,  283,  283,  283,  283,  283,  283,
+      283,  285,  285,  285,  285,  285,  285,  285,  285,  285,
+      285,  285,  285,  285,  285,  285,  285,  102,  102, 1304,
+      102, 1304,  102, 1304,  102,  102,  287,  287, 1304,  287,
+
+     1304,  287, 1304,  287,  287,  288,  288, 1304,  288, 1304,
+      288, 1304,  288,  105,  105,  105,  105,  105,  105,  105,
+      105,  105,  105,  105,  105,  105,  105,  105,  105,  289,
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,  289,  289,  289,  289,  108,  108, 1304,  108, 1304,
+      108, 1304,  108,  108,  291,  291, 1304,  291, 1304,  291,
+     1304,  291,  291,  110,  110, 1304,  110, 1304,  110, 1304,
+      110,  110,  292,  292, 1304,  292, 1304,  292, 1304,  292,
+      292,  114,  114, 1304,  114, 1304,  114,  114,  114,  114,
+      228, 1304, 1304,  228, 1304, 1304,  228,  228,  228,  228,
+
+      228,  228,  228,  228,  228,  228,  231,  231,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  231,  231,
+      231,  231,  232,  232,  232,  232,  232,  232,  232,  232,
+      232,  232,  232,  232,  232,  232,  232,  232,  234,  234,
+      234,  234,  234,  234,  234,  234,  234,  234,  234,  234,
+      234,  234,  234,  234,  243,  243, 1304,  243, 1304,  243,
+     1304,  243,  246,  246,  246, 1304,  246, 1304,  246, 1304,
+      246,  247,  247, 1304,  247, 1304,  247, 1304,  247,  248,
+      248,  248,  248, 1304,  248, 1304,  248,  249,  249,  249,
+      249, 1304,  249,  249,  249,  249,  249,  249,  249,  249,
+
+      249,  249,  249,  250,  250,  250,  250, 1304,  250,  250,
+      250,  250,  250,  250,  250,  250,  250, 1304,  250,  455,
+      455,  455,  455, 1304,  455,  455,  455,  455,  455,  455,
+      455, 1304,  455, 1304,  455,  252,  252, 1304, 1304, 1304,
+      252, 1304,  252,  252,  252,  252, 1304, 1304, 1304,  252,
+      252,  256,  256,  256,  256, 1304,  256,  256,  256,  256,
+      256,  256,  256,  256,  256,  256,  256,  456,  456,  456,
+      456, 1304,  456,  456,  456,  456,  456,  456,  456,  456,
+      456,  456,  456,  258,  258, 1304, 1304, 1304,  258,  258,
+      258,  258,  258,  258,  258,  258,  258,  258,  258,  259,
+
+      259,  259,  259, 1304,  259,  259,  259,  259,  259,  259,
+      259,  259,  259,  259,  259,  457,  457,  457,  457, 1304,
+      457,  457,  457,  457,  457,  457,  457,  457,  457,  457,
+      457,  261,  261, 1304, 1304, 1304,  261, 1304,  261,  261,
+      261,  261,  261,  261, 1304,  261,  261,  262,  262,  262,
+      262, 1304,  262,  262,  262,  262,  262,  262,  262,  262,
+      262,  262,  262,  264,  264,  264,  264, 1304,  264,  264,
+      264,  264,  264,  264,  264,  264,  264,  264,  264,  459,
+      459,  459,  459, 1304,  459,  459,  459,  459,  459,  459,
+      459,  459,  459,  459,  459,  266,  266, 1304, 1304, 1304,
+
+      266, 1304,  266,  266,  266,  266,  266,  266,  266,  266,
+      266,  267,  267,  267, 1304,  267, 1304,  267, 1304,  267,
+      268,  268, 1304,  268, 1304,  268, 1304,  268,  269,  269,
+      269,  269, 1304,  269, 1304,  269,  274, 1304, 1304, 1304,
+     1304,  274,  274,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  276,  276, 1304, 1304,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  276,  276,  277,  277,
+     1304, 1304,  277,  277,  277,  277,  277,  277,  277,  277,
+      277,  277,  277,  277,  278,  278, 1304, 1304,  278,  278,
+      278,  278,  278,  278,  278,  278,  278,  278,  278,  278,
+
+      279,  279, 1304, 1304,  279,  279,  279,  279,  279,  279,
+      279,  279,  279,  279,  279,  279,  280,  280,  280,  280,
+      280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+      280,  280,   96,   96,   96,   96,   96,   96,   96,   96,
+       96,   96,   96,   96,   96,   96,   96,   96,  283,  283,
+      283,  283,  283,  283,  283,  283,  283,  283,  283,  283,
+      283,  283,  283,  283,  285,  285,  285,  285,  285,  285,
+      285,  285,  285,  285,  285,  285,  285,  285,  285,  285,
+      287,  287, 1304,  287, 1304,  287, 1304,  287,  287,  288,
+      288, 1304,  288, 1304,  288, 1304,  288,  289,  289,  289,
+
+      289,  289,  289,  289,  289,  289,  289,  289,  289,  289,
+      289,  289,  289,  291,  291, 1304,  291, 1304,  291, 1304,
+      291,  291,  292,  292, 1304,  292, 1304,  292, 1304,  292,
+      292,  114,  114, 1304,  114, 1304,  114,  114,  114,  114,
+      455,  455,  455,  455, 1304,  455,  455,  455,  455,  455,
+      455,  455, 1304,  455,  455,  455,  456,  456,  456,  456,
+     1304,  456,  456,  456,  456,  456,  456,  456,  456,  456,
+      456,  456,  457,  457,  457,  457, 1304,  457,  457,  457,
+      457,  457,  457,  457,  457,  457,  457,  457,  459,  459,
+      459,  459, 1304,  459,  459,  459,  459,  459,  459,  459,
+
+      459,  459,  459,  459,  258,  258, 1304, 1304, 1304,  258,
+      258,  258,  258,  258,  258,  258,  258,  258,  258,  258,
+      261,  261, 1304, 1304, 1304,  261, 1304,  261,  261,  261,
+      261,  261,  261, 1304,  261,  261,  266,  266, 1304, 1304,
+     1304,  266, 1304,  266,  266,  266,  266,  266,  266,  266,
+      266,  266,  807, 1304, 1304,  807, 1304,  807,  807, 1304,
+      807, 1304,  807, 1304,  807,  110,  110, 1304,  110, 1304,
+      110, 1304,  110,  110, 1037, 1037, 1304, 1037, 1304, 1037,
+     1304, 1037, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+     1125, 1125, 1125, 1125, 1125, 1125, 1125, 1147, 1147, 1304,
+
+     1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
+     1147, 1147, 1193, 1304, 1304, 1193, 1304, 1193, 1193, 1304,
+     1193, 1304, 1193, 1304, 1193, 1206, 1304, 1206, 1206, 1206,
+     1304, 1304, 1206, 1206, 1206, 1259, 1259, 1304, 1259, 1304,
+     1259, 1304, 1259,   17, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304
+    } ;
+
+static yyconst flex_int16_t yy_chk[6829] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    3,    3,    3,    3,   88,    3,
+       22,   88, 1148,    3,    4,    4,    4,    4,   24,    4,
+
+       96,   22,  123,    4,    5,    5,    5,    5,    5,    5,
+        5,   24, 1126,    5,    5,    5,    5,   26,    5,    9,
+        9,    9,    9, 1085,   26,    9,  107,    5,    5,  123,
+       27,   29,   31,    5,  107,    9,   10,   10,   10,   10,
+     1054,    9,   10,   27,   29,   31,    9,    9,   13,   13,
+       13,   13,   10,   13,   96,  623,   95,   13,   10,   55,
+       95,   55,   55,   10,   10,   13,   13,   13,   13,   13,
+       15,   15,   15,   15,   57,   15,   57,   57,  289,   15,
+       64,   53,   64,   64,  455,  296,  289,    5,    6,    6,
+        6,    6,    6,    6,    6,   53,  292,    6,    6,    6,
+
+        6,  102,    6,  108,   14,   14,   14,   14,   53,   14,
+      125,    6,    6,   14,  102,  291,  108,    6,   41,  126,
+      287,   14,   14,   14,   14,   14,   16,   16,   16,   16,
+       19,   16,   19,   19,   30,   16,  279,  125,   41,  152,
+       19,   19,   41,   19,   30,   41,  126,   30,  275,   59,
+       59,  275,   59,   19,   59,  277,  269,   73,   59,   73,
+       73,   84,  918,   84,   84,   41,  152,   74,   74,   41,
+      918,    6,    7,    7,    7,    7,    7,    7,    7,   39,
+      267,    7,    7,    7,    7,  262,    7,   72,   74,   72,
+       72,  110,  115,   39,   74,    7,    7,   89,   39,   39,
+
+       89,    7,   89,   39,  110,  115,   39,   45,   45,   72,
+       75,   75,  124,  124,  250,   75,   45,   45,   45,  156,
+       39,  282,  127,   45,  127,   39,   39,   69,   69,  280,
+       39,   75,   69,  280,   45,   45,   75,   75,   90,  124,
+      124,   90,   69,   45,   45,   45,  156,   90,   69,  127,
+       45,  127,  248,   69,   69,    7,    8,    8,    8,    8,
+        8,    8,    8,  246,  232,    8,    8,    8,    8,  133,
+        8,   46,  122,   42,   42,  282,   46,   42,  118,    8,
+        8,   42,   52,  159,   46,    8,  133,  122,   46,  162,
+       52,   46,  138,   42,  118,   46,  133,   42,   46,  122,
+
+       42,   42,   52,   46,   42,  118,   52,  138,   42,   52,
+      159,   46,  116,  133,  122,   46,  162,   52,   46,  138,
+       42,  118,   46,  921,   42,   60,   60,   60,   60,   52,
+     1045,  921,  113,   52,  138,   60,   60, 1045,   60,    8,
+       11,   11,   11,   11,   11,   11,   11,  109,   60,   11,
+       11,   11,   11,   48,   11,  121,   48,   48,   76,   76,
+       76,   76,   76,   11,   11,   61,   61,   61,   61,   11,
+      142,   48,  166,   48,  121,   61,   61,   48,   61,  105,
+       48,  103,  121,   48,   48,   77,   77,  139,   61,  142,
+       77,  139,   63,   63,   63,   63,   93,  142,   48,  166,
+
+       48,  121,   63,   63,   48,   63,   77,   86,   86,   86,
+       86,   86,   77,  924,  139,   63,  142,  806,  139,  167,
+      806,  924,  172,   11,   12,   12,   12,   12,   12,   12,
+       12,   71,   21,   12,   12,   12,   12,  119,   12,   70,
+       70,   70,   70, 1111,  119,   70,  167,   12,   12,  172,
+     1111,  813,  119,   12,  813,   70,   85,   17,   85,   85,
+      174,   70,    0,  148,  119,  148,   70,   70,   85,   85,
+       85,  119,    0,   85,   85,   85,   85,   85,   91,  119,
+       91,   91,  111,  111,  111,  111,  111,  174,   91,   91,
+      148,   91,  148,  111,    0,  229,  176,  229,  229,  120,
+
+      230,   91,  230,  230,    0,    0,  183,   12,   23,   23,
+       23,   23,   23,   23,   23,  120,    0,   23,   23,   23,
+       23,  128,   23,  176,   23,  128,  120,  131,  131,  128,
+      129,   23,   23,  183,  129,  140,    0,   23,  129,  130,
+      128,    0,  120,  132,  129,  130,  130,  140,  128,  129,
+      136,  136,  128,  184,  131,  131,  128,  129,  132,  137,
+      137,  129,  140,  132,   23,  129,  130,  128,  141,  141,
+      132,  129,  130,  130,  140,    0,  129,  136,  136,    0,
+      184,  245,  144,  245,  245,  132,  137,  137,  143,  143,
+      132,   23,   28,   28,  149,  141,  141,  144,   28,  149,
+
+       28,   28,   28,   28,   28,   28,   28,   28,   28,  144,
+       28,   28,   28,   28,   28,  143,  143,  187,  147,  154,
+      154,  149,  147,    0,  144,  925,  149,    0,  157,  157,
+      177,  231,  231,  925,  231,  255,  231,  255,  255,  134,
+      231,   28,   32,   32,  187,  147,  154,  154,   32,  147,
+       32,   32,   32,    0,  134,  157,  157,  177,   32,  134,
+       32,   32,   32,   32,   32,  135,  134,   32,   32,  670,
+      151,  135,  670,  150,  151,  135,   32,  189,   32,  135,
+       32,  134,   32,   32,  177,  670,  134,  150,  205,  160,
+     1113,   32,  135, 1113,   32,   32,  160,  151,  135,  161,
+
+      150,  151,  135,   32,  189,   32,  135,   32,    0,   32,
+       32,   33,   33,  161,  150,  205,  160,   33,  218,   33,
+       33,   33,  153,  160,  145,  153,  161,   33,  145,   33,
+       33,   33,   33,   33,   33,  145,  146,  163,  153,  145,
+      161,  278,  146,  163,  278,  218,  158,  158,  158,  153,
+      278,  145,  153,  146,   33,  145,  168,    0,   33,    0,
+       33,   33,  145,  146,  163,  153,  145,  195,  155,  146,
+      163,  168,  155,  158,  158,  158, 1133,  164,  195, 1133,
+      146,   33,  155,  168,  169,   33,   34,  155,  170,  212,
+       34,  212,  169,   34,  195,  155,  164,   34,  168,  155,
+
+       34,   34,  179,   34,  164,  195,   34,  170,  179,  155,
+       34,  169, 1131,   34,  155,  170,  212,   34,  212,  169,
+       34,  171,  171,  164,   34, 1131,  173,   34,   34,  179,
+       34,    0,  173,   34,  170,  179,  180,   34,   35,  175,
+      181,  180,   35,  186,  175,  173,   35,  186,  171,  171,
+      175,   35,   35,  173,  175,  223,  181,  215,   35,  173,
+       35,    0,   35,  180,  215,   35,  175,  181,  180,   35,
+      186,  175,  173,   35,  186,    0,    0,  175,   35,   35,
+        0,  175,  223,  181,  215,   35,    0,   35,  165,   35,
+       36,  215,   36,  227,  165,  301,  178,  182,  182,  185,
+
+      165,   36,  178,   36,  165,  165,   36,  165,  178,  178,
+       36,   36,  185,   36,   36,  165,    0,   36,  185,   36,
+      227,  165,  301,  178,  182,  182,  185,  165,   36,  178,
+       36,  165,  165,   36,  165,  178,  178,   36,   36,  185,
+       36,   36,   37,  188,  198,  185,  190,  190,  191,  193,
+       37,  188,  303,  191, 1228,  191,   37,  192,  192,   37,
+       37,   37,   37,  198,  305,  193,   37, 1228,    0,   37,
+      188,  198,    0,  190,  190,  191,  193,   37,  188,  303,
+      191,  197,  191,   37,  192,  192,   37,   37,   37,   37,
+      198,  305,  193,   37,   38,   38,  194,  197,  194,  194,
+
+      194,  196,   38,  211,  211,  200,  196,  204,  197,   38,
+      200,   38,  204,   38,   38,  330,  202,  270,   38,  270,
+      270,   38,   38,  194,  197,  194,  194,  194,  196,   38,
+      211,  211,  200,  196,  204,  202,   38,  200,   38,  204,
+       38,   38,  330,  202,  201,   38,   40,  221,   40,   40,
+        0,   40,   40,  206, 1268,  201,  216,  216,   40,   40,
+        0,  201,  202,  221,   40,    0,   40, 1268,  203,    0,
+       40,  201,  206,   40,  221,   40,   40,  203,   40,   40,
+      206,  203,  201,  216,  216,   40,   40,  203,  201,    0,
+      221,   40,  208,   40,  210,  203,  213,   40,   43,  206,
+
+      213,   43,   43,  207,  203,  219,  208,  207,  203,  219,
+       43,  208,   43,  210,  203,  207,  220,   43,   43,  208,
+      220,  210,   43,  213,    0,   43,    0,  213,   43,   43,
+      207,    0,  219,  208,  207,    0,  219,   43,  208,   43,
+      210,    0,  207,  220,   43,   43,    0,  220,  214,   43,
+       44,   44,  214,   44,   44,  209,  209,  222,   44,  217,
+      217,  222,   44,  224,   44,  304,  209,  214,  222,  304,
+       44,  224,  339,  209,   44,  214,    0,   44,   44,  214,
+       44,   44,  209,  209,  222,   44,  217,  217,  222,   44,
+      224,   44,  304,  209,  214,  222,  304,   44,  224,  339,
+
+      209,   44,   47,  298,  226,  225,   47,  306,   47,  225,
+       47,  306,  298,  225,  226,  226,   47,   47,  276,   47,
+        0,  276,   47,  276,  225,  254,   47,  254,  254,   47,
+      298,  226,  225,   47,  306,   47,  225,   47,  306,  298,
+      225,  226,  226,   47,   47, 1172,   47,  254, 1172,   47,
+      300,  225,  307,   47,   49,  299,  300,  241,   49,  241,
+      241,   49,   49,  307,  299,   49,   49,  241,  241,   49,
+      241,  311,   49,   49,   49,  311,   49,  300,   49,  307,
+      241,   49,  299,  300,  242,   49,  242,  242,   49,   49,
+      307,  299,   49,   49,  242,  242,   49,  242,  311,   49,
+
+       49,   49,  311,   49,  342,   49,   50,  242,   50,  240,
+      240,  240,  240,   50,   50,  256,  256,   50, 1192,   50,
+       50, 1192,  240,    0,  249,  249,   50,  257,  257,  249,
+       50,  342,  345,   50, 1046,   50,  256,    0,    0,  249,
+       50,   50,  256, 1288,   50,  249,   50,   50,  257, 1046,
+      249,  249, 1046,   50,  257,    0, 1288,   50,   51,  345,
+       51,  253,  253,  253,  253,   51,  308,  253,    0,  313,
+       51,  308,   51,  313,   51,   51,   51,  253,  273,  273,
+      273,  273,  273,  253,    0,   51, 1028,   51,  253,  253,
+      264,  264,   51,  308, 1028,  264,  313,   51,  308,   51,
+
+      313,   51,   51,   51,   98,   98,   98,   98,   98,   98,
+       98,  264, 1069,   98,   98,   98,   98,  264,   98, 1069,
+       98,  235,  235,  235,  235, 1069, 1271,   98,   98, 1271,
+      346,  235,  235,   98,  235,  236,  236,  236,  236,  237,
+      237,  237,  237, 1029,  235,  236,  236,    0,  236,  237,
+      237, 1029,  237,  238,  238,  238,  238,  346,  236,  348,
+       98,    0,  237,  238,  238,    0,  238,  263,  263,  263,
+      263,  263,  239,  239,  239,  239,  238,    0,  263,    0,
+      352, 1272,  239,  239, 1272,  239,  348,   98,   99,   99,
+       99,   99,   99,   99,   99,  239,    0,   99,   99,   99,
+
+       99,  319,   99,  244,  302,  244,  244,  352,  319,  309,
+      302,   99,   99,  244,  244,  309,  244,   99,    0,  259,
+      259,    0,  260,  260,  259,    0,  244,  260,  319,  265,
+      265,  302,  357,  376,  265,  319,  309,  302,    0, 1170,
+      259,    0,  309,  260,   99,  259,  259, 1170,  260,  260,
+      265,  293,  293,  293,  293,  293,  265,    0,    0,  357,
+      376, 1224,  293,  295,  295,  295,  295,  295,  295, 1224,
+        0,   99,  100,  100,  100,  100,  100,  100,  100,    0,
+      314,  100,  100,  100,  100,  271,  100,  271,  271,  310,
+      314,    0,  310,    0,  396,  100,  100,  271,  271,  271,
+
+      312,  100,  271,  271,  271,  271,  271,  314,  312,    0,
+        0,  354,  272,  316,  272,  272,  310,  314,  316,  310,
+      354,  396,    0,    0,  272,  272,  272,  312,  100,  272,
+      272,  272,  272,  272,    0,  312,  323,  315,  354,    0,
+      316,    0,  315,  317,  318,  316,  323,  354,  315,  318,
+      317,  320,    0,    0,  320,  100,  101,  101,  101,  101,
+      101,  101,  101,  323,  315,  101,  101,  101,  101,  315,
+      101,  318,  101,  323,    0,  315,  318,  317,  320,  101,
+      101,  320,  321,  322,  324,  101,  321,  325,  327,  317,
+      326,  322,  324,  329,  326,  325,  327,  328,  332,  331,
+
+      328,  333,  332,  329,  317,  331,  391,  391,  333,  321,
+      322,  324,  101,  321,  325,  327,  317,  326,  322,  324,
+      329,  326,  325,  327,  328,  332,  331,  328,  333,  332,
+      329,    0,  331,  391,  391,  333,  334,  401,  335,  101,
+      112,  112,  340,  335,  334,  340,  112,  335,  112,  112,
+      112,  112,  112,  112,  112,  112,  112,  337,  112,  112,
+      112,  112,  112,  334,  401,  335,  341,  337,    0,  340,
+      335,  334,  340,    0,  335,  344,  341, 1226,  344,  875,
+      336,  875,  875,    0,  337, 1226,  336,  347,  338,  112,
+      114,  114,  338,  341,  337,  347,  114,  343,  114,  114,
+
+      114,  343,  344,  341,  351,  344,  114,  336,  114,  114,
+      114,  114,  114,  336,  347,  338,  351,  350,    0,  338,
+      349, 1254,  347,    0,  343,  350,  349,  353,  343, 1254,
+      355,  351,  467,  467,  467,  467,  467,  355,  353,  114,
+      117,  117,    0,  351,  350,  358,  117,  349,  117,  117,
+      117,  358,  350,  349,  353,    0,  117,  355,  117,  117,
+      117,  117,  117,  356,  355,  353,  359,  368,  360,  361,
+      356,  360,  358,  359,  362,  363,  364,  368,  358,  362,
+      361,  365,  117,    0,  364,    0,  363,    0,  365,  117,
+      356,  405,    0,  359,  368,  360,  361,  356,  360,    0,
+
+      359,  362,  363,  364,  368,  406,  362,  361,  365,  117,
+      199,  364,  199,  363,  366,  365,  199,  367,  405,  382,
+      366,  374,  199,  382,  367,  199,  199,  374,  199,  199,
+        0,  663,  406,  663,  663,    0,  663,  199,  369,  199,
+        0,  366,    0,  199,  367,  369,  382,  366,  374,  199,
+      382,  367,  199,  199,  374,  199,  199,  283,  283,  283,
+      283,  283,  283,  283,    0,  369,  283,  283,  283,  283,
+      370,  283,  369,  371,  372,  370,  371,  372,  373,  371,
+      283,  283,  375,  377,  379,  375,  283,  378,  383,  385,
+      373,  377,  385,  378,  379,  380,  383,  370,  414,  378,
+
+      371,  372,  370,  371,  372,  373,  371,  380,    0,  375,
+      377,  379,  375,  283,  378,  383,  385,  373,  377,  385,
+      378,  379,  380,  383,    0,  414,  378,  381,    0,  384,
+     1256,  386,  381,  417,  380,  386,  384,  387, 1256,    0,
+      283,  284,  284,  284,  284,  284,  284,  284,    0,  388,
+      284,  284,  284,  284,  381,  284,  384,  389,  386,  381,
+      417,    0,  386,  384,  284,  284,  388,  387,  390,  392,
+      284,  387,  392,  389,  394,  393,  395,  397,  390,  395,
+      398,  393,  394,  404,  389,  393,  422,  399,  397,  404,
+        0,  398,  399,  388,  387,  390,  392,  284,  387,  392,
+
+      389,  394,  393,  395,  397,  390,  395,  398,  393,  394,
+      404,    0,  393,  422,  399,  397,  404,  407,  398,  399,
+      407,    0,    0,  415,  284,  285,  285,  285,  285,  285,
+      285,  285,  402,  408,  285,  285,  285,  285,  400,  285,
+      400,  403,  415,  402,  407,  408,  403,  407,  285,  285,
+      409,  400,  411,  410,  285,  428,  409,  411,  413,  402,
+      408,  409,  410,  413,  419,  400,  416,  400,  403,  415,
+      402,  416,  408,  403,    0,  419,    0,  409,  400,  411,
+      410,  285,  428,  409,  411,  413,    0,    0,  409,  410,
+      413,  419,    0,  416,  990,  412,  990,  990,  416,  418,
+
+      420,  412,  419,  418,  412,    0,    0,  420,  285,  286,
+      286,  286,  286,  286,  286,  286,  423, 1257,  286,  286,
+      286,  286,  412,  286,  423, 1257,  418,  420,  412,  421,
+      418,  412,  286,  286,  420,  421,  424,  423,  286,  425,
+      426,  426,  427,  423,  432,  424,  425,  424,  427,  430,
+      429,  423,  430,  431,  432,  431,  421,  429,  437,  440,
+      430,  441,  421,  424,  423,  286,  425,  426,  426,  427,
+      436,  432,  424,  425,  424,  427,  430,  429,    0,  430,
+      431,  432,  431,  436,  429,  437,  440,  430,  441,  444,
+      433,  434,  286,  294,  294,  433,  434,  436,  445,  294,
+
+        0,  294,  294,  294,  294,  294,  294,  294,  294,  294,
+      436,  294,  294,  294,  294,  294,  444,  433,  434,    0,
+      438,  450,  433,  434, 1276,  445,    0,  435,  438,  439,
+      442,  435, 1276,  439,  769,  769,  769,  769,  769,  446,
+      443,  446,  294,  297,  297,  442,  443,  438,  450,  297,
+        0,  297,  297,  297,  435,  438,  439,  442,  435,  297,
+      439,  297,  297,  297,  297,  297,  446,  443,  446,  447,
+      448,  449,  442,  443,  297,  448,  451,  451,  447,  456,
+      456,  475,  449,    0,  494,    0,  457,  457,    0,  459,
+      459,  457,  297,    0,  459,  470,  447,  448,  449,  470,
+
+      456,  297,  448,  451,  451,  447,  456,  457,  475,  449,
+      459,  494,  457,  457,  471,  462,  459,  462,  462,  473,
+      473,  477,  470,  477,  469,  471,  470,  462,  462,  462,
+      469,  472,  462,  462,  462,  462,  462,  469,  474,    0,
+      476,  471,    0,  474,  476,  472,  473,  473,  477,  479,
+      477,  469,  471,  478,  479,  478,  482,  469,  472,  483,
+      480,  482,  484,  483,  469,  474,  484,  476,  480,  481,
+      474,  476,  472,  485,  481,    0,  479,  485,  481,    0,
+      478,  479,  478,  482,  489,  487,  483,  480,  482,  484,
+      483,  486,  487,  484,  489,  480,  481,  491,  488,  490,
+
+      485,  481,  486,  490,  485,  481,  488,  495,  491,  492,
+      493,  489,  497,  492,  500,    0,  493,    0,  486,    0,
+      496,  489,  498,  501,  491,  502,  490,  498,  497,  486,
+      490,  487,  496,  503,  495,  491,  492,  493,  499,  497,
+      492,  500,  488,  493,  488,  499,  488,  496,  504,  498,
+      501,  504,  502,  505,  498,  497,  505,  506,  487,  496,
+      503,  507,    0,    0,  511,  499,  513,  511,  506,  488,
+      509,  488,  499,  488,    0,  504,  510,  507,  504,    0,
+      505,  509,  510,  505,  506,    0,  514,  508,  507,  508,
+      508,  511,  508,  513,  511,  506,  512,  509,  515,  518,
+
+      512,  514,    0,  510,  507,  516,  515,  517,  509,  510,
+      518,  517,  516,  519,  523,  520,  520,  522,    0,  521,
+      519,  520,  522,  512,  508,  515,  518,  512,  514,  521,
+      526,  528,  516,  515,  517,    0,  508,  518,  517,  516,
+      519,  523,  520,  520,  522,  525,  521,  519,  520,  522,
+      524,  508,  527,  524,  525,  529,  521,  526,  528,  529,
+      530,  532,  531,  508,  527,  531,  533,  535,  530,  532,
+      536,    0,  525,  533,    0,  538,  539,  524,    0,  527,
+      524,  525,  529,  534,  534,  540,  529,  530,  532,  531,
+      537,  527,  531,  533,  535,  530,  532,  536,  537,  541,
+
+      533,  534,  538,  539,  542,  542,  543,  541,  540,  544,
+      548,  545,  543,  546,  549,  547,  544,  537,  540,  545,
+      550,  548,  546,  547,  551,  537,  541,  551,  534,  552,
+      555,  542,  542,  543,  541,  540,  544,  548,  545,  543,
+      546,  549,  547,  544,  554,  540,  545,  550,  548,  546,
+      547,  551,  557,  553,  551,  556,  552,  553,  558,  554,
+      555,  560,  561,  556,  562,  559,  563,  564,  562,  559,
+      564,  554,  565,  566,  567,  568,    0,  567,  566,  557,
+      553,    0,  556,  559,  553,  558,  554,  555,  560,  561,
+      556,  562,  559,  563,  564,  562,  559,  564,  569,  565,
+
+      566,  567,  568,  570,  567,  566,  571,  569,  572,  570,
+      559,  574,  572,  575,  573,  576,    0,    0,  571,  579,
+      576,  580,  578,  575,  574,  569,  578,    0,  577,  580,
+      570,  579,    0,  571,  569,  572,  570,  573,  574,  572,
+      575,  581,  576,  573,  577,  571,  579,  576,  580,  578,
+      575,  574,  585,  578,  582,  577,  580,  581,  579,  584,
+      582,  583,  586,  584,  573,  587,  583,  588,  581,  590,
+      573,  577,  589,  587,  591,    0,  599,    0,  591,  585,
+      594,  582,  589,  592,  581,  604,  584,  582,  583,  586,
+      584,  594,  587,  583,  588,  592,  590,  593,  593,  589,
+
+      587,  591,  597,  599,  595,  591,  597,  594,  595,  589,
+      592,  596,  604,  596,  596,  593,  596,  603,  594,  598,
+      595,  607,  592,  598,  600,  605,    0,  603,    0,  597,
+      600,  595,  609,  597,  601,  595,  596,  602,  601,  606,
+      607,  602,  593,    0,  603,  606,  598,  595,  596,  606,
+      598,  600,  605,  608,  603,  596,  608,  600,  611,  609,
+      610,  601,    0,  611,  602,  601,  606,  607,  602,  612,
+      610,  617,  606,  612,  613,  596,  606,  617,  613,  614,
+      608,  627,  596,  608,  614,  611,  615,  610,  615,  616,
+      611,    0,  616,    0, 1119,  625,  612,  610,  617,  625,
+
+      612,  613,  624,    0,  617,  613,  614,  624,  627, 1119,
+        0,  614, 1119,  615,  626,  615,  616,  628,  622,  616,
+      622,  622,  625,  630,  626,    0,  625,  628,  631,  624,
+      622,  622,  622,  631,  624,  622,  622,  622,  622,  622,
+      634,  626,  629,  632,  628,  633,  629,  632,  633,  634,
+      630,  626,  636,  635,  628,  631,  639,  637,  641,  639,
+      631,  638,  642,  641,  636,    0,  635,  634,  637,  629,
+      632,  640,  638,  629,  632,  643,  634,  640,    0,  636,
+      635,  646,  633,  639,  637,  641,  639,  647,  638,  642,
+      641,  636,  633,  635,  648,  637,  650,  644,  640,  638,
+
+      651,  650,  643,  649,  640,  644,  655,  652,  646,  633,
+      653,  649,  660,    0,  647,  653,    0,  652,    0,  633,
+        0,  648,  654,  650,  656,  654,  662,  651,  650,  656,
+      649,  666,  657,  655,  652,  657,  658,  653,  649,  660,
+      658,  644,  653,  644,  652,  644,  659,  661,  668,  654,
+      659,  656,  654,  662,  665,  661,  656,  678,  666,  657,
+      667,  669,  657,  658,  672,  665,  669,  658,  644,  679,
+      644,  667,  644,  659,  661,  668,  671,  659,  671,    0,
+      672,  665,  661,  673,  678,  674,  673,  667,  669,  674,
+      685,  672,  665,  669,  675,  676,  679,  675,  667,  676,
+
+      677,    0,  680,  671,    0,  671,  680,  672,  677,  682,
+      673,  681,  674,  673,  682,  681,  674,  685,  683,  684,
+      686,  687,  676,  686,  684,  688,  676,  677,  683,  680,
+      689,  675,    0,  680,    0,  677,  682,  687,  681,  692,
+      690,  682,  681,  692,  696,  683,  684,  686,  687,  693,
+      686,  684,  688,  690,    0,  683,  691,  689,  675,  691,
+      695,  694,  693,  695,  687,  694,  692,  690,  693,  697,
+      692,  696,  701,  698,  701,  699,    0,  700,  697,  704,
+      690,  699,  705,  691,  706,  707,  691,  695,  694,  698,
+      695,  705,  694,  700,  702,  693,  697,    0,  702,  701,
+
+      698,  701,  699,  703,  700,  697,  704,  708,  699,  705,
+      709,  706,  707,  710,  703,  709,  698,  711,  705,  708,
+      700,  702,  714,  711,  712,  702,  710,  712,  713,  715,
+      703,  717,  714,  713,  708,  716,  718,  709,  716,  719,
+      710,  703,  709,  717,  711,  722,  708,  719,    0,  714,
+      711,  712,  724,  710,  712,  713,  715,  724,  717,  714,
+      713,  720,  716,  718,  723,  716,  719,  720,  721,  725,
+      717,  726,  722,  725,  719,  727,  729,  723,  721,  724,
+      727,    0,  726,  732,  724,  728,  729,  733,  720,    0,
+      730,  737,  723,    0,  720,  721,  725,  731,  726,  730,
+
+      725,  735,  727,  729,  738,  721,  731,  727,  728,  726,
+      732,  728,  735,  729,  733,  734,  736,  730,  737,  723,
+      734,  739,  740,  741,  731,    0,  730,  736,  735,    0,
+      744,  738,  739,  731,  743,  728,    0,  743,  728,  735,
+      744,    0,  734,  736,    0,    0,  749,  734,  739,  740,
+      741,    0,  749,  742,  736,  742,  742,  744,  742,  739,
+      745,  743,  745,  745,  743,  745,  747,  744,  747,  747,
+        0,  748,  750,  749,    0,  753,  750,    0,  742,  749,
+      748,  747,  751,  752,  751,  745,  753,  752,  754,  755,
+      742,  754,  757,  742,  747,  756,  760,  742,  748,  750,
+
+        0,  755,  753,  750,  745,    0,  756,  748,  761,  751,
+      752,  751,  761,  753,  752,  754,  755,  742,  754,  757,
+      742,  759,  756,  760,  742,  762,  758,  759,  755,  763,
+      764,  745,  758,  756,  765,  761,  758,  763,  766,  761,
+      770,  771, 1136,  766, 1136, 1136,  767,  773,  759,    0,
+      781,  773,  762,  758,  759,    0,  763,  764,  767,  758,
+        0,  765,    0,  758,  763,  766,  772,  770,  771,  768,
+      766,  768,  768,  767,  773,  774,  772,  781,  773,  776,
+      780,  768,  768,  768,  780,  767,  768,  768,  768,  768,
+      768,  775,  777,  772,  779,  776,  778,  777,  774,  778,
+
+      775,    0,  782,  772,  783,  789,  779,  780,  783,  782,
+      784,  780,  785,  789,  788,  786,    0,  784,  775,  777,
+        0,  779,  776,  787,  777,  774,  786,  775,  778,  782,
+      778,  783,  778,  779,  787,  783,  782,  784,  790,  785,
+      778,  788,  786,  778,  784,  792,  790,  792,  791,  789,
+      787,  793,  794,  786,    0,  778,  791,  778,  795,  778,
+      796,  787,  793,  797,  799,  798,  797,  778,  790,  798,
+      778,  796,  792,    0,  792,  800,  789,  804,  793,  794,
+      802,  790,  791,    0,  802,  795,  805,  796,  804,  793,
+      803,  799,  798,  801,    0,  790,  798,  803,  796,    0,
+
+      797,    0,  800,  807,  804,  801,  807,  802,  790,  791,
+      797,  802,  809,  805,  810,  804,  811,  803,  808,    0,
+      801,  808,  809,  816,  803,  810,  812,  797,  811,  815,
+      814,  807,  801,  815,  808,  812,  817,  797,  814,  809,
+      818,  810,  819,  811,  818,  820,  808,  822,  827,  809,
+      816,  820,  810,  812,  821,  811,  815,  814,  826,  821,
+      815,  827,  812,  817,  823,  814,  824,  818,  824,  819,
+      828,  818,  820,  825,  822,  823,  827,  825,  820,  828,
+      829,  821,  830,  832,  831,  826,  821,  830,  833,  833,
+      834,  823,  835,  824,  832,  824,  835,  828,  831,  837,
+
+      825,  838,  823,  827,  825,  840,  828,  829,  836,  830,
+      832,  831,  838,  842,  830,  833,  833,  834,  836,  835,
+      839,  832,    0,  835,  844,  831,  837,  843,  838,  841,
+      839,  843,  840,  844,  845,  836,  847,  841,  845,  838,
+      842,  846,  853,    0,  848,  836,  847,  839,  848,  849,
+      856,  844,  846,  849,  843,  850,  841,  839,  843,  856,
+      844,  845,  851,  847,  841,  845,  851,    0,  846,  853,
+      850,  848,  852,  847,  854,  848,  849,  856,  852,  846,
+      849,  855,  850,  859,  855,  860,  856,  854,  857,  851,
+      858,  861,  857,  851,  858,  863,  859,  850,  862,  852,
+
+      864,  854,  861,  865,  862,  852,  863,  867,  855,    0,
+      864,  855,  860,  867,  866,  857,  859,  858,  861,  857,
+        0,  858,  863,  871,    0,  862,  866,  864,  854,  861,
+      865,  862,  873,  863,  867,  874,  870,  864,  870,  870,
+      867,  866,  868,  859,  868,  868,  872,  868,  876,  880,
+      871,  870,  881,  866,  880,  872,  882,  879,  877,  873,
+      877,  877,  874,  877,  870,  878,  883,  868,  879,  884,
+      886,  878,  891,  872,  885,  876,  880,  890,  886,  881,
+      887,  880,  872,  882,  879,  885,  868,  887,  890,    0,
+      888,    0,  878,  883,  888,  879,  884,  886,  878,  891,
+
+      889,  885,  894,  898,  890,  886,  889,  887,  895,  901,
+      902,    0,  885,  868,  887,  890,  892,  888,  893,  895,
+      892,  888,  893,    0,    0,    0,  903,  889,    0,  894,
+      898,    0,    0,  889,    0,  895,  901,  902,  896,  899,
+      896,  896,  899,  892,  904,  893,  895,  892,  904,  893,
+      896,  896,  896,  903,  900,  896,  896,  896,  896,  896,
+      897,  897,  897,  897,  897,  905,  899,  900,  906,  899,
+      907,  904,  908,  909,  910,  904,  912,  909,  911,  910,
+      913,  911,  915,  914,  913,  916,  900,  914,  917,  923,
+      920,  912,  905,  927,    0,  906,  929,  907,  920,  908,
+
+      909,  910,  930,  912,  909,  911,  910,  913,  911,  915,
+      914,  913,  916,  900,  914,  917,  923,  928,  912,  933,
+      927,  928,  931,  929,  932,  931,  934,  932,  935,  930,
+      937,  936,  935,  936,  936,  920,  936,  934,  940,    0,
+      938,  940,  937,  941,  928,  942,  933,  943,  928,  942,
+      943,  944,  947,  934,  949,  935,  938,  937,  945,  935,
+      950,  932,  920,  945,  934,  931,  940,  938,  936,  937,
+      941,  946,  942,  950,  943,  946,  942,  943,  944,  947,
+      948,  949,  951,  938,  948,  945,  951,  950,  932,  952,
+      945,  953,  931,  954,    0,  936,  952,  955,  946,  956,
+
+      950,  961,  946,  957,  954,  957,  958,  948,  962,  951,
+      955,  948,  956,  951,  958,  959,  961,  960,  953,  959,
+      954,  960,  963,  952,  965,  964,  956,  967,  955,  969,
+      957,  954,  957,  958,  966,  962,  964,  966,  970,  956,
+      968,  958,  959,  961,  960,  968,  959,  971,  960,  963,
+      952,  965,  964,  972,  967,  955,  969,  978,  974,  973,
+      975,  966,  987,  964,  966,  970,  973,  968,  976,  977,
+      975,  976,  968,  978,  971,  979,  980,  982,    0,  979,
+      972,  974,  977,  981,  978,  980,  973,  975,  984,  987,
+      982,  984,  981,  973,  977,  976, 1193,  975,  976, 1193,
+
+      978,  989,  979,  980,  991,  982,  979,  983,  974,  985,
+      981,  983,  980,  985,    0,  984,  996,  988,  984,  981,
+      986,  977,  986,  986, 1193,  986,  988,    0,  989,  993,
+        0,  991,  982,  993,  983,  994,  985,    0,  983,  995,
+      985,  994,  995,  996,  988,  986,  992, 1000,  992,  992,
+      997,  992,  997,  988,  999,  998,  993,  986,  999, 1001,
+      993, 1002,  994, 1001,  986,    0,  995,  986,  994,  995,
+      998, 1003, 1007, 1002, 1000, 1003, 1004,  997, 1004,  997,
+     1008,  999, 1013, 1005,  986,  999, 1001,    0, 1002, 1005,
+     1001,  986, 1006, 1014,  986, 1015, 1006,  998, 1003, 1007,
+
+     1002, 1015, 1003, 1004, 1012, 1004,    0, 1008, 1011, 1013,
+     1005, 1011, 1009, 1016, 1009, 1009, 1005, 1012, 1017, 1006,
+     1014, 1018, 1015, 1006, 1009, 1009, 1009, 1019, 1015, 1009,
+     1009, 1009, 1009, 1009, 1020, 1011, 1021, 1012, 1011, 1022,
+     1016, 1024, 1023, 1025, 1026, 1017, 1023, 1027, 1018, 1025,
+     1022, 1030, 1031, 1032, 1019, 1033, 1035,    0, 1030, 1035,
+     1031, 1020, 1036, 1021, 1012, 1038, 1022,    0, 1024, 1023,
+     1025, 1026, 1034, 1023, 1027, 1039, 1025, 1022, 1039, 1031,
+     1032, 1041, 1033, 1035, 1034, 1030, 1035, 1031, 1042, 1036,
+     1040, 1043, 1038, 1044, 1040, 1043, 1047, 1030, 1050, 1034,
+
+     1048, 1051, 1039, 1049, 1052, 1039, 1053, 1049, 1041, 1055,
+     1051, 1034, 1030, 1048, 1056, 1042, 1057, 1040, 1043, 1058,
+     1044, 1040, 1043, 1047, 1030, 1050, 1048, 1062, 1051, 1059,
+     1049, 1052, 1061, 1053, 1049, 1059, 1055, 1051, 1060, 1063,
+     1065, 1056, 1060, 1057, 1064, 1061, 1058, 1066, 1067, 1068,
+     1070, 1071, 1066, 1048, 1062,    0, 1059, 1064, 1072, 1077,
+        0, 1061, 1059,    0, 1079, 1060, 1063, 1065, 1073, 1060,
+     1073, 1073, 1076, 1073, 1066, 1067, 1068, 1070, 1071, 1066,
+     1078, 1076, 1064, 1080, 1078, 1072, 1077, 1075, 1061, 1075,
+     1075, 1079, 1081, 1073, 1081, 1083, 1082, 1084, 1086, 1076,
+
+     1082, 1088, 1075, 1086, 1092,    0, 1084, 1078, 1076, 1064,
+     1080, 1078, 1073, 1087, 1090, 1075, 1097, 1098, 1090, 1081,
+     1087, 1081, 1083, 1082, 1084, 1086, 1089, 1082, 1088, 1091,
+     1086, 1092, 1089, 1084,    0, 1093, 1095, 1099, 1091, 1073,
+     1087, 1090, 1095, 1097, 1098, 1090, 1093, 1087,    0,    0,
+        0,    0,    0, 1089, 1096, 1100, 1091, 1101, 1094, 1089,
+     1094, 1094, 1093, 1095, 1099, 1091, 1103, 1096, 1096, 1095,
+     1094, 1094, 1094, 1093, 1105, 1094, 1094, 1094, 1094, 1094,
+     1107, 1102, 1100, 1104, 1101, 1102, 1106, 1104, 1110, 1106,
+     1114, 1107, 1108, 1103, 1114, 1096, 1109, 1108, 1116, 1112,
+
+        0, 1105, 1112, 1109,    0,    0, 1115, 1107, 1102, 1115,
+     1104, 1117, 1102, 1106, 1104, 1110, 1106, 1114, 1107, 1108,
+     1117, 1114,    0, 1120, 1108, 1116, 1112, 1118, 1123, 1112,
+     1118, 1120, 1121, 1115,    0, 1122, 1115, 1123, 1117, 1124,
+     1121, 1120, 1109,    0, 1124, 1128, 1130, 1117, 1122, 1122,
+     1128, 1129, 1132, 1137, 1118, 1123, 1134, 1118, 1135, 1130,
+     1129, 1120, 1135,    0, 1123,    0, 1124, 1134,    0, 1109,
+     1121, 1124, 1128, 1140, 1130, 1139, 1122, 1128, 1129, 1132,
+     1137, 1139, 1141, 1134, 1144, 1135, 1145, 1129, 1120, 1135,
+     1138, 1146, 1138, 1138, 1134, 1138, 1142, 1121, 1149, 1146,
+
+     1140, 1130, 1139, 1143, 1150, 1151, 1152, 1142, 1139, 1141,
+     1153, 1144, 1143, 1145, 1151, 1154, 1157, 1152, 1146,    0,
+     1156, 1158,    0, 1142, 1156, 1149, 1146, 1159,    0, 1157,
+     1143, 1150, 1151, 1152, 1142,    0,    0, 1153, 1161, 1143,
+     1163, 1151, 1154, 1155, 1152, 1155, 1155, 1156, 1158, 1157,
+     1164, 1156, 1165, 1166, 1159, 1155, 1155, 1155, 1167, 1168,
+     1155, 1155, 1155, 1155, 1155, 1161, 1169, 1163, 1171, 1173,
+     1174, 1175, 1176, 1177, 1174, 1175, 1157, 1164, 1171, 1165,
+     1166, 1178, 1180, 1181, 1182, 1167, 1168, 1186, 1187, 1178,
+     1180, 1181, 1182, 1169, 1185, 1171, 1173, 1174, 1175, 1176,
+
+     1177, 1174, 1175, 1184, 1189, 1171, 1190, 1185,    0, 1194,
+     1191, 1184, 1195, 1196, 1186, 1187, 1197, 1181, 1197, 1178,
+     1180, 1198, 1182, 1191, 1199, 1201, 1200, 1185, 1202, 1205,
+        0, 1189, 1202, 1190, 1200, 1191, 1194, 1184,    0, 1195,
+     1196, 1204,    0, 1197, 1181, 1197, 1178, 1180, 1198, 1182,
+     1209, 1199, 1201, 1200, 1185, 1202, 1205, 1204, 1210, 1202,
+     1208, 1200, 1191, 1211, 1184, 1207, 1212, 1206, 1204, 1206,
+     1206, 1213, 1206, 1208, 1207, 1214, 1206, 1209, 1215, 1216,
+     1217, 1219, 1216, 1220, 1204, 1210, 1218, 1220, 1221, 1215,
+     1211, 1223, 1207, 1212, 1208, 1218, 1221, 1225, 1213, 1223,
+
+     1227, 1207, 1214, 1232, 1234, 1215, 1216, 1217, 1219, 1216,
+     1220, 1233, 1231, 1218, 1220, 1229, 1215, 1236,    0, 1238,
+     1233, 1208, 1218, 1231, 1225, 1223, 1221, 1227, 1229, 1235,
+     1232, 1234, 1244, 1235, 1245, 1242, 1246, 1229, 1233, 1231,
+     1237,    0, 1237, 1237, 1236, 1237, 1238, 1233, 1242, 1247,
+     1231, 1241, 1223, 1221, 1249, 1251, 1235, 1253, 1255, 1244,
+     1235, 1245, 1241, 1246, 1229, 1237, 1239, 1242, 1239, 1239,
+     1250, 1239, 1252, 1260, 1250, 1239, 1247, 1237, 1241, 1258,
+     1261, 1249, 1251, 1252, 1253, 1255, 1263,    0, 1262, 1241,
+     1267,    0, 1258, 1269, 1242, 1258, 1262, 1250, 1270, 1252,
+
+     1260, 1250, 1273, 1264, 1237, 1264, 1264, 1261, 1264, 1265,
+     1252, 1265, 1265, 1263, 1265, 1262, 1266, 1267, 1266, 1266,
+     1269, 1266, 1258, 1262, 1274, 1270, 1275, 1278, 1264, 1273,
+     1277, 1279, 1283, 1282, 1265, 1279, 1282, 1275, 1284, 1287,
+     1264, 1266,    0, 1277, 1280, 1289, 1280, 1280,    0, 1280,
+        0, 1274, 1291, 1275, 1278, 1293,    0,    0, 1279, 1283,
+     1282,    0, 1279, 1282, 1275, 1284, 1287, 1264, 1277, 1280,
+        0, 1281, 1289, 1281, 1281, 1290, 1281, 1290, 1290, 1291,
+     1290, 1294, 1293, 1294, 1294, 1295, 1294, 1295, 1295, 1300,
+     1295, 1296, 1299, 1298, 1302, 1277, 1281, 1296, 1301, 1302,
+
+     1290, 1298, 1303, 1299, 1301,    0, 1294,    0,    0,    0,
+     1295,    0, 1290,    0,    0,    0, 1300,    0, 1296, 1299,
+     1298, 1302,    0,    0, 1296, 1301, 1302,    0, 1298, 1303,
+     1299, 1301,    0,    0,    0,    0,    0,    0,    0, 1290,
+     1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305,
+     1305, 1305, 1305, 1305, 1305, 1305, 1306, 1306, 1306, 1306,
+     1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306,
+     1306, 1306, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307,
+     1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1308, 1308,
+     1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308,
+
+     1308, 1308, 1308, 1308, 1309, 1309, 1309, 1309, 1309, 1309,
+     1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309,
+     1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310,
+     1310, 1310, 1310, 1310, 1310, 1310, 1311, 1311, 1311, 1311,
+     1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311,
+     1311, 1311, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312,
+     1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1313, 1313,
+     1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313,
+     1313, 1313, 1313, 1313, 1314, 1314,    0, 1314,    0, 1314,
+        0, 1314, 1314, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+
+     1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1316,
+     1316,    0, 1316,    0, 1316,    0, 1316, 1316, 1317, 1317,
+        0, 1317,    0, 1317, 1317, 1317, 1317, 1318,    0,    0,
+     1318,    0,    0, 1318, 1318, 1318, 1318, 1318, 1318, 1318,
+     1318, 1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320,
+     1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
+     1320, 1320, 1320, 1320, 1320, 1321, 1321,    0, 1321,    0,
+     1321,    0, 1321, 1322, 1322,    0, 1322,    0, 1322,    0,
+     1322, 1323, 1323,    0, 1323,    0, 1323,    0, 1323, 1324,
+
+     1324,    0, 1324,    0, 1324,    0, 1324, 1325, 1325, 1325,
+     1325,    0, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325,
+     1325, 1325, 1325, 1326, 1326, 1326, 1326,    0, 1326, 1326,
+     1326, 1326, 1326, 1326, 1326, 1326, 1326,    0, 1326, 1327,
+     1327, 1327, 1327,    0, 1327, 1327, 1327, 1327, 1327, 1327,
+     1327, 1327, 1327, 1327, 1327, 1328, 1328, 1328, 1328,    0,
+     1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328,
+     1328, 1329, 1329, 1329, 1329,    0, 1329, 1329, 1329, 1329,
+     1329, 1329, 1329, 1329, 1329,    0, 1329, 1330, 1330, 1330,
+     1330,    0, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330,
+
+     1330, 1330, 1330, 1331, 1331,    0,    0,    0, 1331,    0,
+     1331, 1331, 1331, 1331,    0,    0,    0, 1331, 1331, 1332,
+     1332,    0, 1332,    0, 1332,    0, 1332, 1333, 1333,    0,
+     1333,    0, 1333,    0, 1333, 1334, 1334,    0, 1334,    0,
+     1334,    0, 1334, 1335,    0,    0,    0,    0, 1335, 1335,
+     1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1336,
+     1336,    0,    0, 1336, 1336, 1336, 1336, 1336, 1336, 1336,
+     1336, 1336, 1336, 1336, 1336, 1337, 1337,    0,    0, 1337,
+     1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337,
+     1337, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338,
+
+     1338, 1338, 1338, 1338, 1338, 1338, 1338, 1339, 1339, 1339,
+     1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339,
+     1339, 1339, 1339, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+     1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1341,
+     1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+     1341, 1341, 1341, 1341, 1341, 1342, 1342, 1342, 1342, 1342,
+     1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342,
+     1342, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343,
+     1343, 1343, 1343, 1343, 1343, 1343, 1343, 1344, 1344,    0,
+     1344,    0, 1344,    0, 1344, 1344, 1345, 1345,    0, 1345,
+
+        0, 1345,    0, 1345, 1345, 1346, 1346,    0, 1346,    0,
+     1346,    0, 1346, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+     1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1348,
+     1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348,
+     1348, 1348, 1348, 1348, 1348, 1349, 1349,    0, 1349,    0,
+     1349,    0, 1349, 1349, 1350, 1350,    0, 1350,    0, 1350,
+        0, 1350, 1350, 1351, 1351,    0, 1351,    0, 1351,    0,
+     1351, 1351, 1352, 1352,    0, 1352,    0, 1352,    0, 1352,
+     1352, 1353, 1353,    0, 1353,    0, 1353, 1353, 1353, 1353,
+     1354,    0,    0, 1354,    0,    0, 1354, 1354, 1354, 1354,
+
+     1354, 1354, 1354, 1354, 1354, 1354, 1355, 1355, 1355, 1355,
+     1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355,
+     1355, 1355, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356,
+     1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1357, 1357,
+     1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357,
+     1357, 1357, 1357, 1357, 1358, 1358,    0, 1358,    0, 1358,
+        0, 1358, 1359, 1359, 1359,    0, 1359,    0, 1359,    0,
+     1359, 1360, 1360,    0, 1360,    0, 1360,    0, 1360, 1361,
+     1361, 1361, 1361,    0, 1361,    0, 1361, 1362, 1362, 1362,
+     1362,    0, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362,
+
+     1362, 1362, 1362, 1363, 1363, 1363, 1363,    0, 1363, 1363,
+     1363, 1363, 1363, 1363, 1363, 1363, 1363,    0, 1363, 1364,
+     1364, 1364, 1364,    0, 1364, 1364, 1364, 1364, 1364, 1364,
+     1364,    0, 1364,    0, 1364, 1365, 1365,    0,    0,    0,
+     1365,    0, 1365, 1365, 1365, 1365,    0,    0,    0, 1365,
+     1365, 1366, 1366, 1366, 1366,    0, 1366, 1366, 1366, 1366,
+     1366, 1366, 1366, 1366, 1366, 1366, 1366, 1367, 1367, 1367,
+     1367,    0, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367,
+     1367, 1367, 1367, 1368, 1368,    0,    0,    0, 1368, 1368,
+     1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1369,
+
+     1369, 1369, 1369,    0, 1369, 1369, 1369, 1369, 1369, 1369,
+     1369, 1369, 1369, 1369, 1369, 1370, 1370, 1370, 1370,    0,
+     1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370,
+     1370, 1371, 1371,    0,    0,    0, 1371,    0, 1371, 1371,
+     1371, 1371, 1371, 1371,    0, 1371, 1371, 1372, 1372, 1372,
+     1372,    0, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
+     1372, 1372, 1372, 1373, 1373, 1373, 1373,    0, 1373, 1373,
+     1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1374,
+     1374, 1374, 1374,    0, 1374, 1374, 1374, 1374, 1374, 1374,
+     1374, 1374, 1374, 1374, 1374, 1375, 1375,    0,    0,    0,
+
+     1375,    0, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+     1375, 1376, 1376, 1376,    0, 1376,    0, 1376,    0, 1376,
+     1377, 1377,    0, 1377,    0, 1377,    0, 1377, 1378, 1378,
+     1378, 1378,    0, 1378,    0, 1378, 1379,    0,    0,    0,
+        0, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379,
+     1379, 1379, 1380, 1380,    0,    0, 1380, 1380, 1380, 1380,
+     1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1381, 1381,
+        0,    0, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+     1381, 1381, 1381, 1381, 1382, 1382,    0,    0, 1382, 1382,
+     1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
+
+     1383, 1383,    0,    0, 1383, 1383, 1383, 1383, 1383, 1383,
+     1383, 1383, 1383, 1383, 1383, 1383, 1384, 1384, 1384, 1384,
+     1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+     1384, 1384, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385,
+     1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1386, 1386,
+     1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386,
+     1386, 1386, 1386, 1386, 1387, 1387, 1387, 1387, 1387, 1387,
+     1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+     1388, 1388,    0, 1388,    0, 1388,    0, 1388, 1388, 1389,
+     1389,    0, 1389,    0, 1389,    0, 1389, 1390, 1390, 1390,
+
+     1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390,
+     1390, 1390, 1390, 1391, 1391,    0, 1391,    0, 1391,    0,
+     1391, 1391, 1392, 1392,    0, 1392,    0, 1392,    0, 1392,
+     1392, 1393, 1393,    0, 1393,    0, 1393, 1393, 1393, 1393,
+     1394, 1394, 1394, 1394,    0, 1394, 1394, 1394, 1394, 1394,
+     1394, 1394,    0, 1394, 1394, 1394, 1395, 1395, 1395, 1395,
+        0, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395,
+     1395, 1395, 1396, 1396, 1396, 1396,    0, 1396, 1396, 1396,
+     1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1397, 1397,
+     1397, 1397,    0, 1397, 1397, 1397, 1397, 1397, 1397, 1397,
+
+     1397, 1397, 1397, 1397, 1398, 1398,    0,    0,    0, 1398,
+     1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+     1399, 1399,    0,    0,    0, 1399,    0, 1399, 1399, 1399,
+     1399, 1399, 1399,    0, 1399, 1399, 1400, 1400,    0,    0,
+        0, 1400,    0, 1400, 1400, 1400, 1400, 1400, 1400, 1400,
+     1400, 1400, 1401,    0,    0, 1401,    0, 1401, 1401,    0,
+     1401,    0, 1401,    0, 1401, 1402, 1402,    0, 1402,    0,
+     1402,    0, 1402, 1402, 1403, 1403,    0, 1403,    0, 1403,
+        0, 1403, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404,
+     1404, 1404, 1404, 1404, 1404, 1404, 1404, 1405, 1405,    0,
+
+     1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+     1405, 1405, 1406,    0,    0, 1406,    0, 1406, 1406,    0,
+     1406,    0, 1406,    0, 1406, 1407,    0, 1407, 1407, 1407,
+        0,    0, 1407, 1407, 1407, 1408, 1408,    0, 1408,    0,
+     1408,    0, 1408, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304,
+     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304
+    } ;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "src/l.l"
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+#line 30 "src/l.l"
+  
+/*
+ * DESCRIPTION
+ *
+ *   Lexical grammar for tokenizing the control file. 
+ *
+ */
+
+#include "config.h"
+  
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_GLOB_H
+#include <glob.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "monit.h"
+#include "tokens.h"
+        
+// libmonit
+#include "util/Str.h"
+
+
+#define MAX_STACK_DEPTH 512
+
+  int buffer_stack_ptr=0;
+
+  struct buffer_stack_s {
+    int             lineno;
+    char           *currentfile;
+    YY_BUFFER_STATE buffer;
+  } buffer_stack[MAX_STACK_DEPTH];
+  
+  
+  int lineno= 1;
+  int arglineno= 1;
+  char *currentfile=NULL;
+  char *argcurrentfile=NULL;
+  char *argyytext=NULL;
+
+  
+  /* Prototypes */
+  extern void yyerror(const char*,...);
+  extern void yywarning(const char *,...);
+  static void steplinenobycr(char *);
+  static void save_arg(void);
+  static void include_file(char *);
+  static char *handle_quoted_string(char *);
+  static void push_buffer_state(YY_BUFFER_STATE, char*);
+  static int  pop_buffer_state(void);
+  static URL_T create_URL(char *proto);
+  
+
+#line 2788 "src/lex.yy.c"
+
+#define INITIAL 0
+#define ARGUMENT_COND 1
+#define DEPEND_COND 2
+#define SERVICE_COND 3
+#define URL_COND 4
+#define STRING_COND 5
+#define EVERY_COND 6
+#define INCLUDE 7
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy (void );
+
+int yyget_debug (void );
+
+void yyset_debug (int debug_flag  );
+
+YY_EXTRA_TYPE yyget_extra (void );
+
+void yyset_extra (YY_EXTRA_TYPE user_defined  );
+
+FILE *yyget_in (void );
+
+void yyset_in  (FILE * in_str  );
+
+FILE *yyget_out (void );
+
+void yyset_out  (FILE * out_str  );
+
+int yyget_leng (void );
+
+char *yyget_text (void );
+
+int yyget_lineno (void );
+
+void yyset_lineno (int line_number  );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap (void );
+#else
+extern int yywrap (void );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  );
+    
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+		{ \
+		int c = '*'; \
+		size_t n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    
+#line 118 "src/l.l"
+
+
+#line 2985 "src/lex.yy.c"
+
+	if ( !(yy_init) )
+		{
+		(yy_init) = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+        /* Create the reject buffer large enough to save one state per allowed character. */
+        if ( ! (yy_state_buf) )
+            (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE  );
+            if ( ! (yy_state_buf) )
+                YY_FATAL_ERROR( "out of dynamic memory in yylex()" );
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			yyensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				yy_create_buffer(yyin,YY_BUF_SIZE );
+		}
+
+		yy_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of yytext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+
+		(yy_state_ptr) = (yy_state_buf);
+		*(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 1305 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			*(yy_state_ptr)++ = yy_current_state;
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 6744 );
+
+yy_find_action:
+		yy_current_state = *--(yy_state_ptr);
+		(yy_lp) = yy_accept[yy_current_state];
+find_rule: /* we branch to this label when backing up */
+		for ( ; ; ) /* until we find what rule we matched */
+			{
+			if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+				{
+				yy_act = yy_acclist[(yy_lp)];
+				if ( yy_act & YY_TRAILING_HEAD_MASK ||
+				     (yy_looking_for_trail_begin) )
+					{
+					if ( yy_act == (yy_looking_for_trail_begin) )
+						{
+						(yy_looking_for_trail_begin) = 0;
+						yy_act &= ~YY_TRAILING_HEAD_MASK;
+						break;
+						}
+					}
+				else if ( yy_act & YY_TRAILING_MASK )
+					{
+					(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+					(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+					}
+				else
+					{
+					(yy_full_match) = yy_cp;
+					(yy_full_state) = (yy_state_ptr);
+					(yy_full_lp) = (yy_lp);
+					break;
+					}
+				++(yy_lp);
+				goto find_rule;
+				}
+			--yy_cp;
+			yy_current_state = *--(yy_state_ptr);
+			(yy_lp) = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 120 "src/l.l"
+{ /* Wide white space */ }
+	YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 121 "src/l.l"
+{ lineno++; } 
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 123 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 124 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 125 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 126 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 127 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 128 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 129 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 130 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 131 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 132 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 133 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 134 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 135 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 136 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 137 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 138 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 139 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 140 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 141 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 142 "src/l.l"
+{/* EMPTY */}
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 144 "src/l.l"
+{ BEGIN(ARGUMENT_COND); return START; }
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 145 "src/l.l"
+{ BEGIN(ARGUMENT_COND); return STOP; }
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 146 "src/l.l"
+{ BEGIN(ARGUMENT_COND); return RESTART; }
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 147 "src/l.l"
+{ BEGIN(ARGUMENT_COND); return EXEC; }
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 149 "src/l.l"
+{ return IF; }
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 150 "src/l.l"
+{ return OR; }
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 151 "src/l.l"
+{ return THEN; }
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 152 "src/l.l"
+{ return FAILED; }
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 153 "src/l.l"
+{ return HTTPDSSL; }
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 154 "src/l.l"
+{ return ENABLE; }
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 155 "src/l.l"
+{ return DISABLE; }
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 156 "src/l.l"
+{ return SET; }
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 157 "src/l.l"
+{ return DAEMON; }
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 158 "src/l.l"
+{ return DELAY; }
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 159 "src/l.l"
+{ return LOGFILE; }
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 160 "src/l.l"
+{ return SYSLOG; }
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 161 "src/l.l"
+{ return FACILITY; }
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 162 "src/l.l"
+{ return HTTPD; }
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 163 "src/l.l"
+{ return ADDRESS; }
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 164 "src/l.l"
+{ return CLIENTPEMFILE; }
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 165 "src/l.l"
+{ return ALLOWSELFCERTIFICATION; }
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 166 "src/l.l"
+{ return CERTMD5; }
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 167 "src/l.l"
+{ return PEMFILE; }
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 168 "src/l.l"
+{ return INIT; }
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 169 "src/l.l"
+{ return ALLOW; }
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 170 "src/l.l"
+{ return READONLY; }
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 171 "src/l.l"
+{ return PIDFILE; }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 172 "src/l.l"
+{ return IDFILE; }
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 173 "src/l.l"
+{ return STATEFILE; }
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 174 "src/l.l"
+{ return PATHTOK; }
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 175 "src/l.l"
+{ return START; }
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 176 "src/l.l"
+{ return STOP; }
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 177 "src/l.l"
+{ return PORT; }
+	YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 178 "src/l.l"
+{ return UNIXSOCKET; }
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 179 "src/l.l"
+{ return TYPE; }
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 180 "src/l.l"
+{ return PROTOCOL; }
+	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 181 "src/l.l"
+{ return TCP; }
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 182 "src/l.l"
+{ return TCPSSL; }
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 183 "src/l.l"
+{ return UDP; }
+	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 184 "src/l.l"
+{ return ALERT; }
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 185 "src/l.l"
+{ return NOALERT; }
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 186 "src/l.l"
+{ return MAILFORMAT; }
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 187 "src/l.l"
+{ return RESOURCE; }
+	YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 188 "src/l.l"
+{ return RESTART; }
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 189 "src/l.l"
+{ return CYCLE;}
+	YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 190 "src/l.l"
+{ return TIMEOUT; }
+	YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 191 "src/l.l"
+{ return RETRY; }
+	YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 192 "src/l.l"
+{ return CHECKSUM; }
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 193 "src/l.l"
+{ return MAILSERVER; }
+	YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 194 "src/l.l"
+{ return HOST; }
+	YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 195 "src/l.l"
+{ return HOSTHEADER; }
+	YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 196 "src/l.l"
+{ return STATUS; }
+	YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 197 "src/l.l"
+{ return SYSTEM; }
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 198 "src/l.l"
+{ return DEFAULT; }
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 199 "src/l.l"
+{ return HTTP; }
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 200 "src/l.l"
+{ return APACHESTATUS; }
+	YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 201 "src/l.l"
+{ return FTP; }
+	YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 202 "src/l.l"
+{ return SMTP; }
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 203 "src/l.l"
+{ return POSTFIXPOLICY; }
+	YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 204 "src/l.l"
+{ return POP; }
+	YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 205 "src/l.l"
+{ return IMAP; }
+	YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 206 "src/l.l"
+{ return CLAMAV; }
+	YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 207 "src/l.l"
+{ return DNS; }
+	YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 208 "src/l.l"
+{ return MYSQL; }
+	YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 209 "src/l.l"
+{ return NNTP; }
+	YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 210 "src/l.l"
+{ return NTP3; }
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 211 "src/l.l"
+{ return SSH; }
+	YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 212 "src/l.l"
+{ return DWP; }
+	YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 213 "src/l.l"
+{ return LDAP2; }
+	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 214 "src/l.l"
+{ return LDAP3; }
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 215 "src/l.l"
+{ return RDATE; }
+	YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 216 "src/l.l"
+{ return LMTP; }
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 217 "src/l.l"
+{ return RSYNC; }
+	YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 218 "src/l.l"
+{ return TNS; }
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 219 "src/l.l"
+{ return PGSQL; }
+	YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 220 "src/l.l"
+{ return SIP; } 
+	YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 221 "src/l.l"
+{ return GPS; } 
+	YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 222 "src/l.l"
+{ return RADIUS; }
+	YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 223 "src/l.l"
+{ return MEMCACHE; }
+	YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 224 "src/l.l"
+{ return TARGET; }
+	YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 225 "src/l.l"
+{ return MAXFORWARD; }
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 226 "src/l.l"
+{ return MODE; }
+	YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 227 "src/l.l"
+{ return ACTIVE; }
+	YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 228 "src/l.l"
+{ return PASSIVE; }
+	YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 229 "src/l.l"
+{ return MANUAL; }
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 230 "src/l.l"
+{ return UID; }
+	YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 231 "src/l.l"
+{ return GID; }
+	YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 232 "src/l.l"
+{ return REQUEST; }
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 233 "src/l.l"
+{ return SECRET; }
+	YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 234 "src/l.l"
+{ return LOGLIMIT; }
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 235 "src/l.l"
+{ return CLOSELIMIT; }
+	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 236 "src/l.l"
+{ return DNSLIMIT; }
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 237 "src/l.l"
+{ return KEEPALIVELIMIT; }
+	YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 238 "src/l.l"
+{ return REPLYLIMIT; }
+	YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 239 "src/l.l"
+{ return REQUESTLIMIT; }
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 240 "src/l.l"
+{ return STARTLIMIT; }
+	YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 241 "src/l.l"
+{ return WAITLIMIT; }
+	YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 242 "src/l.l"
+{ return GRACEFULLIMIT; }
+	YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 243 "src/l.l"
+{ return CLEANUPLIMIT; }
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 244 "src/l.l"
+{ return MEMORY; }
+	YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 245 "src/l.l"
+{ return SWAP; }
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 246 "src/l.l"
+{ return TOTALMEMORY; }
+	YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 247 "src/l.l"
+{ return CPU; }
+	YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 248 "src/l.l"
+{ return TOTALCPU; }
+	YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 249 "src/l.l"
+{ return CHILDREN; }
+	YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 250 "src/l.l"
+{ return TIMESTAMP; }
+	YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 251 "src/l.l"
+{ return CHANGED; }
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 252 "src/l.l"
+{ return SECOND; }
+	YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 253 "src/l.l"
+{ return MINUTE; }
+	YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 254 "src/l.l"
+{ return HOUR; }
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 255 "src/l.l"
+{ return DAY; }
+	YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 256 "src/l.l"
+{ return SSLV2; }
+	YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 257 "src/l.l"
+{ return SSLV3; }
+	YY_BREAK
+case 136:
+YY_RULE_SETUP
+#line 258 "src/l.l"
+{ return TLSV1; }
+	YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 259 "src/l.l"
+{ return SSLAUTO; }
+	YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 260 "src/l.l"
+{ return INODE; }
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 261 "src/l.l"
+{ return SPACE; }
+	YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 262 "src/l.l"
+{ return PERMISSION; }
+	YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 263 "src/l.l"
+{ return EXEC; }
+	YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 264 "src/l.l"
+{ return SIZE; }
+	YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 265 "src/l.l"
+{ return UPTIME; }
+	YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 266 "src/l.l"
+{ return BASEDIR; }
+	YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 267 "src/l.l"
+{ return SLOT; }
+	YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 268 "src/l.l"
+{ return EVENTQUEUE; }
+	YY_BREAK
+case 147:
+YY_RULE_SETUP
+#line 269 "src/l.l"
+{ return MATCH; }
+	YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 270 "src/l.l"
+{ return NOT; }
+	YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 271 "src/l.l"
+{ return IGNORE; }
+	YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 272 "src/l.l"
+{ return CONNECTION; }
+	YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 273 "src/l.l"
+{ return UNMONITOR; }
+	YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 274 "src/l.l"
+{ return ACTION; }
+	YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 275 "src/l.l"
+{ return ICMP; }
+	YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 276 "src/l.l"
+{ return ICMPECHO; }
+	YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 277 "src/l.l"
+{ return SEND; }
+	YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 278 "src/l.l"
+{ return EXPECT; }
+	YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 279 "src/l.l"
+{ return EXPECTBUFFER; }
+	YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 280 "src/l.l"
+{ return CLEARTEXT; }
+	YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 281 "src/l.l"
+{ return MD5HASH; }
+	YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 282 "src/l.l"
+{ return SHA1HASH; }
+	YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 283 "src/l.l"
+{ return CRYPT; }
+	YY_BREAK
+case 162:
+YY_RULE_SETUP
+#line 284 "src/l.l"
+{ return SIGNATURE; }
+	YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 285 "src/l.l"
+{ return NONEXIST; }
+	YY_BREAK
+case 164:
+YY_RULE_SETUP
+#line 286 "src/l.l"
+{ return EXIST; }
+	YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 287 "src/l.l"
+{ return INVALID; }
+	YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 288 "src/l.l"
+{ return DATA; }
+	YY_BREAK
+case 167:
+YY_RULE_SETUP
+#line 289 "src/l.l"
+{ return RECOVERED; }
+	YY_BREAK
+case 168:
+YY_RULE_SETUP
+#line 290 "src/l.l"
+{ return PASSED; }
+	YY_BREAK
+case 169:
+YY_RULE_SETUP
+#line 291 "src/l.l"
+{ return SUCCEEDED; }
+	YY_BREAK
+case 170:
+YY_RULE_SETUP
+#line 292 "src/l.l"
+{ return ELSE; }
+	YY_BREAK
+case 171:
+YY_RULE_SETUP
+#line 293 "src/l.l"
+{ return MMONIT; }
+	YY_BREAK
+case 172:
+YY_RULE_SETUP
+#line 294 "src/l.l"
+{ return URL; }
+	YY_BREAK
+case 173:
+YY_RULE_SETUP
+#line 295 "src/l.l"
+{ return CONTENT; }
+	YY_BREAK
+case 174:
+YY_RULE_SETUP
+#line 296 "src/l.l"
+{ return PID; }
+	YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 297 "src/l.l"
+{ return PPID; }
+	YY_BREAK
+case 176:
+YY_RULE_SETUP
+#line 298 "src/l.l"
+{ return COUNT; }
+	YY_BREAK
+case 177:
+YY_RULE_SETUP
+#line 299 "src/l.l"
+{ return REMINDER; }
+	YY_BREAK
+case 178:
+YY_RULE_SETUP
+#line 300 "src/l.l"
+{ return INSTANCE; }
+	YY_BREAK
+case 179:
+YY_RULE_SETUP
+#line 301 "src/l.l"
+{ return HOSTNAME; }
+	YY_BREAK
+case 180:
+YY_RULE_SETUP
+#line 302 "src/l.l"
+{ return USERNAME; }
+	YY_BREAK
+case 181:
+YY_RULE_SETUP
+#line 303 "src/l.l"
+{ return PASSWORD; }
+	YY_BREAK
+case 182:
+YY_RULE_SETUP
+#line 304 "src/l.l"
+{ return CREDENTIALS; }
+	YY_BREAK
+case 183:
+YY_RULE_SETUP
+#line 305 "src/l.l"
+{ return REGISTER; }
+	YY_BREAK
+case 184:
+YY_RULE_SETUP
+#line 306 "src/l.l"
+{ return FSFLAG; }
+	YY_BREAK
+case 185:
+YY_RULE_SETUP
+#line 307 "src/l.l"
+{ return FIPS; }
+	YY_BREAK
+case 186:
+YY_RULE_SETUP
+#line 308 "src/l.l"
+{ return BYTE; }
+	YY_BREAK
+case 187:
+YY_RULE_SETUP
+#line 309 "src/l.l"
+{ return KILOBYTE; }
+	YY_BREAK
+case 188:
+YY_RULE_SETUP
+#line 310 "src/l.l"
+{ return MEGABYTE; }
+	YY_BREAK
+case 189:
+YY_RULE_SETUP
+#line 311 "src/l.l"
+{ return GIGABYTE; }
+	YY_BREAK
+case 190:
+YY_RULE_SETUP
+#line 312 "src/l.l"
+{ return LOADAVG1; }
+	YY_BREAK
+case 191:
+YY_RULE_SETUP
+#line 313 "src/l.l"
+{ return LOADAVG5; }
+	YY_BREAK
+case 192:
+YY_RULE_SETUP
+#line 314 "src/l.l"
+{ return LOADAVG15; }
+	YY_BREAK
+case 193:
+YY_RULE_SETUP
+#line 315 "src/l.l"
+{ return CPUUSER; }
+	YY_BREAK
+case 194:
+YY_RULE_SETUP
+#line 316 "src/l.l"
+{ return CPUSYSTEM; }
+	YY_BREAK
+case 195:
+YY_RULE_SETUP
+#line 317 "src/l.l"
+{ return CPUWAIT; }
+	YY_BREAK
+case 196:
+YY_RULE_SETUP
+#line 318 "src/l.l"
+{ return GREATER; }
+	YY_BREAK
+case 197:
+YY_RULE_SETUP
+#line 319 "src/l.l"
+{ return LESS; }
+	YY_BREAK
+case 198:
+YY_RULE_SETUP
+#line 320 "src/l.l"
+{ return EQUAL; }
+	YY_BREAK
+case 199:
+YY_RULE_SETUP
+#line 321 "src/l.l"
+{ return NOTEQUAL; }
+	YY_BREAK
+case 200:
+YY_RULE_SETUP
+#line 323 "src/l.l"
+{ BEGIN(INCLUDE); }
+	YY_BREAK
+case 201:
+YY_RULE_SETUP
+#line 325 "src/l.l"
+{ 
+                    BEGIN(EVERY_COND);
+                    return NOTEVERY;
+                  }
+	YY_BREAK
+case 202:
+YY_RULE_SETUP
+#line 330 "src/l.l"
+{ 
+                    BEGIN(EVERY_COND);
+                    return EVERY;
+                  }
+	YY_BREAK
+case 203:
+YY_RULE_SETUP
+#line 335 "src/l.l"
+{
+                    BEGIN(DEPEND_COND);
+                    return DEPENDS;
+                  } 
+	YY_BREAK
+case 204:
+YY_RULE_SETUP
+#line 340 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKPROC;
+                  }
+	YY_BREAK
+case 205:
+YY_RULE_SETUP
+#line 345 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKPROGRAM;
+                  }
+	YY_BREAK
+case 206:
+YY_RULE_SETUP
+#line 350 "src/l.l"
+{ /* Filesystem alias for backward compatibility  */
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILESYS;
+                  }
+	YY_BREAK
+case 207:
+YY_RULE_SETUP
+#line 355 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILESYS;
+                  }
+	YY_BREAK
+case 208:
+YY_RULE_SETUP
+#line 360 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKFILE;
+                  }
+	YY_BREAK
+case 209:
+YY_RULE_SETUP
+#line 365 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKDIR;
+                  }
+	YY_BREAK
+case 210:
+YY_RULE_SETUP
+#line 370 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKHOST;
+                  }
+	YY_BREAK
+case 211:
+YY_RULE_SETUP
+#line 375 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKSYSTEM;
+                  }
+	YY_BREAK
+case 212:
+YY_RULE_SETUP
+#line 380 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                    return CHECKFIFO;
+                  }
+	YY_BREAK
+case 213:
+YY_RULE_SETUP
+#line 385 "src/l.l"
+{
+                    BEGIN(SERVICE_COND);
+                        return CHECKPROGRAM;
+                  }
+	YY_BREAK
+case 214:
+YY_RULE_SETUP
+#line 390 "src/l.l"
+{
+                    BEGIN(STRING_COND);
+                    return GROUP;
+                  }
+	YY_BREAK
+case 215:
+YY_RULE_SETUP
+#line 395 "src/l.l"
+{
+		    yylval.url= 
+		      create_URL(Str_ndup(yytext, strlen(yytext)-3));
+                    BEGIN(URL_COND);
+                  }
+	YY_BREAK
+case 216:
+YY_RULE_SETUP
+#line 400 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return TIMESPEC;
+                  }
+	YY_BREAK
+case 217:
+YY_RULE_SETUP
+#line 405 "src/l.l"
+{
+                    yylval.number= atoi(yytext);
+                    save_arg(); return NUMBER;
+                  }
+	YY_BREAK
+case 218:
+YY_RULE_SETUP
+#line 410 "src/l.l"
+{
+                    yylval.real= atof(yytext);
+                    save_arg(); return REAL;
+                  }
+	YY_BREAK
+case 219:
+YY_RULE_SETUP
+#line 415 "src/l.l"
+{
+	            return PERCENT;
+                  }
+	YY_BREAK
+case 220:
+YY_RULE_SETUP
+#line 419 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return STRING;
+                  }
+	YY_BREAK
+case 221:
+YY_RULE_SETUP
+#line 424 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return PATH;
+                  }
+	YY_BREAK
+case 222:
+YY_RULE_SETUP
+#line 429 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return PATH;
+                  }
+	YY_BREAK
+case 223:
+/* rule 223 can match eol */
+YY_RULE_SETUP
+#line 434 "src/l.l"
+{
+                    steplinenobycr(yytext);
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return STRING;
+                  }
+	YY_BREAK
+case 224:
+/* rule 224 can match eol */
+YY_RULE_SETUP
+#line 440 "src/l.l"
+{
+                    steplinenobycr(yytext);
+                    yylval.string= handle_quoted_string(yytext);
+                    save_arg(); return STRING;
+                  }
+	YY_BREAK
+case 225:
+YY_RULE_SETUP
+#line 446 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return MAILADDR;
+                  }
+	YY_BREAK
+case 226:
+YY_RULE_SETUP
+#line 451 "src/l.l"
+{
+                     yylval.string= Str_dup(yytext);
+                     save_arg(); return PATH;
+                  }
+	YY_BREAK
+case 227:
+YY_RULE_SETUP
+#line 456 "src/l.l"
+{
+                     yylval.string= Str_dup(yytext);
+                     save_arg(); return PATH;
+                  }
+	YY_BREAK
+case 228:
+YY_RULE_SETUP
+#line 461 "src/l.l"
+{
+                      char *p= yytext+strlen("from:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILFROM;
+                  }
+	YY_BREAK
+case 229:
+YY_RULE_SETUP
+#line 467 "src/l.l"
+{
+                      char *p= yytext+strlen("reply-to:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILREPLYTO;
+                  }
+	YY_BREAK
+case 230:
+YY_RULE_SETUP
+#line 473 "src/l.l"
+{
+                      char *p= yytext+strlen("subject:");
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILSUBJECT;
+                  }
+	YY_BREAK
+case 231:
+/* rule 231 can match eol */
+YY_RULE_SETUP
+#line 479 "src/l.l"
+{
+                      char *p= yytext+strlen("message:");
+                      steplinenobycr(yytext);
+                      yylval.string = Str_trim(Str_dup(p));
+                      save_arg(); return MAILBODY;
+                  }
+	YY_BREAK
+case 232:
+YY_RULE_SETUP
+#line 486 "src/l.l"
+{
+                      yylval.string = Str_dup(yytext);
+                      save_arg(); return STRING;
+                  }
+	YY_BREAK
+case 233:
+YY_RULE_SETUP
+#line 491 "src/l.l"
+{
+                      yyerror("unbalanced quotes");
+                  }
+	YY_BREAK
+
+case 234:
+YY_RULE_SETUP
+#line 497 "src/l.l"
+;
+	YY_BREAK
+case 235:
+/* rule 235 can match eol */
+YY_RULE_SETUP
+#line 499 "src/l.l"
+{
+                    lineno++;
+                  }
+	YY_BREAK
+case 236:
+YY_RULE_SETUP
+#line 503 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+	YY_BREAK
+case 237:
+YY_RULE_SETUP
+#line 509 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+	YY_BREAK
+case 238:
+YY_RULE_SETUP
+#line 515 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return SERVICENAME;
+                  }
+	YY_BREAK
+case 239:
+YY_RULE_SETUP
+#line 521 "src/l.l"
+{
+                      yyerror("unbalanced quotes");
+                  }
+	YY_BREAK
+
+
+case 240:
+YY_RULE_SETUP
+#line 529 "src/l.l"
+;
+	YY_BREAK
+case 241:
+/* rule 241 can match eol */
+YY_RULE_SETUP
+#line 531 "src/l.l"
+{
+                    lineno++;
+                  }
+	YY_BREAK
+case 242:
+YY_RULE_SETUP
+#line 535 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    save_arg(); return SERVICENAME;
+                  }
+	YY_BREAK
+case 243:
+/* rule 243 can match eol */
+YY_RULE_SETUP
+#line 540 "src/l.l"
+{
+                    steplinenobycr(yytext);
+                    unput(yytext[strlen(yytext)-1]);
+                    BEGIN(INITIAL);
+                  }
+	YY_BREAK
+
+
+case 244:
+YY_RULE_SETUP
+#line 550 "src/l.l"
+;
+	YY_BREAK
+case 245:
+/* rule 245 can match eol */
+YY_RULE_SETUP
+#line 552 "src/l.l"
+{
+                    lineno++;
+                  }
+	YY_BREAK
+case 246:
+YY_RULE_SETUP
+#line 556 "src/l.l"
+{
+                      BEGIN(INITIAL);
+                  }
+	YY_BREAK
+case 247:
+/* rule 247 can match eol */
+YY_RULE_SETUP
+#line 560 "src/l.l"
+{
+                      steplinenobycr(yytext);
+                      yylval.string= handle_quoted_string(yytext);
+                      save_arg(); return STRING;
+                  }
+	YY_BREAK
+case 248:
+YY_RULE_SETUP
+#line 566 "src/l.l"
+{
+                      yyerror("unbalanced quotes");
+                  }
+	YY_BREAK
+case 249:
+YY_RULE_SETUP
+#line 570 "src/l.l"
+{
+                      yylval.string= Str_dup(yytext);
+                      save_arg(); return STRING;
+                  }
+	YY_BREAK
+
+
+case 250:
+/* rule 250 can match eol */
+YY_RULE_SETUP
+#line 579 "src/l.l"
+{
+                      BEGIN(INITIAL);
+		      if(!yylval.url->hostname)
+			yyerror("missing hostname in URL");
+		      if(!yylval.url->path)
+			yylval.url->path= Str_dup("/");
+                      yylval.url->url= Str_cat("%s://%s:%d%s%s%s",
+                        yylval.url->protocol,
+                        /* possible credentials are hidden */
+                        yylval.url->hostname,
+                        yylval.url->port,
+                        yylval.url->path,
+                        yylval.url->query?"?":"",
+                        yylval.url->query?yylval.url->query:"");
+		      save_arg(); return URLOBJECT;
+                  }
+	YY_BREAK
+case 251:
+/* rule 251 can match eol */
+YY_RULE_SETUP
+#line 596 "src/l.l"
+{
+	              yylval.url->user= Str_dup(yytext);
+                  }
+	YY_BREAK
+case 252:
+/* rule 252 can match eol */
+YY_RULE_SETUP
+#line 600 "src/l.l"
+{
+	              yytext++;
+	              yylval.url->password= Str_ndup(yytext, strlen(yytext)-1);
+                  }
+	YY_BREAK
+case 253:
+YY_RULE_SETUP
+#line 605 "src/l.l"
+{
+	              yylval.url->hostname= Str_dup(yytext);
+                  }
+	YY_BREAK
+case 254:
+YY_RULE_SETUP
+#line 609 "src/l.l"
+{
+	              yylval.url->port= atoi(++yytext);
+                  }
+	YY_BREAK
+case 255:
+YY_RULE_SETUP
+#line 613 "src/l.l"
+{
+	              yylval.url->path= Util_urlEncode(yytext);
+                  }
+	YY_BREAK
+case 256:
+YY_RULE_SETUP
+#line 617 "src/l.l"
+{
+	              yylval.url->query= Util_urlEncode(++yytext);
+                  }
+	YY_BREAK
+case 257:
+YY_RULE_SETUP
+#line 621 "src/l.l"
+{ 
+	              /* EMPTY - reference is ignored */ 
+                  }
+	YY_BREAK
+
+
+case 258:
+YY_RULE_SETUP
+#line 629 "src/l.l"
+{
+                    yylval.string= Str_dup(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+	YY_BREAK
+case 259:
+YY_RULE_SETUP
+#line 635 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+	YY_BREAK
+case 260:
+YY_RULE_SETUP
+#line 641 "src/l.l"
+{
+                    yylval.string= handle_quoted_string(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return STRINGNAME;
+                  }
+	YY_BREAK
+case 261:
+YY_RULE_SETUP
+#line 647 "src/l.l"
+{
+                      yyerror("unbalanced quotes");
+                  }
+	YY_BREAK
+
+
+case 262:
+YY_RULE_SETUP
+#line 655 "src/l.l"
+;
+	YY_BREAK
+case 263:
+YY_RULE_SETUP
+#line 657 "src/l.l"
+{
+                    yylval.number= atoi(yytext);
+                    BEGIN(INITIAL);
+                    save_arg(); return NUMBER;
+                  }
+	YY_BREAK
+case 264:
+YY_RULE_SETUP
+#line 663 "src/l.l"
+{ // A minimal syntax check of the cron format string; 5 fields separated with white-space
+                    yylval.string= Str_dup(Str_unquote(yytext));
+                    BEGIN(INITIAL);
+                    save_arg(); return TIMESPEC;
+                  }
+	YY_BREAK
+case 265:
+YY_RULE_SETUP
+#line 669 "src/l.l"
+{
+                      BEGIN(INITIAL);
+                      yyerror("invalid every format");
+                  }
+	YY_BREAK
+
+case 266:
+YY_RULE_SETUP
+#line 677 "src/l.l"
+{
+                      return yytext[0];
+                  }  
+	YY_BREAK
+case 267:
+YY_RULE_SETUP
+#line 682 "src/l.l"
+/* eat the whitespace */
+	YY_BREAK
+case 268:
+YY_RULE_SETUP
+#line 684 "src/l.l"
+{ /* got the include file name with double quotes */
+                     char *temp=Str_dup(yytext);
+                     Str_unquote(temp);    
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+	YY_BREAK
+case 269:
+YY_RULE_SETUP
+#line 692 "src/l.l"
+{ /* got the include file name with single quotes*/
+                     char *temp=Str_dup(yytext);
+                     Str_unquote(temp);    
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+	YY_BREAK
+case 270:
+YY_RULE_SETUP
+#line 700 "src/l.l"
+{ /* got the include file name without quotes*/
+                     char *temp=Str_dup(yytext);
+                     include_file(temp);
+                     FREE(temp);
+                     BEGIN(INITIAL);
+                   }
+	YY_BREAK
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(ARGUMENT_COND):
+case YY_STATE_EOF(DEPEND_COND):
+case YY_STATE_EOF(SERVICE_COND):
+case YY_STATE_EOF(URL_COND):
+case YY_STATE_EOF(STRING_COND):
+case YY_STATE_EOF(EVERY_COND):
+case YY_STATE_EOF(INCLUDE):
+#line 708 "src/l.l"
+{
+                       
+                       if ( !pop_buffer_state() )
+                       {
+                         yyterminate();
+                       } else {
+                         BEGIN(INITIAL);
+                       }
+                  }
+	YY_BREAK
+case 271:
+YY_RULE_SETUP
+#line 718 "src/l.l"
+ECHO;
+	YY_BREAK
+#line 4712 "src/lex.yy.c"
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( yywrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), (size_t) num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart(yyin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
+
+	(yy_state_ptr) = (yy_state_buf);
+	*(yy_state_ptr)++ = yy_current_state;
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 1305 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		*(yy_state_ptr)++ = yy_current_state;
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+    
+	register YY_CHAR yy_c = 1;
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 1305 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 1304);
+	if ( ! yy_is_jam )
+		*(yy_state_ptr)++ = yy_current_state;
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
+
+	/* undo effects of setting up yytext */
+	*yy_cp = (yy_hold_char);
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart(yyin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve yytext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void yyrestart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        yyensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            yy_create_buffer(yyin,YY_BUF_SIZE );
+	}
+
+	yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+	yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		yypop_buffer_state();
+	 *		yypush_buffer_state(new_buffer);
+     */
+	yyensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	yy_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * 
+ */
+    void yy_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yyfree((void *) b->yy_ch_buf  );
+
+	yyfree((void *) b  );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+    
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+    
+	yy_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then yy_init_buffer was _probably_
+     * called from yyrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void yy_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	yyensure_buffer_stack();
+
+	/* This block is copied from yy_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from yy_switch_to_buffer. */
+	yy_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void yypop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	yy_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		yy_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+								  
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
+{
+    
+	return yy_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) yyalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		yytext[yyleng] = (yy_hold_char); \
+		(yy_c_buf_p) = yytext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		yyleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int yyget_lineno  (void)
+{
+        
+    return yylineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *yyget_in  (void)
+{
+        return yyin;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *yyget_out  (void)
+{
+        return yyout;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int yyget_leng  (void)
+{
+        return yyleng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *yyget_text  (void)
+{
+        return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void yyset_lineno (int  line_number )
+{
+    
+    yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE *  in_str )
+{
+        yyin = in_str ;
+}
+
+void yyset_out (FILE *  out_str )
+{
+        yyout = out_str ;
+}
+
+int yyget_debug  (void)
+{
+        return yy_flex_debug;
+}
+
+void yyset_debug (int  bdebug )
+{
+        yy_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from yylex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+    (yy_state_buf) = 0;
+    (yy_state_ptr) = 0;
+    (yy_full_match) = 0;
+    (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    yyin = stdin;
+    yyout = stdout;
+#else
+    yyin = (FILE *) 0;
+    yyout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * yylex_init()
+     */
+    return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		yy_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		yypop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	yyfree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    yyfree ( (yy_state_buf) );
+    (yy_state_buf)  = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * yylex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *yyalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *yyrealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void yyfree (void * ptr )
+{
+	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 718 "src/l.l"
+
+
+
+/*
+ * Do lineno++ for every occurrence of '\n' in a string.  This is
+ * necessary whenever a yytext has an unknown number of CRs.
+ */
+
+static void steplinenobycr(char *string) {
+
+  char *pos= string;
+
+  while(*pos)
+    if('\n'==*pos++) {
+      lineno++;
+    }
+
+}
+
+
+static char *handle_quoted_string(char *string) {
+  char *buf= Str_dup(string);
+  Str_unquote(buf);
+  Util_handleEscapes(buf);
+  return buf;
+}
+
+
+static void include_file(char *pattern) {
+  glob_t globbuf;
+  int i;
+
+  if (glob(pattern,  GLOB_MARK, NULL, &globbuf) != 0)
+    return; // no include files found
+
+  for (i = 0; i < globbuf.gl_pathc; i++) {
+    FILE *yyin;
+    size_t filename_length = strlen(globbuf.gl_pathv[i]);
+
+    /* check whenever we have caught a directory or file backup copy */
+    if ((filename_length == 0) || (globbuf.gl_pathv[i][filename_length-1] == '~' ) || (globbuf.gl_pathv[i][filename_length-1] == '/' ))
+      continue;
+
+    yyin = fopen( globbuf.gl_pathv[i], "r" );
+    
+    if (! yyin)
+      yyerror( "failed to include file" );
+    else
+      push_buffer_state(yy_create_buffer(yyin,YY_BUF_SIZE ), globbuf.gl_pathv[i]);
+  }
+  globfree(&globbuf);
+}
+
+
+static void push_buffer_state(YY_BUFFER_STATE buffer, char *filename) {
+
+  if ( buffer_stack_ptr >= MAX_STACK_DEPTH )
+  {
+
+    yyerror("include files are nested too deeply" );
+    exit( 1 );
+    
+  }
+
+  buffer_stack[buffer_stack_ptr].lineno = lineno;
+  buffer_stack[buffer_stack_ptr].currentfile = currentfile;
+  buffer_stack[buffer_stack_ptr].buffer = YY_CURRENT_BUFFER;
+
+  buffer_stack_ptr++;
+
+  lineno = 1;
+  currentfile = Str_dup(filename);
+      
+  yy_switch_to_buffer(buffer);
+
+  BEGIN(INITIAL);
+  
+}
+
+
+static int pop_buffer_state(void) {
+
+  if ( --buffer_stack_ptr < 0 ) {
+
+    return 0;
+
+  } else {
+    
+    fclose(yyin);
+    lineno=buffer_stack[buffer_stack_ptr].lineno;
+
+    FREE(currentfile);
+    currentfile=buffer_stack[buffer_stack_ptr].currentfile;
+
+    yy_delete_buffer(YY_CURRENT_BUFFER );
+    yy_switch_to_buffer(buffer_stack[buffer_stack_ptr].buffer );
+    
+  }
+
+  return 1;
+ 
+}
+
+
+static void save_arg(void) {
+  
+  arglineno=lineno;
+  argcurrentfile=currentfile;
+  FREE(argyytext);
+  argyytext=Str_dup(yytext);
+  
+}
+
+
+static URL_T create_URL(char *proto) {
+  URL_T url;
+  ASSERT(proto);
+  NEW(url);
+  url->protocol= proto;
+  if(IS(url->protocol, "https")) {
+    url->port= 443;
+    if(!have_ssl())
+      yyerror("HTTPS protocol not supported -- SSL support disabled" );
+  } else if(IS(url->protocol, "http")) {
+    url->port= 80;
+  } else {
+    yyerror("URL protocol not supported -- ");
+  }
+  return url;
+}
+
diff --git a/monit-5.4/src/log.c b/monit-5.4/src/log.c
new file mode 100644
index 0000000..3575257
--- /dev/null
+++ b/monit-5.4/src/log.c
@@ -0,0 +1,466 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#include "monit.h"
+
+
+/**
+  *  Implementation of a logger that appends log messages to a file
+  *  with a preceding timestamp. Methods support both syslog or own
+  *  logfile.
+  *
+  *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+static FILE *LOG= NULL;
+static pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+
+static struct mylogpriority {
+  int  priority;
+  char *description;
+} logPriority[]= {
+  {LOG_EMERG,   "emergency"},
+    {LOG_ALERT,   "alert"},
+    {LOG_CRIT,    "critical"},
+    {LOG_ERR,     "error"},
+    {LOG_WARNING, "warning"},
+    {LOG_NOTICE,  "notice"},
+    {LOG_INFO,    "info"},
+    {LOG_DEBUG,   "debug"},
+    {-1,          NULL}
+};
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static int  open_log();
+static char *timefmt(char *t, int size);
+static const char *logPriorityDescription(int p);
+static void log_log(int priority, const char *s, va_list ap);
+static void log_backtrace();
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Initialize the log system and 'log' function
+ * @return TRUE if the log system was successfully initialized
+ */
+int log_init() {
+
+  if (!Run.dolog) {
+    return TRUE;
+  }
+
+  if (!open_log()) {
+    return FALSE;
+  }
+
+  /* Register log_close to be
+  called at program termination */
+    atexit(log_close);
+
+  return TRUE;
+
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogEmergency(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_EMERG, s, ap);
+  va_end(ap);
+  log_backtrace();
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogAlert(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_ALERT, s, ap);
+  va_end(ap);
+  log_backtrace();
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogCritical(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_CRIT, s, ap);
+  va_end(ap);
+  log_backtrace();
+}
+
+/*
+ * Called by libmonit on Exception. Log
+ * error and abort the application
+ */
+void vLogAbortHandler(const char *s, va_list ap) {
+        va_list ap_copy;
+        ASSERT(s);
+        va_copy(ap_copy, ap);
+        log_log(LOG_CRIT, s, ap);
+        va_end(ap_copy);
+        abort();
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogError(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_ERR, s, ap);
+  va_end(ap);
+  log_backtrace();
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void vLogError(const char *s, va_list ap) {
+  va_list ap_copy;
+  ASSERT(s);
+  va_copy(ap_copy, ap);
+  log_log(LOG_ERR, s, ap);
+  va_end(ap_copy);
+  log_backtrace();
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogWarning(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_WARNING, s, ap);
+  va_end(ap);
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogNotice(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_NOTICE, s, ap);
+  va_end(ap);
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogInfo(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_INFO, s, ap);
+  va_end(ap);
+}
+
+
+/**
+ * Logging interface with priority support
+ * @param s A formated (printf-style) string to log
+ */
+void LogDebug(const char *s, ...) {
+  va_list ap;
+
+  ASSERT(s);
+
+  va_start(ap, s);
+  log_log(LOG_DEBUG, s, ap);
+  va_end(ap);
+}
+
+
+/**
+ * Close the log file or syslog
+ */
+void log_close() {
+
+  if (Run.use_syslog) {
+    closelog(); 
+  }
+
+  if (LOG  && (0 != fclose(LOG))) {
+    LogError("%s: Error closing the log file -- %s\n",	prog, STRERROR);
+  }
+
+  LOG= NULL;
+
+}
+
+
+#ifndef HAVE_VSYSLOG
+#ifdef HAVE_SYSLOG
+void vsyslog (int facility_priority, const char *format, va_list arglist) {
+  char msg[STRLEN+1];
+
+  vsnprintf(msg, STRLEN, format, arglist);
+  syslog(facility_priority, "%s", msg);
+}
+#endif /* HAVE_SYSLOG */
+#endif /* HAVE_VSYSLOG */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Open a log file or syslog
+ */
+static int open_log() {
+
+  if (Run.use_syslog) {
+    openlog(prog, LOG_PID, Run.facility); 
+  } else {
+    umask(LOGMASK);
+    if ((LOG= fopen(Run.logfile,"a+")) == (FILE *)NULL) {
+      LogError("%s: Error opening the log file '%s' for writing -- %s\n", prog, Run.logfile, STRERROR);
+      return(FALSE);
+    }
+    /* Set logger in unbuffered mode */
+    setvbuf(LOG, NULL, _IONBF, 0);
+  }
+
+  return TRUE;
+
+}
+
+
+/**
+ * Returns the current time as a formated string, see the TIMEFORMAT
+ * macro in monit.h
+ */
+static char *timefmt(char *t, int size) {
+  time_t now;
+  struct tm tm;
+
+  time(&now);
+  localtime_r(&now, &tm);
+  if ( !strftime(t, size, TIMEFORMAT, &tm))
+    *t = 0;
+  return t;
+}
+
+
+/**
+ * Get a textual description of the actual log priority.
+ * @param p The log priority
+ * @return A string describing the log priority in clear text. If the
+ * priority is not found NULL is returned.
+ */
+static const char *logPriorityDescription(int p) {
+
+  struct mylogpriority *lp= logPriority;
+
+  while ((*lp).description)
+  {
+    if (p == (*lp).priority)
+    {
+      return (*lp).description;
+    }
+    lp++;
+  }
+
+  return "unknown";
+
+}
+
+
+/**
+ * Log a message to monits logfile or syslog. 
+ * @param priority A message priority
+ * @param s A formated (printf-style) string to log
+ */
+static void log_log(int priority, const char *s, va_list ap) {
+
+#ifdef HAVE_VA_COPY
+  va_list ap_copy;
+#endif
+
+  ASSERT(s);
+
+  LOCK(log_mutex)
+
+#ifdef HAVE_VA_COPY
+    va_copy(ap_copy, ap);
+  vfprintf(stderr, s, ap_copy);
+  va_end(ap_copy);
+#else
+  vfprintf(stderr, s, ap);
+#endif
+  fflush(stderr);
+
+  if (Run.dolog) {
+    if (Run.use_syslog) {
+#ifdef HAVE_VA_COPY
+      va_copy(ap_copy, ap);
+      vsyslog(priority, s, ap_copy);
+      va_end(ap_copy);
+#else
+      vsyslog(priority, s, ap);
+#endif
+    } else if (LOG) {
+      char datetime[STRLEN];
+      fprintf(LOG, "[%s] %-8s : ", timefmt(datetime, STRLEN), logPriorityDescription(priority));
+#ifdef HAVE_VA_COPY
+      va_copy(ap_copy, ap);
+      vfprintf(LOG, s, ap_copy);
+      va_end(ap_copy);
+#else
+      vfprintf(LOG, s, ap);
+#endif
+
+    }
+  }
+  END_LOCK;
+}
+
+
+static void log_backtrace() {
+#ifdef HAVE_BACKTRACE
+  int i, frames;
+  void *callstack[128];
+  char **strs;
+
+  if (Run.debug >= 2) {
+    frames = backtrace(callstack, 128);
+    strs = backtrace_symbols(callstack, frames);
+    LogDebug("-------------------------------------------------------------------------------\n");
+    for (i = 0; i < frames; ++i)
+      LogDebug("    %s\n", strs[i]);
+    LogDebug("-------------------------------------------------------------------------------\n");
+    FREE(strs);
+  }
+#endif
+}
+
diff --git a/monit-5.4/src/md5.c b/monit-5.4/src/md5.c
new file mode 100644
index 0000000..8ba301f
--- /dev/null
+++ b/monit-5.4/src/md5.c
@@ -0,0 +1,345 @@
+/*
+  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  L. Peter Deutsch
+  ghost@aladdin.com
+
+ */
+
+#include "md5.h"
+#include <string.h>
+
+#undef BYTE_ORDER	/* 1 = big-endian, -1 = little-endian, 0 = unknown */
+#ifdef ARCH_IS_BIG_ENDIAN
+#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
+#else
+#  define BYTE_ORDER 0
+#endif
+
+#define T_MASK ((md5_word_t)~0)
+#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
+#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
+#define T3    0x242070db
+#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
+#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
+#define T6    0x4787c62a
+#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
+#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
+#define T9    0x698098d8
+#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
+#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
+#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
+#define T13    0x6b901122
+#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
+#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
+#define T16    0x49b40821
+#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
+#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
+#define T19    0x265e5a51
+#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
+#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
+#define T22    0x02441453
+#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
+#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
+#define T25    0x21e1cde6
+#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
+#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
+#define T28    0x455a14ed
+#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
+#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
+#define T31    0x676f02d9
+#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
+#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
+#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
+#define T35    0x6d9d6122
+#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
+#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
+#define T38    0x4bdecfa9
+#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
+#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
+#define T41    0x289b7ec6
+#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
+#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
+#define T44    0x04881d05
+#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
+#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
+#define T47    0x1fa27cf8
+#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
+#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
+#define T50    0x432aff97
+#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
+#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
+#define T53    0x655b59c3
+#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
+#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
+#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
+#define T57    0x6fa87e4f
+#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
+#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
+#define T60    0x4e0811a1
+#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
+#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
+#define T63    0x2ad7d2bb
+#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
+
+
+static void md5_process(md5_context_t *pms, const md5_byte_t *data /*[64]*/) {
+    md5_word_t
+	a = pms->abcd[0], b = pms->abcd[1],
+	c = pms->abcd[2], d = pms->abcd[3];
+    md5_word_t t;
+#if BYTE_ORDER > 0
+    /* Define storage only for big-endian CPUs. */
+    md5_word_t X[16];
+#else
+    /* Define storage for little-endian or both types of CPUs. */
+    md5_word_t xbuf[16];
+    const md5_word_t *X;
+#endif
+
+    {
+#if BYTE_ORDER == 0
+	/*
+	 * Determine dynamically whether this is a big-endian or
+	 * little-endian machine, since we can use a more efficient
+	 * algorithm on the latter.
+	 */
+	static const int w = 1;
+
+	if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
+#endif
+#if BYTE_ORDER <= 0		/* little-endian */
+	{
+	    /*
+	     * On little-endian machines, we can process properly aligned
+	     * data without copying it.
+	     */
+	    if (!((data - (const md5_byte_t *)0) & 3)) {
+		/* data are properly aligned */
+		X = (const md5_word_t *)data;
+	    } else {
+		/* not aligned */
+		memcpy(xbuf, data, 64);
+		X = xbuf;
+	    }
+	}
+#endif
+#if BYTE_ORDER == 0
+	else			/* dynamic big-endian */
+#endif
+#if BYTE_ORDER >= 0		/* big-endian */
+	{
+	    /*
+	     * On big-endian machines, we must arrange the bytes in the
+	     * right order.
+	     */
+	    const md5_byte_t *xp = data;
+	    int i;
+
+#  if BYTE_ORDER == 0
+	    X = xbuf;		/* (dynamic only) */
+#  else
+#    define xbuf X		/* (static only) */
+#  endif
+	    for (i = 0; i < 16; ++i, xp += 4)
+		xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
+	}
+#endif
+    }
+
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+
+    /* Round 1. */
+    /* Let [abcd k s i] denote the operation
+       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
+#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + F(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+    /* Do the following 16 operations. */
+    SET(a, b, c, d,  0,  7,  T1);
+    SET(d, a, b, c,  1, 12,  T2);
+    SET(c, d, a, b,  2, 17,  T3);
+    SET(b, c, d, a,  3, 22,  T4);
+    SET(a, b, c, d,  4,  7,  T5);
+    SET(d, a, b, c,  5, 12,  T6);
+    SET(c, d, a, b,  6, 17,  T7);
+    SET(b, c, d, a,  7, 22,  T8);
+    SET(a, b, c, d,  8,  7,  T9);
+    SET(d, a, b, c,  9, 12, T10);
+    SET(c, d, a, b, 10, 17, T11);
+    SET(b, c, d, a, 11, 22, T12);
+    SET(a, b, c, d, 12,  7, T13);
+    SET(d, a, b, c, 13, 12, T14);
+    SET(c, d, a, b, 14, 17, T15);
+    SET(b, c, d, a, 15, 22, T16);
+#undef SET
+
+     /* Round 2. */
+     /* Let [abcd k s i] denote the operation
+          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
+#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + G(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  1,  5, T17);
+    SET(d, a, b, c,  6,  9, T18);
+    SET(c, d, a, b, 11, 14, T19);
+    SET(b, c, d, a,  0, 20, T20);
+    SET(a, b, c, d,  5,  5, T21);
+    SET(d, a, b, c, 10,  9, T22);
+    SET(c, d, a, b, 15, 14, T23);
+    SET(b, c, d, a,  4, 20, T24);
+    SET(a, b, c, d,  9,  5, T25);
+    SET(d, a, b, c, 14,  9, T26);
+    SET(c, d, a, b,  3, 14, T27);
+    SET(b, c, d, a,  8, 20, T28);
+    SET(a, b, c, d, 13,  5, T29);
+    SET(d, a, b, c,  2,  9, T30);
+    SET(c, d, a, b,  7, 14, T31);
+    SET(b, c, d, a, 12, 20, T32);
+#undef SET
+
+     /* Round 3. */
+     /* Let [abcd k s t] denote the operation
+          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + H(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  5,  4, T33);
+    SET(d, a, b, c,  8, 11, T34);
+    SET(c, d, a, b, 11, 16, T35);
+    SET(b, c, d, a, 14, 23, T36);
+    SET(a, b, c, d,  1,  4, T37);
+    SET(d, a, b, c,  4, 11, T38);
+    SET(c, d, a, b,  7, 16, T39);
+    SET(b, c, d, a, 10, 23, T40);
+    SET(a, b, c, d, 13,  4, T41);
+    SET(d, a, b, c,  0, 11, T42);
+    SET(c, d, a, b,  3, 16, T43);
+    SET(b, c, d, a,  6, 23, T44);
+    SET(a, b, c, d,  9,  4, T45);
+    SET(d, a, b, c, 12, 11, T46);
+    SET(c, d, a, b, 15, 16, T47);
+    SET(b, c, d, a,  2, 23, T48);
+#undef SET
+
+     /* Round 4. */
+     /* Let [abcd k s t] denote the operation
+          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + I(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  0,  6, T49);
+    SET(d, a, b, c,  7, 10, T50);
+    SET(c, d, a, b, 14, 15, T51);
+    SET(b, c, d, a,  5, 21, T52);
+    SET(a, b, c, d, 12,  6, T53);
+    SET(d, a, b, c,  3, 10, T54);
+    SET(c, d, a, b, 10, 15, T55);
+    SET(b, c, d, a,  1, 21, T56);
+    SET(a, b, c, d,  8,  6, T57);
+    SET(d, a, b, c, 15, 10, T58);
+    SET(c, d, a, b,  6, 15, T59);
+    SET(b, c, d, a, 13, 21, T60);
+    SET(a, b, c, d,  4,  6, T61);
+    SET(d, a, b, c, 11, 10, T62);
+    SET(c, d, a, b,  2, 15, T63);
+    SET(b, c, d, a,  9, 21, T64);
+#undef SET
+
+     /* Then perform the following additions. (That is increment each
+        of the four registers by the value it had before this block
+        was started.) */
+    pms->abcd[0] += a;
+    pms->abcd[1] += b;
+    pms->abcd[2] += c;
+    pms->abcd[3] += d;
+}
+
+void md5_init(md5_context_t *pms) {
+    pms->count[0] = pms->count[1] = 0;
+    pms->abcd[0] = 0x67452301;
+    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
+    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
+    pms->abcd[3] = 0x10325476;
+}
+
+void md5_append(md5_context_t *pms, const md5_byte_t *data, int nbytes) {
+    const md5_byte_t *p = data;
+    int left = nbytes;
+    int offset = (pms->count[0] >> 3) & 63;
+    md5_word_t nbits = (md5_word_t)(nbytes << 3);
+
+    if (nbytes <= 0)
+	return;
+
+    /* Update the message length. */
+    pms->count[1] += nbytes >> 29;
+    pms->count[0] += nbits;
+    if (pms->count[0] < nbits)
+	pms->count[1]++;
+
+    /* Process an initial partial block. */
+    if (offset) {
+	int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
+
+	memcpy(pms->buf + offset, p, copy);
+	if (offset + copy < 64)
+	    return;
+	p += copy;
+	left -= copy;
+	md5_process(pms, pms->buf);
+    }
+
+    /* Process full blocks. */
+    for (; left >= 64; p += 64, left -= 64)
+	md5_process(pms, p);
+
+    /* Process a final partial block. */
+    if (left)
+	memcpy(pms->buf, p, left);
+}
+
+void md5_finish(md5_context_t *pms, md5_byte_t digest[16]) {
+    static const md5_byte_t pad[64] = {
+	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    md5_byte_t data[8];
+    int i;
+
+    /* Save the length before padding. */
+    for (i = 0; i < 8; ++i)
+	data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
+    /* Pad to 56 bytes mod 64. */
+    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
+    /* Append the length. */
+    md5_append(pms, data, 8);
+    for (i = 0; i < 16; ++i)
+	digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
+}
+
diff --git a/monit-5.4/src/md5.h b/monit-5.4/src/md5.h
new file mode 100644
index 0000000..7ddc53e
--- /dev/null
+++ b/monit-5.4/src/md5.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  L. Peter Deutsch
+  ghost@aladdin.com
+
+ */
+
+#ifndef MD5_H
+#define MD5_H
+
+/*
+ * This package supports both compile-time and run-time determination of CPU
+ * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
+ * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
+ * defined as non-zero, the code will be compiled to run only on big-endian
+ * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
+ * run on either big- or little-endian CPUs, but will run slightly less
+ * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
+ */
+
+typedef unsigned char md5_byte_t; /* 8-bit byte */
+typedef unsigned int md5_word_t; /* 32-bit word */
+
+/* Define the context of the MD5 Algorithm. */
+typedef struct md5_context_s {
+    md5_word_t count[2];	/* message length in bits, lsw first */
+    md5_word_t abcd[4];		/* digest buffer */
+    md5_byte_t buf[64];		/* accumulate block */
+} md5_context_t;
+
+/* Initialize the algorithm. */
+void md5_init(md5_context_t *pms);
+
+/* Append a string to the message. */
+void md5_append(md5_context_t *pms, const md5_byte_t *data, int nbytes);
+
+/* Finish the message and return the digest. */
+void md5_finish(md5_context_t *pms, md5_byte_t digest[16]);
+
+#endif
+
diff --git a/monit-5.4/src/md5_crypt.c b/monit-5.4/src/md5_crypt.c
new file mode 100644
index 0000000..2b5e6fc
--- /dev/null
+++ b/monit-5.4/src/md5_crypt.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+/*
+ * Based on crypt implementation 1.7 by Poul-Henning Kamp
+ *
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ */
+
+#include "config.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "md5.h"
+
+
+/* 0 ... 63 => ascii - 64 */
+static unsigned char itoa64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static void to64(char *s, unsigned long v, int n) {
+        while (--n >= 0) {
+                *s++ = itoa64[v&0x3f];
+                v >>= 6;
+        }
+}
+
+
+/*
+ * UNIX password MD5
+ */
+char *md5_crypt(const char *pw, const char *id, const char *salt, char *buf, int buflen) {
+        char *p;
+        const md5_byte_t *sp, *ep;
+        unsigned char final[16];
+        int i, sl, pl, pwl = (int)strlen(pw);
+        unsigned long l;
+        md5_context_t ctx, ctx1;
+
+        /* Refine the Salt first */
+        sp = (const md5_byte_t *)salt;
+    
+        /* If it starts with the id string, then skip that */
+        if (! strncmp(salt, id, strlen(id)))
+                    sp += strlen(id);
+
+        /* It stops at the first '$', max 8 chars */
+        for (ep = sp; *ep && *ep != '$' && ep < (sp + 8); ep++)
+                continue;
+
+        /* get the length of the true salt */
+        sl = (int)(ep - sp);
+
+        md5_init(&ctx);
+
+        /* The password first, since that is what is most unknown */
+        md5_append(&ctx, (const md5_byte_t *)pw, pwl);
+
+        /* Then our id string */
+        md5_append(&ctx, (const md5_byte_t *)id, (int)strlen(id));
+
+        /* Then the raw salt */
+        md5_append(&ctx, sp, sl);
+
+        /* Then just as many characters of the MD5(pw, salt, pw) */
+        md5_init(&ctx1);
+        md5_append(&ctx1, (const md5_byte_t *)pw, pwl);
+        md5_append(&ctx1, sp, sl);
+        md5_append(&ctx1, (const md5_byte_t *)pw, pwl);
+        md5_finish(&ctx1, final);
+        for (pl = pwl; pl > 0; pl -= 16)
+                md5_append(&ctx, final, pl > 16 ? 16 : pl);
+
+        /* Don't leave anything around in vm they could use. */
+        memset(final, 0, sizeof(final));
+
+        /* Then something really weird... */
+        for (i = pwl; i; i >>= 1)
+                if (i & 1)
+                    md5_append(&ctx, final, 1);
+                else
+                    md5_append(&ctx, (const md5_byte_t *)pw, 1);
+
+        /* Now make the output string */
+        strncpy(buf, id, buflen);
+        strncat(buf, (const char *)sp, sl);
+        strcat(buf, "$");
+
+        md5_finish(&ctx, final);
+
+        /*
+         * and now, just to make sure things don't run too fast
+         * On a 60 Mhz Pentium this takes 34 msec, so you would
+         * need 30 seconds to build a 1000 entry dictionary...
+         */
+        for (i = 0; i < 1000; i++) {
+                md5_init(&ctx1);
+                if (i & 1)
+                        md5_append(&ctx1, (const md5_byte_t *)pw, pwl);
+                else
+                        md5_append(&ctx1, final, 16);
+
+                if (i % 3)
+                        md5_append(&ctx1, sp, sl);
+
+                if (i % 7)
+                        md5_append(&ctx1, (const md5_byte_t *)pw, pwl);
+
+                if (i & 1)
+                        md5_append(&ctx1, final, 16);
+                else
+                        md5_append(&ctx1, (const md5_byte_t *)pw, pwl);
+                md5_finish(&ctx1, final);
+        }
+
+        p = buf + strlen(buf);
+
+        l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p, l, 4); p += 4;
+        l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p, l, 4); p += 4;
+        l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p, l, 4); p += 4;
+        l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p, l, 4); p += 4;
+        l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p, l, 4); p += 4;
+        l =                    final[11]                ; to64(p, l, 2); p += 2;
+        *p = '\0';
+
+        /* Don't leave anything around in vm they could use. */
+        memset(final, 0, sizeof(final));
+
+        return buf;
+}
+
diff --git a/monit-5.4/src/md5_crypt.h b/monit-5.4/src/md5_crypt.h
new file mode 100644
index 0000000..e785b9d
--- /dev/null
+++ b/monit-5.4/src/md5_crypt.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MD5_CRYPT_H
+#define MD5_CRYPT_H
+
+
+char *md5_crypt(const char *pw, const char *id, const char *salt, char *buf, int buflen);
+
+
+#endif
diff --git a/monit-5.4/src/monit.c b/monit-5.4/src/monit.c
new file mode 100644
index 0000000..636fd92
--- /dev/null
+++ b/monit-5.4/src/monit.c
@@ -0,0 +1,808 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+#include <locale.h>
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#include "monit.h"
+#include "net.h"
+#include "ssl.h"
+#include "process.h"
+#include "state.h"
+#include "event.h"
+
+// libmonit
+#include "Bootstrap.h"
+#include "io/File.h"
+
+
+/**
+ *  DESCRIPTION
+ *    monit - system for monitoring services on a Unix system
+ *
+ *  SYNOPSIS
+ *    monit [options] {arguments}
+ *
+ *  @file
+ */
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void  do_init();                       /* Initialize this application */
+static void  do_reinit();           /* Re-initialize the runtime application */
+static void  do_action(char **);         /* Dispatch to the submitted action */
+static void  do_exit();                                    /* Finalize monit */
+static void  do_default();                              /* Do default action */
+static void  handle_options(int, char **);         /* Handle program options */
+static void  help();                 /* Print program help message to stdout */
+static void  version();                         /* Print version information */
+static void *heartbeat(void *args);              /* M/Monit heartbeat thread */
+static RETSIGTYPE do_reload(int);       /* Signalhandler for a daemon reload */
+static RETSIGTYPE do_destroy(int);   /* Signalhandler for monit finalization */
+static RETSIGTYPE do_wakeup(int);  /* Signalhandler for a daemon wakeup call */
+static void waitforchildren(void); /* Wait for any child process not running */
+
+
+
+/* ------------------------------------------------------------------ Global */
+
+
+const char *prog;                              /**< The Name of this Program */
+struct myrun Run;                      /**< Struct holding runtime constants */
+Service_T servicelist;                /**< The service list (created in p.y) */
+Service_T servicelist_conf;   /**< The service list in conf file (c. in p.y) */
+ServiceGroup_T servicegrouplist;/**< The service group list (created in p.y) */
+SystemInfo_T systeminfo;                              /**< System infomation */
+
+pthread_t           heartbeatThread;           /**< M/Monit heartbeat thread */
+pthread_cond_t      heartbeatCond;            /**< Hearbeat wakeup condition */
+pthread_mutex_t     heartbeatMutex;                      /**< Hearbeat mutex */
+static volatile int heartbeatRunning = FALSE;     /**< Heartbeat thread flag */
+
+int ptreesize = 0;
+int oldptreesize = 0;
+ProcessTree_T *ptree = NULL;
+ProcessTree_T *oldptree = NULL;
+
+char *actionnames[] = {"ignore", "alert", "restart", "stop", "exec", "unmonitor", "start", "monitor", ""};
+char *modenames[] = {"active", "passive", "manual"};
+char *checksumnames[] = {"UNKNOWN", "MD5", "SHA1"};
+char *operatornames[] = {"greater than", "less than", "equal to", "not equal to"};
+char *operatorshortnames[] = {">", "<", "=", "!="};
+char *statusnames[] = {"Accessible", "Accessible", "Accessible", "Running", "Online with all services", "Running", "Accessible", "Status ok"};
+char *servicetypes[] = {"Filesystem", "Directory", "File", "Process", "Remote Host", "System", "Fifo", "Program"};
+char *pathnames[] = {"Path", "Path", "Path", "Pid file", "Path", "", "Path"};
+char *icmpnames[] = {"Echo Reply", "", "", "Destination Unreachable", "Source Quench", "Redirect", "", "", "Echo Request", "", "", "Time Exceeded", "Parameter Problem", "Timestamp Request", "Timestamp Reply", "Information Request", "Information Reply", "Address Mask Request", "Address Mask Reply"};
+char *sslnames[] = {"auto", "v2", "v3", "tls"};
+
+
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * The Prime mover
+ */
+int main(int argc, char **argv) {
+        Bootstrap(); // Bootstrap libmonit
+        Bootstrap_setAbortHandler(vLogAbortHandler);  // Abort Monit on exceptions thrown by libmonit
+        Bootstrap_setErrorHandler(vLogError);
+        setlocale(LC_ALL, "C");
+        prog = File_basename(argv[0]);
+        init_env();
+        handle_options(argc, argv);
+        do_init();
+        do_action(argv); 
+        do_exit();
+        return 0;
+}
+
+
+/**
+ * Wakeup a sleeping monit daemon.
+ * Returns TRUE on success otherwise FALSE
+ */
+int do_wakeupcall() {
+        pid_t pid;
+        
+        if ((pid = exist_daemon()) > 0) {
+                kill(pid, SIGUSR1);
+                LogInfo("%s daemon at %d awakened\n", prog, pid);
+                
+                return TRUE;
+        }
+        
+        return FALSE;
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Initialize this application - Register signal handlers,
+ * Parse the control file and initialize the program's
+ * datastructures and the log system.
+ */
+static void do_init() {
+        
+        int status;
+        
+        /*
+         * Register interest for the SIGTERM signal,
+         * in case we run in daemon mode this signal
+         * will terminate a running daemon.
+         */
+        signal(SIGTERM, do_destroy);
+        
+        /*
+         * Register interest for the SIGUSER1 signal,
+         * in case we run in daemon mode this signal
+         * will wakeup a sleeping daemon.
+         */
+        signal(SIGUSR1, do_wakeup);
+        
+        /*
+         * Register interest for the SIGINT signal,
+         * in case we run as a server but not as a daemon
+         * we need to catch this signal if the user pressed
+         * CTRL^C in the terminal
+         */
+        signal(SIGINT, do_destroy);
+        
+        /*
+         * Register interest for the SIGHUP signal,
+         * in case we run in daemon mode this signal
+         * will reload the configuration.
+         */
+        signal(SIGHUP, do_reload);
+        
+        /*
+         * Register no interest for the SIGPIPE signal,
+         */
+        signal(SIGPIPE, SIG_IGN);
+        
+        /*
+         * Initialize the random number generator
+         */
+        srandom((unsigned)(time(NULL) + getpid()));
+        
+        /*
+         * Initialize the Runtime mutex. This mutex
+         * is used to synchronize handling of global
+         * service data
+         */
+        status = pthread_mutex_init(&Run.mutex, NULL);
+        if (status != 0) {
+                LogError("%s: Cannot initialize mutex -- %s\n", prog, strerror(status));
+                exit(1);
+        }
+        
+        /*
+         * Initialize heartbeat mutex and condition
+         */
+        status = pthread_mutex_init(&heartbeatMutex, NULL);
+        if (status != 0) {
+                LogError("%s: Cannot initialize heartbeat mutex -- %s\n", prog, strerror(status));
+                exit(1);
+        }
+        status = pthread_cond_init(&heartbeatCond, NULL);
+        if (status != 0) {
+                LogError("%s: Cannot initialize heartbeat condition -- %s\n", prog, strerror(status));
+                exit(1);
+        }
+        
+        /* 
+         * Get the position of the control file 
+         */
+        if (! Run.controlfile)
+                Run.controlfile = file_findControlFile();
+        
+        /*
+         * Initialize the process information gathering interface
+         */
+        Run.doprocess = init_process_info();
+        
+        /*
+         * Start the Parser and create the service list. This will also set
+         * any Runtime constants defined in the controlfile.
+         */
+        if (! parse(Run.controlfile))
+                exit(1);
+        
+        /*
+         * Stop and report success if we are just validating the Control
+         * file syntax. The previous parse statement exits the program with
+         * an error message if a syntax error is present in the control
+         * file.
+         */
+        if (Run.testing) {
+                LogInfo("Control file syntax OK\n");
+                exit(0);
+        }
+        
+        /*
+         * Initialize the log system 
+         */
+        if (! log_init())
+                exit(1);
+        
+        /* 
+         * Did we find any service ?  
+         */
+        if (! servicelist) {
+                LogError("%s: No services has been specified\n", prog);
+                exit(0);
+        }
+        
+        /* 
+         * Initialize Runtime file variables 
+         */
+        file_init();
+        
+        /* 
+         * Should we print debug information ? 
+         */
+        if (Run.debug) {
+                Util_printRunList();
+                Util_printServiceList();
+        }
+        
+        /*
+         * Reap any stray child processes we may have created
+         */
+        atexit(waitforchildren);
+}
+
+
+/**
+ * Re-Initialize the application - called if a
+ * monit daemon receives the SIGHUP signal.
+ */
+static void do_reinit() {
+        int status;
+        
+        LogInfo("Awakened by the SIGHUP signal\n");
+        LogInfo("Reinitializing %s - Control file '%s'\n", prog, Run.controlfile);
+        
+        /* Wait non-blocking for any children that has exited. Since we
+         reinitialize any information about children we have setup to wait
+         for will be lost. This may create zombie processes until Monit
+         itself exit. However, Monit will wait on all children that has exited 
+         before it ifself exit. TODO: Later refactored versions will use a 
+         globale process table which a sigchld handler can check */
+        waitforchildren();
+        
+        if(Run.mmonits && heartbeatRunning) {
+                if ((status = pthread_cond_signal(&heartbeatCond)) != 0)
+                        LogError("%s: Failed to signal the heartbeat thread -- %s\n", prog, strerror(status));
+                if ((status = pthread_join(heartbeatThread, NULL)) != 0)
+                        LogError("%s: Failed to stop the heartbeat thread -- %s\n", prog, strerror(status));
+                heartbeatRunning = FALSE;
+        }
+        
+        Run.doreload = FALSE;
+        
+        /* Stop http interface */
+        if (Run.dohttpd)
+                monit_http(STOP_HTTP);
+        
+        /* Save the current state (no changes are possible now since the http thread is stopped) */
+        State_save();
+        State_close();
+        
+        /* Run the garbage collector */
+        gc();
+        
+        if (! parse(Run.controlfile)) {
+                LogError("%s daemon died\n", prog);
+                exit(1);
+        }
+        
+        /* Close the current log */
+        log_close();
+        
+        /* Reinstall the log system */
+        if (! log_init())
+                exit(1);
+        
+        /* Did we find any services ?  */
+        if (! servicelist) {
+                LogError("%s: No services has been specified\n", prog);
+                exit(0);
+        }
+        
+        /* Reinitialize Runtime file variables */
+        file_init();
+        
+        if (! file_createPidFile(Run.pidfile)) {
+                LogError("%s daemon died\n", prog);
+                exit(1);
+        }
+        
+        /* Update service data from the state repository */
+        if (! State_open())
+                exit(1);
+        State_update();
+        
+        /* Start http interface */
+        if (can_http())
+                monit_http(START_HTTP);
+        
+        /* send the monit startup notification */
+        Event_post(Run.system, Event_Instance, STATE_CHANGED, Run.system->action_MONIT_RELOAD, "Monit reloaded");
+        
+        if(Run.mmonits && ((status = pthread_create(&heartbeatThread, NULL, heartbeat, NULL)) != 0))
+                LogError("%s: Failed to create the heartbeat thread -- %s\n", prog, strerror(status));
+        else
+                heartbeatRunning = TRUE;
+}
+
+
+/**
+ * Dispatch to the submitted action - actions are program arguments
+ */
+static void do_action(char **args) {
+        char *action = args[optind];
+        char *service = args[++optind];
+        
+        Run.once = TRUE;
+        
+        if (! action) {
+                do_default();
+        } else if (IS(action, "start")     ||
+                   IS(action, "stop")      ||
+                   IS(action, "monitor")   ||
+                   IS(action, "unmonitor") ||
+                   IS(action, "restart")) {
+                if (Run.mygroup || service) {
+                        int errors = 0;
+                        int (*_control_service)(const char *, const char *) = exist_daemon() ? control_service_daemon : control_service_string;
+                        
+                        if (Run.mygroup) {
+                                ServiceGroup_T sg = NULL;
+                                
+                                for (sg = servicegrouplist; sg; sg = sg->next) {
+                                        if (! strcasecmp(Run.mygroup, sg->name)) {
+                                                ServiceGroupMember_T sgm = NULL;
+                                                
+                                                for (sgm = sg->members; sgm; sgm = sgm->next)
+                                                        if (! _control_service(sgm->name, action))
+                                                                errors++;
+                                                
+                                                break;
+                                        }
+                                }
+                        } else if (IS(service, "all")) {
+                                Service_T s = NULL;
+                                
+                                for (s = servicelist; s; s = s->next) {
+                                        if (s->visited)
+                                                continue;
+                                        if (! _control_service(s->name, action))
+                                                errors++;
+                                }
+                        } else {
+                                errors = _control_service(service, action) ? 0 : 1;
+                        }
+                        if (errors)
+                                exit(1);
+                } else {
+                        LogError("%s: please specify the configured service name or 'all' after %s\n", prog, action);
+                        exit(1);
+                }
+        } else if (IS(action, "reload")) {
+                LogInfo("Reinitializing monit daemon\n", prog);
+                kill_daemon(SIGHUP);
+        } else if (IS(action, "status")) {
+                status(LEVEL_NAME_FULL);
+        } else if (IS(action, "summary")) {
+                status(LEVEL_NAME_SUMMARY);
+        } else if (IS(action, "procmatch")) {
+                if (! service) {
+                        printf("Invalid syntax - usage: procmatch \"<pattern>\"\n");
+                        exit(1);
+                }
+                process_testmatch(service);
+        } else if (IS(action, "quit")) {
+                kill_daemon(SIGTERM);
+        } else if (IS(action, "validate")) {
+                if (! validate())
+                        exit(1);
+        } else {
+                LogError("%s: invalid argument -- %s  (-h will show valid arguments)\n", prog, action);
+                exit(1);
+        }
+}
+
+
+/**
+ * Finalize monit
+ */
+static void do_exit() {
+        int status;
+        sigset_t ns;
+        
+        set_signal_block(&ns, NULL);
+        Run.stopped = TRUE;
+        if (Run.isdaemon && !Run.once) {
+                if (can_http())
+                        monit_http(STOP_HTTP);
+                
+                if(Run.mmonits && heartbeatRunning) {
+                        if ((status = pthread_cond_signal(&heartbeatCond)) != 0)
+                                LogError("%s: Failed to signal the heartbeat thread -- %s\n", prog, strerror(status));
+                        if ((status = pthread_join(heartbeatThread, NULL)) != 0)
+                                LogError("%s: Failed to stop the heartbeat thread -- %s\n", prog, strerror(status));
+                        heartbeatRunning = FALSE;
+                }
+                
+                LogInfo("%s daemon with pid [%d] killed\n", prog, (int)getpid());
+                
+                /* send the monit stop notification */
+                Event_post(Run.system, Event_Instance, STATE_CHANGED, Run.system->action_MONIT_STOP, "Monit stopped");
+        }
+        gc();
+        exit(0);
+}
+
+
+/**
+ * Default action - become a daemon if defined in the Run object and
+ * run validate() between sleeps. If not, just run validate() once.
+ * Also, if specified, start the monit http server if in deamon mode.
+ */
+static void do_default() {
+        int status;
+        
+        if (Run.isdaemon) {
+                if (do_wakeupcall())
+                        exit(0);
+                
+                Run.once = FALSE;
+                if (can_http())
+                        LogInfo("Starting %s daemon with http interface at [%s:%d]\n", prog, Run.bind_addr?Run.bind_addr:"*", Run.httpdport);
+                else
+                        LogInfo("Starting %s daemon\n", prog);
+                
+                if (Run.startdelay)
+                        LogInfo("Monit start delay set -- pause for %ds\n", Run.startdelay);
+                
+                if (Run.init != TRUE)
+                        daemonize(); 
+                else if (! Run.debug)
+                        Util_redirectStdFds();
+                
+                if (! file_createPidFile(Run.pidfile)) {
+                        LogError("%s daemon died\n", prog);
+                        exit(1);
+                }
+                
+                if (! State_open())
+                        exit(1);
+                State_update();
+                
+                atexit(file_finalize);
+                
+                if (Run.startdelay) {
+                        time_t now = time(NULL);
+                        time_t delay = now + Run.startdelay;
+                        
+                        /* sleep can be interrupted by signal => make sure we paused long enough */
+                        while (now < delay) {
+                                sleep((unsigned int)(delay - now));
+                                if (Run.stopped)
+                                        do_exit();
+                                now = time(NULL);
+                        }
+                }
+                
+                if (can_http())
+                        monit_http(START_HTTP);
+                
+                /* send the monit startup notification */
+                Event_post(Run.system, Event_Instance, STATE_CHANGED, Run.system->action_MONIT_START, "Monit started");
+                
+                if(Run.mmonits && ((status = pthread_create(&heartbeatThread, NULL, heartbeat, NULL)) != 0))
+                        LogError("%s: Failed to create the heartbeat thread -- %s\n", prog, strerror(status));
+                else
+                        heartbeatRunning = TRUE;
+                
+                while (TRUE) {
+                        validate();
+                        State_save();
+                        
+                        /* In the case that there is no pending action then sleep */
+                        if (!Run.doaction)
+                                sleep(Run.polltime);
+                        
+                        if (Run.dowakeup) {
+                                Run.dowakeup = FALSE;
+                                LogInfo("Awakened by User defined signal 1\n");
+                        }
+                        
+                        if (Run.stopped)
+                                do_exit();
+                        else if (Run.doreload)
+                                do_reinit();
+                }
+        } else {
+                validate();
+        }
+}
+
+
+/**
+ * Handle program options - Options set from the commandline
+ * takes precedence over those found in the control file
+ */
+static void handle_options(int argc, char **argv) {
+        int opt;
+        opterr = 0;
+        Run.mygroup = NULL;
+        
+        while ((opt = getopt(argc,argv,"c:d:g:l:p:s:iItvVhH")) != -1) {
+                
+                switch(opt) {
+                                
+                        case 'c':
+                                Run.controlfile = Str_dup(optarg);
+                                break;
+                                
+                        case 'd':
+                                Run.isdaemon = TRUE;
+                                sscanf(optarg, "%d", &Run.polltime);
+                                if (Run.polltime<1) {
+                                        LogError("%s: option -%c requires a natural number\n", prog, opt);
+                                        exit(1);
+                                }
+                                break;
+                                
+                        case 'g':
+                                Run.mygroup = Str_dup(optarg);
+                                break;
+                                
+                        case 'l':
+                                Run.logfile = Str_dup(optarg);
+                                if (IS(Run.logfile, "syslog"))
+                                        Run.use_syslog = TRUE;
+                                Run.dolog = TRUE;
+                                break;
+                                
+                        case 'p':
+                                Run.pidfile = Str_dup(optarg);
+                                break;
+                                
+                        case 's':
+                                Run.statefile = Str_dup(optarg);
+                                break;
+                                
+                        case 'I':
+                                Run.init = TRUE;
+                                break;
+                                
+                        case 't':
+                                Run.testing = TRUE;
+                                break;
+                                
+                        case 'v':
+                                Run.debug++;
+                                break;
+                                
+                        case 'H':
+                                if (argc > optind)
+                                        Util_printHash(argv[optind]);
+                                else
+                                        Util_printHash(NULL);
+                                
+                                exit(0);
+                                break;
+                                
+                        case 'V':
+                                version();
+                                exit(0);
+                                break;
+                                
+                        case 'h':
+                                help();
+                                exit(0);
+                                break;
+                                
+                        case '?':
+                                switch(optopt) {
+                                                
+                                        case 'c':
+                                        case 'd':
+                                        case 'g':
+                                        case 'l':
+                                        case 'p':
+                                        case 's':
+                                                LogError("%s: option -- %c requires an argument\n", prog, optopt);
+                                                break;
+                                        default:
+                                                LogError("%s: invalid option -- %c  (-h will show valid options)\n", prog, optopt);
+                                                
+                                }
+                                
+                                exit(1);
+                                
+                }
+                
+        }
+        
+}
+
+
+/**
+ * Print the program's help message
+ */
+static void help() {
+        printf("Usage: %s [options] {arguments}\n", prog);
+        printf("Options are as follows:\n");
+        printf(" -c file       Use this control file\n");
+        printf(" -d n          Run as a daemon once per n seconds\n");
+        printf(" -g name       Set group name for start, stop, restart, monitor and unmonitor\n");
+        printf(" -l logfile    Print log information to this file\n");
+        printf(" -p pidfile    Use this lock file in daemon mode\n");
+        printf(" -s statefile  Set the file monit should write state information to\n");
+        printf(" -I            Do not run in background (needed for run from init)\n");
+        printf(" -t            Run syntax check for the control file\n");
+        printf(" -v            Verbose mode, work noisy (diagnostic output)\n");
+        printf(" -vv           Very verbose mode, same as -v plus log stacktrace on error\n");
+        printf(" -H [filename] Print SHA1 and MD5 hashes of the file or of stdin if the\n");
+        printf("               filename is omited; monit will exit afterwards\n");
+        printf(" -V            Print version number and patchlevel\n");
+        printf(" -h            Print this text\n");
+        printf("Optional action arguments for non-daemon mode are as follows:\n");
+        printf(" start all           - Start all services\n");
+        printf(" start name          - Only start the named service\n");
+        printf(" stop all            - Stop all services\n");
+        printf(" stop name           - Only stop the named service\n");
+        printf(" restart all         - Stop and start all services\n");
+        printf(" restart name        - Only restart the named service\n");
+        printf(" monitor all         - Enable monitoring of all services\n");
+        printf(" monitor name        - Only enable monitoring of the named service\n");
+        printf(" unmonitor all       - Disable monitoring of all services\n");
+        printf(" unmonitor name      - Only disable monitoring of the named service\n");
+        printf(" reload              - Reinitialize monit\n");
+        printf(" status              - Print full status information for each service\n");
+        printf(" summary             - Print short status information for each service\n");
+        printf(" quit                - Kill monit daemon process\n");
+        printf(" validate            - Check all services and start if not running\n");
+        printf(" procmatch <pattern> - Test process matching pattern\n");
+        printf("\n");
+        printf("(Action arguments operate on services defined in the control file)\n");
+}
+
+/**
+ * Print version information
+ */
+static void version() {
+        printf("This is Monit version " VERSION "\n");
+        printf("Copyright (C) 2001-2012 Tildeslash Ltd.");
+        printf(" All Rights Reserved.\n");
+}
+
+
+/**
+ * M/Monit heartbeat thread
+ */
+static void *heartbeat(void *args) {
+        sigset_t ns;
+        struct timespec wait;
+        
+        set_signal_block(&ns, NULL);
+        LogInfo("M/Monit heartbeat started\n");
+        LOCK(heartbeatMutex)
+        {
+                while (! Run.stopped && ! Run.doreload) {
+                        handle_mmonit(NULL);
+                        wait.tv_sec = time(NULL) + Run.polltime;
+                        wait.tv_nsec = 0;
+                        pthread_cond_timedwait(&heartbeatCond, &heartbeatMutex, &wait);
+                }
+        }
+        END_LOCK;
+        LogInfo("M/Monit heartbeat stopped\n");
+        return NULL;
+}
+
+
+/**
+ * Signalhandler for a daemon reload call
+ */
+static RETSIGTYPE do_reload(int sig) {
+        Run.doreload = TRUE;
+}
+
+
+/**
+ * Signalhandler for monit finalization
+ */
+static RETSIGTYPE do_destroy(int sig) {
+        Run.stopped = TRUE;
+}
+
+
+/**
+ * Signalhandler for a daemon wakeup call
+ */
+static RETSIGTYPE do_wakeup(int sig) {
+        Run.dowakeup = TRUE;
+}
+
+
+/* A simple non-blocking reaper to ensure that we wait-for and reap all/any stray child processes
+ we may have created and not waited on, so we do not create any zombie processes at exit */
+static void waitforchildren(void) {
+        while (waitpid(-1, NULL, WNOHANG) > 0) ;
+}
diff --git a/monit-5.4/src/monit.h b/monit-5.4/src/monit.h
new file mode 100644
index 0000000..c593025
--- /dev/null
+++ b/monit-5.4/src/monit.h
@@ -0,0 +1,1010 @@
+/*
+ * Copyright (C) 2001-2011 Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_H
+#define MONIT_H
+
+#include "config.h"
+#include <assert.h>
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "ssl.h"
+#include "socket.h"
+
+// libmonit
+#include "system/Command.h"
+#include "system/Process.h"
+#include "util/Str.h"
+#include "util/StringBuffer.h"
+
+
+#define MONITRC            "monitrc"
+#define TIMEFORMAT         "%Z %b %e %T"
+#define STRERROR            strerror(errno)
+#define STRLEN             256
+#ifndef USEC_PER_SEC
+#define USEC_PER_SEC       1000000L
+#endif
+#define USEC_PER_MSEC      1000L
+
+#define ARGMAX             64
+#define HTTP_CONTENT_MAX   (1024*1000)
+/* Set event queue directory mode: "drwx------" */
+#define QUEUEMASK          0077
+/* Set file mode: "drw-------" */
+#define PRIVATEMASK        0177
+/* Set log file mode: "-rw-r-----" */
+#define LOGMASK            0137
+/* Set pid file mode: "-rw-r--r--" */
+#define MYPIDMASK          0122
+#define MYPIDDIR           PIDDIR
+#define MYPIDFILE          "monit.pid"
+#define MYSTATEFILE        "monit.state"
+#define MYIDFILE           "monit.id"
+#define MYEVENTLISTBASE    "/var/monit"
+
+#define LOCALHOST          "localhost"
+
+#define PORT_SMTP          25
+#define PORT_SMTPS         465
+#define PORT_HTTP          80
+#define PORT_HTTPS         443
+
+#define SSL_TIMEOUT        15
+
+#define START_DELAY        0
+#define EXEC_TIMEOUT       30
+
+#define START_HTTP         1
+#define STOP_HTTP          2
+
+#define TRUE               1
+#define FALSE              0
+
+#define MONITOR_NOT        0x0
+#define MONITOR_YES        0x1
+#define MONITOR_INIT       0x2
+#define MONITOR_WAITING    0x4
+
+#define EVERY_CYCLE        0
+#define EVERY_SKIPCYCLES   1
+#define EVERY_CRON         2
+#define EVERY_NOTINCRON    3
+
+#define STATE_SUCCEEDED    0
+#define STATE_FAILED       1
+#define STATE_CHANGED      2
+#define STATE_CHANGEDNOT   3
+#define STATE_INIT         4
+
+#define MODE_ACTIVE        0
+#define MODE_PASSIVE       1
+#define MODE_MANUAL        2
+
+#define OPERATOR_GREATER   0
+#define OPERATOR_LESS      1
+#define OPERATOR_EQUAL     2
+#define OPERATOR_NOTEQUAL  3
+
+#define TIME_SECOND        1
+#define TIME_MINUTE        60
+#define TIME_HOUR          3600
+#define TIME_DAY           86400
+
+#define ACTION_IGNORE      0
+#define ACTION_ALERT       1
+#define ACTION_RESTART     2
+#define ACTION_STOP        3
+#define ACTION_EXEC        4
+#define ACTION_UNMONITOR   5
+#define ACTION_START       6
+#define ACTION_MONITOR     7
+
+#define TYPE_FILESYSTEM    0
+#define TYPE_DIRECTORY     1
+#define TYPE_FILE          2
+#define TYPE_PROCESS       3
+#define TYPE_HOST          4
+#define TYPE_SYSTEM        5
+#define TYPE_FIFO          6
+#define TYPE_PROGRAM       7
+
+#define RESOURCE_ID_CPU_PERCENT       1
+#define RESOURCE_ID_MEM_PERCENT       2
+#define RESOURCE_ID_MEM_KBYTE         3
+#define RESOURCE_ID_LOAD1             4
+#define RESOURCE_ID_LOAD5             5
+#define RESOURCE_ID_LOAD15            6
+#define RESOURCE_ID_CHILDREN          7
+#define RESOURCE_ID_TOTAL_MEM_KBYTE   8
+#define RESOURCE_ID_TOTAL_MEM_PERCENT 9
+#define RESOURCE_ID_INODE             10
+#define RESOURCE_ID_SPACE             11
+#define RESOURCE_ID_CPUUSER           12
+#define RESOURCE_ID_CPUSYSTEM         13
+#define RESOURCE_ID_CPUWAIT           14
+#define RESOURCE_ID_TOTAL_CPU_PERCENT 15
+#define RESOURCE_ID_SWAP_PERCENT      16
+#define RESOURCE_ID_SWAP_KBYTE        17
+
+#define DIGEST_CLEARTEXT   1
+#define DIGEST_CRYPT       2
+#define DIGEST_MD5         3
+#define DIGEST_PAM         4
+
+#define UNIT_BYTE          1
+#define UNIT_KILOBYTE      1024
+#define UNIT_MEGABYTE      1048580
+#define UNIT_GIGABYTE      1073740000
+
+#define HASH_UNKNOWN       0
+#define HASH_MD5           1
+#define HASH_SHA1          2
+#define DEFAULT_HASH       HASH_MD5   
+/* Length of the longest message digest in bytes */
+#define MD_SIZE            65
+
+#define PROTOCOL_NULL      0
+#define PROTOCOL_HTTP      1
+#define PROTOCOL_HTTPS     2
+
+#define LEVEL_FULL         0
+#define LEVEL_SUMMARY      1
+
+#define LEVEL_NAME_FULL    "full"
+#define LEVEL_NAME_SUMMARY "summary"
+
+#define HANDLER_SUCCEEDED  0x0
+#define HANDLER_ALERT      0x1
+#define HANDLER_MMONIT     0x2
+#define HANDLER_MAX        HANDLER_MMONIT
+
+#define ICMP_ATTEMPT_COUNT      3         
+
+
+/** ------------------------------------------------- Special purpose macros */
+
+
+/* Replace the standard signal function with a more reliable using
+ * sigaction. Taken from Stevens APUE book. */
+typedef void Sigfunc(int);
+Sigfunc *signal(int signo, Sigfunc * func);
+#if defined(SIG_IGN) && !defined(SIG_ERR)
+#define SIG_ERR ((Sigfunc *)-1)
+#endif
+
+
+/** ------------------------------------------------- General purpose macros */
+
+
+#undef MAX
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+#undef MIN
+#define MIN(x,y) ((x) < (y) ? (x) : (y))
+#define IS(a,b)  ((a&&b)?!strcasecmp(a, b):0)
+#define DEBUG if(Run.debug) LogDebug
+#define FLAG(x, y) (x & y) == y 
+#define NVLSTR(x) (x?x:"")
+
+
+/** ------------------------------------------------- Synchronization macros */
+
+
+#define LOCK(mutex) do { pthread_mutex_t *_yymutex = &(mutex); \
+assert(pthread_mutex_lock(_yymutex)==0);
+#define END_LOCK assert(pthread_mutex_unlock(_yymutex)==0); } while (0)
+
+
+/** ------------------------------------------ Simple Assert Exception macro */
+
+
+#define ASSERT(e) do { if(!(e)) { LogCritical("AssertException: " #e \
+" at %s:%d\naborting..\n", __FILE__, __LINE__); abort(); } } while(0)
+
+
+/* --------------------------------------------------------- Data structures */
+
+
+/** Message Digest type with size for the longest digest we will compute */
+typedef char MD_T[MD_SIZE];
+
+
+/**
+ * Defines a Command with ARGMAX optional arguments. The arguments
+ * array must be NULL terminated and the first entry is the program
+ * itself. In addition, a user and group may be set for the Command
+ * which means that the Command should run as a certain user and with
+ * certain group.
+ */
+typedef struct mycommand {
+        char *arg[ARGMAX];                             /**< Program with arguments */
+        int   length;                       /**< The length of the arguments array */
+        int   has_uid;          /**< TRUE if a new uid is defined for this Command */
+        uid_t uid;         /**< The user id to switch to when running this Command */
+        int   has_gid;          /**< TRUE if a new gid is defined for this Command */
+        gid_t gid;        /**< The group id to switch to when running this Command */
+        unsigned timeout;     /**< Max seconds which we wait for method to execute */
+} *command_t;
+
+
+/** Defines an event action object */
+typedef struct myaction {
+        int       id;                                     /**< Action to be done */
+        command_t exec;                    /**< Optional command to be executed  */
+        unsigned  count;           /**< Event count needed to trigger the action */
+        unsigned  cycles;    /**< Cycles during which count limit can be reached */
+} *Action_T;
+
+
+/** Defines event's up and down actions */
+typedef struct myeventaction {
+        Action_T  failed;                  /**< Action in the case of failure down */
+        Action_T  succeeded;                    /**< Action in the case of failure up */
+} *EventAction_T;
+
+
+/** Defines an url object */
+typedef struct myurl {
+        char *url;                                                  /**< Full URL */
+        char *protocol;                                    /**< URL protocol type */
+        char *user;                                        /**< URL user     part */
+        char *password;                                    /**< URL password part */
+        char *hostname;                                    /**< URL hostname part */
+        int   port;                                        /**< URL port     part */
+        char *path;                                        /**< URL path     part */
+        char *query;                                       /**< URL query    part */
+} *URL_T;
+
+
+/** Defines a HTTP client request object */
+typedef struct myrequest {
+        URL_T url;                                               /**< URL request */
+        int   operator;                 /**< Response content comparison operator */
+#ifdef HAVE_REGEX_H
+        regex_t *regex;                   /* regex used to test the response body */
+#else
+        char *regex;                 /* string to search for in the response body */
+#endif
+} *Request_T;
+
+
+/** Defines an event notification and status receiver object */
+typedef struct mymmonit {
+        URL_T url;                                             /**< URL definition */
+        Ssl_T ssl;                                             /**< SSL definition */
+        int   timeout;              /**< The timeout to wait for connection or i/o */
+        
+        /** For internal use */
+        struct mymmonit *next;                         /**< next receiver in chain */
+} *Mmonit_T;
+
+
+/** Defines a mailinglist object */
+typedef struct mymail {
+        char *to;                         /**< Mail address for alert notification */
+        char *from;                                     /**< The mail from address */
+        char *replyto;                              /**< Optional reply-to address */
+        char *subject;                                       /**< The mail subject */
+        char *message;                                       /**< The mail message */
+        unsigned int events;  /*< Events for which this mail object should be sent */
+        unsigned int reminder;              /*< Send error reminder each Xth cycle */
+        
+        /** For internal use */
+        struct mymail *next;                          /**< next recipient in chain */
+} *Mail_T;
+
+
+/** Defines a mail server address */
+typedef struct mymailserver {
+        char *host;     /**< Server host address, may be a IP or a hostname string */
+        int   port;                                               /**< Server port */
+        char *username;                               /** < Username for SMTP_AUTH */
+        char *password;                               /** < Password for SMTP_AUTH */
+        Ssl_T ssl;                                             /**< SSL definition */
+        
+        /** For internal use */
+        struct mymailserver *next;        /**< Next server to try on connect error */
+} *MailServer_T;
+
+
+typedef struct myauthentication {
+        char *uname;                  /**< User allowed to connect to monit httpd */
+        char *passwd;                                /**< The users password data */
+        char *groupname;                                      /**< PAM group name */
+        int   digesttype;                      /**< How did we store the password */
+        int   is_readonly;     /**< TRUE if this is a read-only authenticated user*/
+        struct myauthentication *next;       /**< Next credential or NULL if last */
+} *Auth_T;
+
+
+/** Defines process tree - data storage backend*/
+typedef struct myprocesstree {
+        int           pid;
+        int           ppid;
+        int           status_flag;
+        time_t        starttime;
+        char         *cmdline;
+        
+        int           visited;
+        int           children_num;
+        int           children_sum;
+        int           cpu_percent;
+        int           cpu_percent_sum;
+        unsigned long mem_kbyte;
+        unsigned long mem_kbyte_sum;
+        
+        /** For internal use */
+        double        time;                                      /**< 1/10 seconds */
+        double        time_prev;                                 /**< 1/10 seconds */
+        long          cputime;                                   /**< 1/10 seconds */
+        long          cputime_prev;                              /**< 1/10 seconds */
+        
+        int           parent;
+        int          *children;
+} ProcessTree_T;
+
+
+/** Defines data for systemwide statistic */
+typedef struct mysysteminfo {
+        struct timeval collected;                    /**< When were data collected */
+        int cpus;                                              /**< Number of CPUs */
+        double loadavg[3];                                /**< Load average triple */
+        unsigned long mem_kbyte_max;               /**< Maximal system real memory */
+        unsigned long swap_kbyte_max;                               /**< Swap size */
+        unsigned long total_mem_kbyte; /**< Total real memory in use in the system */
+        unsigned long total_swap_kbyte;       /**< Total swap in use in the system */
+        int    total_mem_percent;      /**< Total real memory in use in the system */
+        int    total_swap_percent;            /**< Total swap in use in the system */
+        int    total_cpu_user_percent;   /**< Total CPU in use in user space (pct.)*/
+        int    total_cpu_syst_percent; /**< Total CPU in use in kernel space (pct.)*/
+        int    total_cpu_wait_percent;      /**< Total CPU in use in waiting (pct.)*/
+        struct utsname uname;        /**< Platform information provided by uname() */
+} SystemInfo_T;
+
+
+/** Defines a protocol object with protocol functions */
+typedef struct Protocol_T {
+        const char *name;                                       /**< Protocol name */
+        int(*check)(Socket_T);                 /**< Protocol verification function */
+} *Protocol_T;
+
+
+/** Defines a send/expect object used for generic protocol tests */
+typedef struct mygenericproto {
+        char *send;                           /* string to send, or NULL if expect */
+#ifdef HAVE_REGEX_H
+        regex_t *expect;                  /* regex code to expect, or NULL if send */
+#else
+        char *expect;                         /* string to expect, or NULL if send */
+#endif
+        /** For internal use */
+        struct mygenericproto *next;
+} *Generic_T;
+
+/** Defines a port object */
+typedef struct myport {
+        volatile int socket;                       /**< Socket used for connection */
+        int  type;                  /**< Socket type used for connection (UDP/TCP) */
+        int  family;            /**< Socket family used for connection (INET/UNIX) */
+        char *hostname;                                     /**< Hostname to check */
+        int  port;                                                 /**< Portnumber */
+        char *request;                              /**< Specific protocol request */
+        char *request_checksum;     /**< The optional checksum for a req. document */
+        char *request_hostheader;            /**< The optional Host: header to use */
+        int  request_hashtype;  /**< The optional type of hash for a req. document */
+        char *pathname;                   /**< Pathname, in case of an UNIX socket */
+        int maxforward;            /**< Optional max forward for protocol checking */
+        Generic_T generic;                                /**< Generic test handle */
+        int timeout;   /**< The timeout in seconds to wait for connect or read i/o */
+        int retry;       /**< Number of connection retry before reporting an error */
+        int is_available;                /**< TRUE if the server/port is available */
+        double response;                      /**< Socket connection response time */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        /** Apache-status specific parameters */
+        struct apache_status {
+                int loglimit;                  /**< Max percentatge of logging processes */
+                int loglimitOP;                                   /**< loglimit operator */
+                int closelimit;             /**< Max percentatge of closinging processes */
+                int closelimitOP;                               /**< closelimit operator */
+                int dnslimit;         /**< Max percentatge of processes doing DNS lookup */
+                int dnslimitOP;                                   /**< dnslimit operator */
+                int keepalivelimit;          /**< Max percentatge of keepalive processes */
+                int keepalivelimitOP;                       /**< keepalivelimit operator */
+                int replylimit;               /**< Max percentatge of replying processes */
+                int replylimitOP;                               /**< replylimit operator */
+                int requestlimit;     /**< Max percentatge of processes reading requests */
+                int requestlimitOP;                           /**< requestlimit operator */
+                int startlimit;            /**< Max percentatge of processes starting up */
+                int startlimitOP;                               /**< startlimit operator */
+                int waitlimit;  /**< Min percentatge of processes waiting for connection */
+                int waitlimitOP;                                 /**< waitlimit operator */
+                int gracefullimit;/**< Max percentatge of processes gracefully finishing */
+                int gracefullimitOP;                         /**< gracefullimit operator */
+                int cleanuplimit;      /**< Max percentatge of processes in idle cleanup */
+                int cleanuplimitOP;                           /**< cleanuplimit operator */
+        } ApacheStatus;
+        
+        Ssl_T SSL;                                             /**< SSL definition */
+        Protocol_T protocol;     /**< Protocol object for testing a port's service */
+        Request_T url_request;             /**< Optional url client request object */
+        
+        /** For internal use */
+        struct myport *next;                               /**< next port in chain */
+} *Port_T;
+
+
+/** Defines a ICMP object */
+typedef struct myicmp {
+        int type;                                              /**< ICMP type used */
+        int count;                                   /**< ICMP echo requests count */
+        int timeout;              /**< The timeout in seconds to wait for response */
+        int is_available;                     /**< TRUE if the server is available */
+        double response;                              /**< ICMP ECHO response time */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct myicmp *next;                               /**< next icmp in chain */
+} *Icmp_T;
+
+
+typedef struct myservicegroupmember {
+        char *name;                                           /**< name of service */
+        
+        /** For internal use */
+        struct myservicegroupmember *next;              /**< next service in chain */
+} *ServiceGroupMember_T;
+
+
+typedef struct myservicegroup {
+        char *name;                                     /**< name of service group */
+        struct myservicegroupmember *members;           /**< Service group members */
+        
+        /** For internal use */
+        struct myservicegroup *next;              /**< next service group in chain */
+} *ServiceGroup_T;
+
+
+typedef struct mydependant {
+        char *dependant;                            /**< name of dependant service */
+        
+        /** For internal use */
+        struct mydependant *next;             /**< next dependant service in chain */
+} *Dependant_T;
+
+
+/** Defines resource data */
+typedef struct myresource {
+        int  resource_id;                              /**< Which value is checked */
+        long limit;                                     /**< Limit of the resource */
+        int  operator;                                    /**< Comparison operator */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct myresource *next;                       /**< next resource in chain */
+} *Resource_T;
+
+
+/** Defines timestamp object */
+typedef struct mytimestamp {
+        int  operator;                                    /**< Comparison operator */
+        int  time;                                        /**< Timestamp watermark */
+        int  test_changes;            /**< TRUE if we only should test for changes */
+        time_t timestamp; /**< The original last modified timestamp for this object*/
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct mytimestamp *next;                     /**< next timestamp in chain */
+} *Timestamp_T;
+
+
+/** Defines action rate object */
+typedef struct myactionrate {
+        int  count;                                            /**< Action counter */
+        int  cycle;                                             /**< Cycle counter */
+        EventAction_T action;    /**< Description of the action upon matching rate */
+        
+        /** For internal use */
+        struct myactionrate *next;                   /**< next actionrate in chain */
+} *ActionRate_T;
+
+
+/** Defines when to run a check for a service. This type suports both the old
+ cycle based every statement and the new cronformat version */
+typedef struct myevery {
+        int type; /**< 0 = not set, 1 = cycle, 2 = cron, 3 = negated cron */
+        union {
+                struct {
+                        int number; /**< Check this program at a given cycles */                 
+                        int counter; /**< Counter for number. When counter == number, check */
+                } cycle; /**< Old cycle based every check */
+                char *cron; /* A crontab format string */
+        } spec;
+} Every_T;
+
+typedef struct myprogram {
+        int return_value;                /**< Return value of the program to check */
+        int  operator;                                    /**< Comparison operator */
+        int timeout;          /**< How long the program may run until it is killed */
+        time_t started;                      /**< When the sub-process was started */
+        int exitStatus;                 /**< Sub-process exit status for reporting */
+        Process_T P;          /**< A Process_T object representing the sub-process */
+        Command_T C;          /**< A Command_T object for building the sub-process */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+} *Program_T;
+
+
+/** Defines size object */
+typedef struct mysize {
+        int  operator;                                    /**< Comparison operator */
+        unsigned long long size;                               /**< Size watermark */
+        int  test_changes;            /**< TRUE if we only should test for changes */
+        int  test_changes_ok;   /**< TRUE if size was initialized for changes test */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct mysize *next;                               /**< next size in chain */
+} *Size_T;
+
+
+/** Defines uptime object */
+typedef struct myuptime {
+        int  operator;                                    /**< Comparison operator */
+        unsigned long long uptime;                           /**< Uptime watermark */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+
+        /** For internal use */
+        struct myuptime *next;                           /**< next uptime in chain */
+} *Uptime_T;
+
+
+/** Defines checksum object */
+typedef struct mychecksum {
+        MD_T  hash;                     /**< A checksum hash computed for the path */
+        int   type;                       /**< The type of hash (e.g. md5 or sha1) */
+        int   length;                                      /**< Length of the hash */
+        int   test_changes;           /**< TRUE if we only should test for changes */
+        int   test_changes_ok; /**< TRUE if cksum was initialized for changes test */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+} *Checksum_T;
+
+
+/** Defines permission object */
+typedef struct myperm {
+        int       perm;                                     /**< Access permission */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+} *Perm_T;
+
+/** Defines match object */
+typedef struct mymatch {
+        int     ignore;                                          /**< Ignore match */
+        int     not;                                             /**< Invert match */
+        char    *match_string;                                   /**< Match string */
+        char    *match_path;                         /**< File with matching rules */
+#ifdef HAVE_REGEX_H
+        regex_t *regex_comp;                                    /**< Match compile */
+#endif
+        StringBuffer_T log;    /**< The temporary buffer used to record the matches */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct mymatch *next;                             /**< next match in chain */
+} *Match_T;
+
+
+/** Defines uid object */
+typedef struct myuid {
+        uid_t     uid;                                            /**< Owner's uid */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+} *Uid_T;
+
+
+/** Defines gid object */
+typedef struct mygid {
+        gid_t     gid;                                            /**< Owner's gid */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+} *Gid_T;
+
+
+/** Defines filesystem configuration */
+typedef struct myfilesystem {
+        int  resource;                        /**< Whether to check inode or space */
+        int  operator;                                    /**< Comparison operator */
+        long limit_absolute;                               /**< Watermark - blocks */
+        int  limit_percent;                               /**< Watermark - percent */
+        EventAction_T action;  /**< Description of the action upon event occurence */
+        
+        /** For internal use */
+        struct myfilesystem *next;                   /**< next filesystem in chain */
+} *Filesystem_T;
+
+
+/** Defines service data */
+typedef struct myinfo {
+        /* Shared */
+        mode_t  st_mode;                                           /**< Permission */
+        uid_t   st_uid;                                           /**< Owner's uid */
+        gid_t   st_gid;                                           /**< Owner's gid */
+        time_t  timestamp;                                          /**< Timestamp */
+        
+        union {
+                struct {
+                        long   f_bsize;                               /**< Transfer block size */
+                        long   f_blocks;                  /**< Total data blocks in filesystem */
+                        long   f_blocksfree;       /**< Free blocks available to non-superuser */
+                        long   f_blocksfreetotal;               /**< Free blocks in filesystem */
+                        long   f_files;                    /**< Total file nodes in filesystem */
+                        long   f_filesfree;                 /**< Free file nodes in filesystem */
+                        char  *mntpath;          /**< Filesystem file, directory or mountpoint */
+                        int    inode_percent;                  /**< Used inode percentage * 10 */
+                        long   inode_total;                      /**< Used inode total objects */
+                        int    space_percent;                  /**< Used space percentage * 10 */
+                        long   space_total;                       /**< Used space total blocks */
+                        int    _flags;                   /**< Filesystem flags from last cycle */
+                        int    flags;                  /**< Filesystem flags from actual cycle */
+                } filesystem;
+                
+                struct {
+                        off_t st_size;                                               /**< Size */
+                        off_t readpos;                        /**< Position for regex matching */
+                        ino_t st_ino;                                               /**< Inode */
+                        ino_t st_ino_prev;              /**< Previous inode for regex matching */
+                        MD_T  cs_sum;                                            /**< Checksum */
+                } file;
+                
+                struct {
+                        int    _pid;                          /**< Process PID from last cycle */
+                        int    _ppid;                  /**< Process parent PID from last cycle */
+                        int    pid;                         /**< Process PID from actual cycle */
+                        int    ppid;                 /**< Process parent PID from actual cycle */
+                        int    status_flag;
+                        int    children;
+                        long   mem_kbyte;    
+                        long   total_mem_kbyte;
+                        int    mem_percent;                               /**< percentage * 10 */
+                        int    total_mem_percent;                         /**< percentage * 10 */
+                        int    cpu_percent;                               /**< percentage * 10 */
+                        int    total_cpu_percent;                         /**< percentage * 10 */
+                        time_t uptime;                                     /**< Process uptime */
+                } process;
+        } priv;
+} *Info_T;
+
+
+/** Defines service data */
+typedef struct myservice {
+        
+        /** Common parameters */
+        char *name;                                  /**< Service descriptive name */
+        int (*check)(struct myservice *);       /**< Service verification function */
+        int  type;                                     /**< Monitored service type */
+        int  monitor;                                      /**< Monitor state flag */
+        int  mode;                            /**< Monitoring mode for the service */
+        int  ncycle;                          /**< The number of the current cycle */
+        int  nstart;           /**< The number of current starts with this service */
+        int  visited;      /**< Service visited flag, set if dependencies are used */
+        int  depend_visited;/**< Depend visited flag, set if dependencies are used */
+        Every_T every;              /**< Timespec for when to run check of service */
+        command_t start;                    /**< The start command for the service */
+        command_t stop;                      /**< The stop command for the service */
+        command_t restart;
+        
+        Dependant_T dependantlist;                     /**< Dependant service list */
+        Mail_T      maillist;                  /**< Alert notification mailinglist */
+        
+        /** Test rules and event handlers */
+        ActionRate_T actionratelist;                    /**< ActionRate check list */
+        Checksum_T  checksum;                                  /**< Checksum check */
+        Filesystem_T filesystemlist;                    /**< Filesystem check list */
+        Gid_T       gid;                                            /**< Gid check */
+        Icmp_T      icmplist;                                 /**< ICMP check list */
+        Perm_T      perm;                                    /**< Permission check */
+        Port_T      portlist; /**< Portnumbers to check, either local or at a host */
+        Resource_T  resourcelist;                          /**< Resouce check list */
+        Size_T      sizelist;                                 /**< Size check list */
+        Uptime_T    uptimelist;                             /**< Uptime check list */
+        Match_T     matchlist;                             /**< Content Match list */
+        Match_T     matchignorelist;                /**< Content Match ignore list */
+        Timestamp_T timestamplist;                       /**< Timestamp check list */
+        Uid_T       uid;                                            /**< Uid check */
+        Program_T   program;              /**< Status (of program execution) check */
+        
+        
+        EventAction_T action_PID;                      /**< Action upon pid change */
+        EventAction_T action_PPID;                    /**< Action upon ppid change */
+        EventAction_T action_FSFLAG;      /**< Action upon filesystem flags change */
+        
+        /** General event handlers */
+        EventAction_T action_DATA;       /**< Description of the action upon event */
+        EventAction_T action_EXEC;       /**< Description of the action upon event */
+        EventAction_T action_INVALID;    /**< Description of the action upon event */
+        EventAction_T action_NONEXIST;   /**< Description of the action upon event */
+        
+        /** Internal monit events */
+        EventAction_T action_MONIT_START;         /**< Monit instance start action */
+        EventAction_T action_MONIT_STOP;           /**< Monit instance stop action */
+        EventAction_T action_MONIT_RELOAD;       /**< Monit instance reload action */
+        EventAction_T action_ACTION;           /**< Action requested by CLI or GUI */
+        
+        /** Runtime parameters */
+        int                error;                          /**< Error flags bitmap */
+        int                error_hint;   /**< Failed/Changed hint for error bitmap */
+        Info_T             inf;                          /**< Service check result */
+        struct timeval     collected;                /**< When were data collected */
+        int                doaction;          /**< Action scheduled by http thread */
+        char              *token;                                /**< Action token */
+        
+        /** Events */
+        struct myevent {
+                #define           EVENT_VERSION  3      /**< The event structure version */
+                long              id;                      /**< The event identification */
+                struct timeval    collected;                 /**< When the event occured */
+                char             *source;                 /**< Event source service name */
+                int               mode;             /**< Monitoring mode for the service */
+                int               type;                      /**< Monitored service type */
+                short             state;         /**< TRUE if failed, FALSE if succeeded */
+                short             state_changed;              /**< TRUE if state changed */
+                long long         state_map;           /**< Event bitmap for last cycles */
+                unsigned int      count;                             /**< The event rate */
+                unsigned int      flag;                     /**< The handlers state flag */
+                char             *message;    /**< Optional message describing the event */
+                EventAction_T     action;           /**< Description of the event action */
+                /** For internal use */
+                struct myevent   *next;                         /**< next event in chain */
+                struct myevent   *previous;                 /**< previous event in chain */
+        } *eventlist;                                     /**< Pending events list */
+        
+        /** Context specific parameters */
+        char *path;  /**< Path to the filesys, file, directory or process pid file */
+        
+        /** For internal use */
+        pthread_mutex_t   mutex;        /**< Mutex used for action synchronization */
+        struct myservice *next;                         /**< next service in chain */
+        struct myservice *next_conf;      /**< next service according to conf file */
+        struct myservice *next_depend;           /**< next depend service in chain */
+} *Service_T;
+
+
+typedef struct myevent *Event_T;
+
+
+/** Defines data for application runtime */
+struct myrun {
+        volatile int  stopped;/**< TRUE if monit was stopped. Flag used by threads */
+        char *controlfile;                /**< The file to read configuration from */
+        char *logfile;                         /**< The file to write logdata into */
+        char *localhostname;                      /**< The host name for localhost */
+        char *pidfile;                                  /**< This programs pidfile */
+        char *idfile;                           /**< The file with unique monit id */
+        char id[STRLEN];                                      /**< Unique monit id */
+        char *statefile;                /**< The file with the saved runtime state */
+        char *mygroup;                              /**< Group Name of the Service */
+        int  debug;                   /**< Write debug information - TRUE or FALSE */
+        int  use_syslog;                          /**< If TRUE write log to syslog */
+        int  dolog;       /**< TRUE if program should log actions, otherwise FALSE */
+        int  isdaemon;                 /**< TRUE if program should run as a daemon */
+        int  polltime;        /**< In deamon mode, the sleeptime (sec) between run */
+        int  startdelay;                    /**< the sleeptime (sec) after startup */
+        int  dohttpd;                    /**< TRUE if monit HTTP server should run */
+        int  httpdssl;                     /**< TRUE if monit HTTP server uses ssl */
+        char *httpsslpem;                       /**< PEM file for the HTTPS server */
+        int  clientssl;   /**< TRUE if monit HTTP server uses ssl with client auth */
+        char *httpsslclientpem;      /**< PEM file/dir to check against at connect */
+        int  allowselfcert;   /**< TRUE if self certified client certs are allowed */
+        int  httpdsig;   /**< TRUE if monit HTTP server presents version signature */
+        int  httpdport;                    /**< The monit http server's portnumber */
+        int  once;                                       /**< TRUE - run only once */
+        int  init;                   /**< TRUE - don't background to run from init */
+        int  facility;              /** The facility to use when running openlog() */
+        int  doprocess;                 /**< TRUE if process status engine is used */
+        char *bind_addr;                  /**< The address monit http will bind to */
+        volatile int  doreload;    /**< TRUE if a monit daemon should reinitialize */
+        volatile int  dowakeup;  /**< TRUE if a monit daemon was wake up by signal */
+        int  doaction;             /**< TRUE if some service(s) has action pending */
+        mode_t umask;                /**< The initial umask monit was started with */
+        int  testing;   /**< Running in configuration testing mode - TRUE or FALSE */
+        time_t incarnation;              /**< Unique ID for running monit instance */
+        int  handler_init;                  /**< The handlers queue initialization */
+        int  handler_flag;                            /**< The handlers state flag */
+        int  handler_queue[HANDLER_MAX+1];         /**< The handlers queue counter */
+        Service_T system;                          /**< The general system service */
+        char *eventlist_dir;                   /**< The event queue base directory */
+        int  eventlist_slots;          /**< The event queue size - number of slots */
+        int  expectbuffer; /**< Generic protocol expect buffer - STRLEN by default */
+        
+        /** An object holding program relevant "environment" data, see; env.c */
+        struct myenvironment {
+                char *user;             /**< The the effective user running this program */
+                char *home;                                    /**< Users home directory */
+                char *cwd;                                /**< Current working directory */
+        } Env;
+        
+        char *mail_hostname;    /**< Used in HELO/EHLO/MessageID when sending mail */
+        int mailserver_timeout;    /**< Connect and read timeout for a SMTP server */
+        Mail_T maillist;                /**< Global alert notification mailinglist */
+        MailServer_T mailservers;    /**< List of MTAs used for alert notification */
+        Mmonit_T mmonits;        /**< Event notification and status receivers list */
+        Auth_T credentials;    /** A list holding Basic Authentication information */
+        int dommonitcredentials;   /**< TRUE if M/Monit should receive credentials */
+        Auth_T mmonitcredentials;     /**< Pointer to selected credentials or NULL */
+        Event_T eventlist;              /** A list holding partialy handled events */
+        /** User selected standard mail format */
+        struct myformat {
+                char *from;                          /**< The standard mail from address */
+                char *replyto;                             /**< Optional reply-to header */
+                char *subject;                            /**< The standard mail subject */
+                char *message;                            /**< The standard mail message */
+        } MailFormat;
+        
+        pthread_mutex_t mutex;    /**< Mutex used for service data synchronization */
+#ifdef OPENSSL_FIPS
+        int fipsEnabled;                /** TRUE if monit should use FIPS-140 mode */
+#endif
+};
+
+
+/* -------------------------------------------------------- Global variables */
+
+extern const char    *prog;
+extern struct myrun   Run;
+extern Service_T      servicelist;
+extern Service_T      servicelist_conf;
+extern ServiceGroup_T servicegrouplist;
+extern SystemInfo_T   systeminfo;
+extern ProcessTree_T *ptree;     
+extern int            ptreesize;    
+extern ProcessTree_T *oldptree;  
+extern int            oldptreesize; 
+
+extern char *actionnames[];
+extern char *modenames[];
+extern char *checksumnames[];
+extern char *operatornames[];
+extern char *operatorshortnames[];
+extern char *statusnames[];
+extern char *servicetypes[];
+extern char *pathnames[];
+extern char *icmpnames[];
+extern char *sslnames[];
+
+/* ------------------------------------------------------- Public prototypes */
+
+#include "util.h"
+#include "file.h"
+
+// libmonit
+#include "system/Mem.h"
+
+
+/* FIXME: move remaining prototypes into seperate header-files */
+
+int   parse(char *);
+int   control_service(const char *, int);
+int   control_service_string(const char *, const char *);
+int   control_service_daemon(const char *, const char *);
+void  setup_dependants();
+void  reset_depend();
+void  spawn(Service_T, command_t, Event_T);
+int   status(char *);
+int   log_init();
+void  LogEmergency(const char *, ...);
+void  LogAlert(const char *, ...);
+void  LogCritical(const char *, ...);
+void  LogError(const char *, ...);
+void  vLogError(const char *s, va_list ap);
+void vLogAbortHandler(const char *s, va_list ap);
+void  LogWarning(const char *, ...);
+void  LogNotice(const char *, ...);
+void  LogInfo(const char *, ...);
+void  LogDebug(const char *, ...);
+void  log_close();
+#ifndef HAVE_VSYSLOG
+#ifdef HAVE_SYSLOG
+void vsyslog (int, const char *, va_list);
+#endif /* HAVE_SYSLOG */
+#endif /* HAVE_VSYSLOG */
+int   validate();
+void  daemonize();
+void  gc();
+void  gc_mail_list(Mail_T *);
+void  gccmd(command_t *);
+void  gc_event(Event_T *e);
+int   kill_daemon(int);
+int   exist_daemon(); 
+int   sendmail(Mail_T);
+int   sock_msg(int, char *, ...);
+void  init_env();
+void  monit_http(int);
+int   can_http();
+char *format(const char *, va_list, long *);
+void  redirect_stdfd();
+void  fd_close();
+pid_t getpgid(pid_t);
+void unset_signal_block(sigset_t *);
+void set_signal_block(sigset_t *, sigset_t *);
+int  check_process(Service_T);
+int  check_filesystem(Service_T);
+int  check_file(Service_T);
+int  check_directory(Service_T);
+int  check_remote_host(Service_T);
+int  check_system(Service_T);
+int  check_fifo(Service_T);
+int  check_program(Service_T);
+int  check_URL(Service_T s);
+int  sha_md5_stream (FILE *, void *, void *);
+void reset_procinfo(Service_T);
+int  check_service_status(Service_T);
+void printhash(char *);  
+void status_xml(StringBuffer_T, Event_T, short, int, const char *);
+int  handle_mmonit(Event_T);
+int  do_wakeupcall();
+
+#endif
diff --git a/monit-5.4/src/net.c b/monit-5.4/src/net.c
new file mode 100644
index 0000000..91d8d55
--- /dev/null
+++ b/monit-5.4/src/net.c
@@ -0,0 +1,852 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef NEED_SOCKLEN_T_DEFINED
+#define _BSD_SOCKLEN_T_
+#endif
+
+#ifdef HAVE_NETINET_IN_SYSTM_H
+#include <netinet/in_systm.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif 
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+
+#ifdef HAVE_SYS_UN_H
+#include <sys/un.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+
+#ifdef HAVE_NETINET_IP_H
+#include <netinet/ip.h>
+#endif
+
+#ifdef HAVE_NETINET_IP_ICMP_H
+#include <netinet/ip_icmp.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#else
+#define offsetof(st, m) ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifndef __dietlibc__
+#ifdef HAVE_STROPTS_H
+#include <stropts.h>
+#endif
+#endif
+
+#include <arpa/inet.h>
+
+#include "monit.h"
+#include "net.h"
+#include "ssl.h"
+
+/**
+ *  General purpose Network and Socket methods.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+#define DATALEN 64
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/*
+ * Do a non blocking connect, timeout if not connected within timeout seconds
+ */
+static int do_connect(int s, const struct sockaddr *addr, socklen_t addrlen, int timeout) {
+  int error = 0;
+  struct pollfd fds[1];
+
+  switch (connect(s, addr, addrlen)) {
+    case 0:
+      return 0;
+    default:
+      if (errno != EINPROGRESS)
+        return -1;
+      break;
+  }
+  fds[0].fd = s;
+  fds[0].events = POLLIN|POLLOUT;
+  if (poll(fds, 1, timeout * 1000) == 0) {
+    errno = ETIMEDOUT;
+    return -1;
+  }
+  if (fds[0].events & POLLIN || fds[0].events & POLLOUT) {
+    socklen_t len = sizeof(error);
+    if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
+      return -1; // Solaris pending error
+  } else {
+    return -1;
+  }
+  if (error) {
+    errno = error;
+    return -1;
+  }
+  return 0;
+}
+
+
+/*
+ * Compute Internet Checksum for "count" bytes beginning at location "addr".
+ * Based on RFC1071.
+ */
+static unsigned short checksum_ip(unsigned char *_addr, int count) {
+
+  register long sum= 0;
+  unsigned short *addr= (unsigned short *)_addr;
+
+  while(count > 1) {
+    sum += *addr++;
+    count -= 2;
+  }
+
+  /* Add left-over byte, if any */
+  if(count > 0)
+    sum += *(unsigned char *)addr;
+
+  /* Fold 32-bit sum to 16 bits */
+  while(sum >> 16)
+    sum= (sum & 0xffff) + (sum >> 16);
+
+  return ~sum;
+
+}
+
+
+/*
+ * Check if data is available, if not, wait timeout milliseconds for data
+ * to be present.
+  */
+static int can_read_ms(int socket, int ms) {
+  int r = 0;
+  struct pollfd fds[1];
+
+  fds[0].fd = socket;
+  fds[0].events = POLLIN;
+  do {
+    r = poll(fds, 1, ms);
+  } while (r == -1 && errno == EINTR);
+  return (r > 0);
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Check if the hostname resolves
+ * @param hostname The host to check
+ * @return TRUE if hostname resolves, otherwise FALSE
+ */
+int check_host(const char *hostname) {
+
+  struct addrinfo hints;
+  struct addrinfo *res;
+
+  ASSERT(hostname);
+
+  memset(&hints, 0, sizeof(struct addrinfo));
+  hints.ai_family = PF_INET; /* we support just IPv4 currently */
+
+  if(getaddrinfo(hostname, NULL, &hints, &res) != 0)
+    return FALSE;
+
+  freeaddrinfo(res);
+
+  return TRUE;
+
+}
+
+
+/**
+ * Verify that the socket is ready for i|o
+ * @param socket A socket
+ * @return TRUE if the socket is ready, otherwise FALSE.
+ */
+int check_socket(int socket) {
+
+  return (can_read(socket, 0) || can_write(socket, 0));
+  
+}
+
+
+/**
+ * Verify that the udp server is up. The given socket must be a 
+ * connected udp socket if we should be able to test the udp server. 
+ * The test is conducted by sending a datagram to the server and
+ * check for a returned ICMP error when reading from the socket.
+ * @param socket A socket
+ * @return TRUE if the socket is ready, otherwise FALSE.
+ */
+int check_udp_socket(int socket) {
+  
+  char buf[STRLEN]= {0};
+
+  /* We have to send something and if the UDP server is down/unreachable
+   *  the remote host should send an ICMP error. We then need to call read
+   *  to get the ICMP error as a ECONNREFUSED errno. This test is asynchronous
+   *  so we must wait, but we do not want to block to long either and it is
+   *  probably better to report a server falsely up than to block to long.
+   */
+  sock_write(socket, buf, 1, 0);
+  if(sock_read(socket, buf, STRLEN, 2) < 0) {
+    switch(errno) {
+      case ECONNREFUSED: return FALSE;
+      default:           break;
+    }
+  }
+  
+  return TRUE;
+  
+}
+
+
+/**
+ * Create a non-blocking socket against hostname:port with the given
+ * type. The type should be either SOCK_STREAM or SOCK_DGRAM.
+ * @param hostname The host to open a socket at
+ * @param port The port number to connect to
+ * @param type Socket type to use (SOCK_STREAM|SOCK_DGRAM)
+ * @param timeout If not connected within timeout seconds abort and return -1
+ * @return The socket or -1 if an error occured.
+ */
+int create_socket(const char *hostname, int port, int type, int timeout) {
+
+  int s;
+  struct sockaddr_in sin;
+  struct sockaddr_in *sa;
+  struct addrinfo hints;
+  struct addrinfo *result;
+  
+  ASSERT(hostname);
+
+  memset(&hints, 0, sizeof(struct addrinfo));
+  hints.ai_family = AF_INET;
+  if(getaddrinfo(hostname, NULL, &hints, &result) != 0) {
+    return -1;
+  }
+
+  if((s= socket(AF_INET, type, 0)) < 0) {
+    freeaddrinfo(result);
+    return -1;
+  }
+
+  sa = (struct sockaddr_in *)result->ai_addr;
+  memcpy(&sin, sa, result->ai_addrlen);
+  sin.sin_family= AF_INET;
+  sin.sin_port= htons(port);
+  freeaddrinfo(result);
+  
+  if(! set_noblock(s)) {
+    goto error;
+  }
+ 
+  if(fcntl(s, F_SETFD, FD_CLOEXEC) == -1)
+    goto error; 
+  
+  if(do_connect(s, (struct sockaddr *)&sin, sizeof(sin), timeout) < 0) {
+    goto error;
+  }
+
+  return s;
+
+  error:
+  close_socket(s);
+  return -1;
+ 
+}
+
+
+/**
+ * Open a socket using the given Port_T structure. The protocol,
+ * destination and type are selected appropriately.
+ * @param p connection description
+ * @return The socket or -1 if an error occured.
+ */
+int create_generic_socket(Port_T p) {
+
+  int socket_fd= -1;
+
+  ASSERT(p);
+
+  switch(p->family) {
+  case AF_UNIX:
+      socket_fd= create_unix_socket(p->pathname, p->timeout);
+      break;
+  case AF_INET:
+      socket_fd= create_socket(p->hostname, p->port, p->type, p->timeout);
+      break;
+  default:
+      socket_fd= -1;
+  }
+  
+  return socket_fd;
+  
+}
+
+
+/**
+ * Create a non-blocking UNIX socket.
+ * @param pathname The pathname to use for the unix socket
+ * @param timeout If not connected within timeout seconds abort and return -1
+ * @return The socket or -1 if an error occured.
+ */
+int create_unix_socket(const char *pathname, int timeout) {
+
+  int s;
+  struct sockaddr_un unixsocket;
+  
+  ASSERT(pathname);
+
+  if((s= socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
+    LogError("%s: Cannot create socket -- %s\n", prog, STRERROR);
+    return -1;
+  }
+
+  unixsocket.sun_family= AF_UNIX;
+  snprintf(unixsocket.sun_path, sizeof(unixsocket.sun_path), "%s", pathname);
+  
+  if(! set_noblock(s)) {
+    goto error;
+  }
+  
+  if(do_connect(s, (struct sockaddr *)&unixsocket, sizeof(unixsocket), timeout) < 0) {
+    goto error;
+  }
+  
+  return s;
+  
+  error:
+  close_socket(s);
+  return -1;
+
+}
+
+
+/**
+ * Create a non-blocking server socket and bind it to the specified local
+ * port number, with the specified backlog. Set a socket option to
+ * make the port reusable again. If a bind address is given the socket
+ * will only accept connect requests to this addresses. If the bind
+ * address is NULL it will accept connections on any/all local
+ * addresses
+ * @param port The localhost port number to open
+ * @param backlog The maximum queue length for incomming connections
+ * @param bindAddr the local address the server will bind to
+ * @return The socket ready for accept, or -1 if an error occured.
+ */
+int create_server_socket(int port, int backlog, const char *bindAddr) {
+  int s, status, flag = 1;
+  struct sockaddr_in myaddr;
+
+  if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+    LogError("%s: Cannot create socket -- %s\n", prog, STRERROR);
+    return -1;
+  }
+
+  memset(&myaddr, 0, sizeof(struct sockaddr_in));
+  
+  if(bindAddr) {
+    struct sockaddr_in *sa;
+    struct addrinfo hints;
+    struct addrinfo *result;    
+
+    memset(&hints, 0, sizeof(struct addrinfo));
+    hints.ai_family = AF_INET;
+    if((status = getaddrinfo(bindAddr, NULL, &hints, &result)) != 0) {
+      LogError("%s: Cannot translate '%s' to IP address -- %s\n", prog, bindAddr, status == EAI_SYSTEM ? STRERROR : gai_strerror(status));
+      goto error;
+    }
+    sa = (struct sockaddr_in *)result->ai_addr;
+    memcpy(&myaddr, sa, result->ai_addrlen);
+    freeaddrinfo(result);
+  } else {
+    myaddr.sin_addr.s_addr= htonl(INADDR_ANY);
+  }
+  myaddr.sin_family= AF_INET;
+  myaddr.sin_port= htons(port);
+
+  if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(flag)) < 0)  {
+    LogError("%s: Cannot set reuseaddr option -- %s\n", prog, STRERROR);
+    goto error;
+  }
+  
+  if(! set_noblock(s))
+    goto error;
+  
+  if(fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+    LogError("%s: Cannot set close on exec option -- %s\n", prog, STRERROR);
+    goto error; 
+  }
+  
+  if(bind(s, (struct sockaddr *)&myaddr, sizeof(struct sockaddr_in)) < 0) {
+    LogError("%s: Cannot bind -- %s\n", prog, STRERROR);
+    goto error;
+  }
+  
+  if(listen(s, backlog) < 0) {
+    LogError("%s: Cannot listen -- %s\n", prog, STRERROR);
+    goto error;
+  }
+  
+  return s;
+
+  error:
+  if (close(s) < 0)
+    LogError("%s: Socket %d close failed -- %s\n", prog, s, STRERROR);
+
+  return -1;
+
+}
+
+
+/**
+ * Shutdown a socket and close the descriptor.
+ * @param socket The socket to shutdown and close
+ * @return TRUE if the close succeed otherwise FALSE
+ */
+int close_socket(int socket) {
+  int r;
+
+  shutdown(socket, 2);
+  
+  /* Try to close even if shutdown failed so we won't leak file descriptors */
+  do {
+    r = close(socket);
+  } while(r == -1 && errno == EINTR);
+  if (r == -1)
+    LogError("%s: Socket %d close failed -- %s\n", prog, socket, STRERROR);
+  
+  return r;
+}
+
+
+/**
+ * Enable nonblocking i|o on the given socket.
+ * @param socket A socket
+ * @return TRUE if success, otherwise FALSE
+ */
+int set_noblock(int socket) {
+  int flags = fcntl(socket, F_GETFL, 0);
+
+  if (fcntl(socket, F_SETFL, flags|O_NONBLOCK) == -1) {
+    LogError("%s: Cannot set nonblocking -- %s\n", prog, STRERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+
+/**
+ * Disable nonblocking i|o on the given socket
+ * @param socket A socket
+ * @return TRUE if success, otherwise FALSE
+ */
+int set_block(int socket) {
+
+  int flags;
+
+  flags= fcntl(socket, F_GETFL, 0);
+  flags &= ~O_NONBLOCK;
+
+  return (fcntl(socket, F_SETFL, flags) == 0);
+
+}
+
+
+/**
+ * Check if data is available, if not, wait timeout seconds for data
+ * to be present.
+ * @param socket A socket
+ * @param timeout How long to wait before timeout (value in seconds)
+ * @return Return TRUE if the event occured, otherwise FALSE.
+ */
+int can_read(int socket, int timeout) {
+        return can_read_ms(socket, timeout * 1000);
+}
+
+
+/**
+ * Check if data can be sent to the socket, if not, wait timeout
+ * seconds for the socket to be ready.
+ * @param socket A socket
+ * @param timeout How long to wait before timeout (value in seconds)
+ * @return Return TRUE if the event occured, otherwise FALSE.
+ */
+int can_write(int socket, int timeout) {
+  int r = 0;
+  struct pollfd fds[1];
+
+  fds[0].fd = socket;
+  fds[0].events = POLLOUT;
+  do {
+    r = poll(fds, 1, timeout * 1000);
+  } while (r == -1 && errno == EINTR);
+  return (r > 0);
+}
+
+
+/**
+ * Write <code>size</code> bytes from the <code>buffer</code> to the
+ * <code>socket</code> 
+ * @param socket the socket to write to
+ * @param buffer The buffer to write
+ * @param size Number of bytes to send
+ * @param timeout Seconds to wait for data to be written
+ * @return The number of bytes sent or -1 if an error occured.
+ */
+ssize_t sock_write(int socket, const void *buffer, size_t size, int timeout) {
+
+  ssize_t n = 0;
+  
+  if(size<=0)
+      return 0;
+  
+  errno= 0;
+  do {
+    n= write(socket, buffer, size);
+  } while(n == -1 && errno == EINTR);
+  
+  if(n == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+    if(! can_write(socket, timeout)) {
+      return -1;
+    }
+    do {
+      n= write(socket, buffer, size);
+    } while(n == -1 && errno == EINTR);
+  }
+  
+  return n;
+
+}
+
+
+/**
+ * Read up to size bytes from the <code>socket</code> into the
+ * <code>buffer</code>. If data is not available wait for
+ * <code>timeout</code> seconds.
+ * @param socket the Socket to read data from
+ * @param buffer The buffer to write the data to
+ * @param size Number of bytes to read from the socket
+ * @param timeout Seconds to wait for data to be available
+ * @return The number of bytes read or -1 if an error occured. 
+ */
+ssize_t sock_read(int socket, void *buffer, int size, int timeout) {
+  
+  ssize_t n;
+
+  if(size<=0)
+      return 0;
+  
+  errno= 0;
+  do {
+    n= read(socket, buffer, size);
+  } while(n == -1 && errno == EINTR);
+  
+  if(n == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+    if(! can_read(socket, timeout)) {
+      return -1;
+    }
+    do {
+      n= read(socket, buffer, size);
+    } while(n == -1 && errno == EINTR);
+  }
+
+  return n;
+
+}
+
+
+/**
+ * Write <code>size</code> bytes from the <code>buffer</code> to the
+ * <code>socket</code>. The given socket <b>must</b> be a connected
+ * UDP socket
+ * @param socket the socket to write to
+ * @param buffer The buffer to write
+ * @param size Number of bytes to send
+ * @param timeout Seconds to wait for data to be written
+ * @return The number of bytes sent or -1 if an error occured.
+ */
+int udp_write(int socket, void *b, size_t len, int timeout) {
+  
+  int i, n;
+  
+  ASSERT(timeout>=0);
+  
+  for(i= 4; i>=1; i--) {
+    
+    do {
+      n = (int)sock_write(socket, b, len, 0);
+    } while(n == -1 && errno == EINTR);
+    
+    if(n == -1 && (errno != EAGAIN || errno != EWOULDBLOCK))
+      return -1;
+    
+    /* Simple retransmit scheme, wait for the server to reply 
+    back to our socket. This assume a request-response pattern, 
+    which really is the only pattern we can support */
+    if(can_read(socket, (int)(timeout/i))) return n;
+    DEBUG("udp_write: Resending request\n");
+    
+  }
+  
+  errno= EHOSTUNREACH;
+  
+  return -1;
+  
+}
+
+
+/**
+ * Create a ICMP socket against hostname, send echo and wait for response.
+ * The 'count' echo requests  is send and we expect at least one reply.
+ * @param hostname The host to open a socket at
+ * @param timeout If response will not come within timeout seconds abort
+ * @param count How many pings to send
+ * @return response time on succes, -1 on error, -2 when monit has no
+ * permissions for raw socket (normally requires root or net_icmpaccess
+ * privilege on Solaris)
+ */
+double icmp_echo(const char *hostname, int timeout, int count) {
+  struct sockaddr_in sout;
+  struct sockaddr_in *sa;
+  struct addrinfo hints;
+  struct addrinfo *result;
+  struct ip *iphdrin;
+  int len_out = offsetof(struct icmp, icmp_data) + DATALEN;
+  int len_in = sizeof(struct ip) + sizeof(struct icmp);
+  struct icmp *icmpin = NULL;
+  struct icmp *icmpout = NULL;
+  uint16_t id_in, id_out, seq_in;
+  int r, i, s, n = 0, status, read_timeout;
+  struct timeval t_in, t_out;
+  char buf[STRLEN];
+  double response = -1.;
+#if ! defined NETBSD && ! defined AIX
+  int sol_ip;
+  unsigned ttl = 255;
+#endif
+  
+  ASSERT(hostname);   
+  ASSERT(len_out < sizeof(buf));
+
+  memset(&hints, 0, sizeof(struct addrinfo));
+  hints.ai_family = AF_INET;
+  if ((status = getaddrinfo(hostname, NULL, &hints, &result)) != 0) {
+    LogError("ICMP echo for %s -- getaddrinfo failed: %s\n", hostname, status == EAI_SYSTEM ? STRERROR : gai_strerror(status));
+    return response;
+  }
+
+  if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
+    if (errno == EACCES || errno == EPERM) {
+      DEBUG("ICMP echo for %s -- cannot create socket: %s\n", hostname, STRERROR);
+      response = -2.;
+    } else {
+      LogError("ICMP echo for %s -- canot create socket: %s\n", hostname, STRERROR);
+    }
+    goto error2;
+  }
+
+#if ! defined NETBSD && ! defined AIX
+#ifdef HAVE_SOL_IP
+  sol_ip = SOL_IP;
+#else
+  {
+    struct protoent *pent;
+    pent = getprotobyname("ip");
+    sol_ip = pent ? pent->p_proto : 0;
+  }
+#endif
+  if (setsockopt(s, sol_ip, IP_TTL, (char *)&ttl, sizeof(ttl)) < 0) {
+    LogError("ICMP echo for %s -- setsockopt failed: %s\n", hostname, STRERROR);
+    goto error1;
+  }
+#endif
+
+  id_out = getpid() & 0xFFFF;
+  icmpout = (struct icmp *)buf;
+  for (i = 0; i < count; i++) {
+    unsigned char *data = (unsigned char *)icmpout->icmp_data;
+
+    icmpout->icmp_code  = 0;
+    icmpout->icmp_type  = ICMP_ECHO;
+    icmpout->icmp_id    = htons(id_out);
+    icmpout->icmp_seq   = htons(i);
+    icmpout->icmp_cksum = 0;
+
+    /* Add originate timestamp to data section */
+    gettimeofday(&t_out, NULL);
+    memcpy(data, &t_out, sizeof(struct timeval));
+    data += sizeof(struct timeval);
+
+    /* Initialize rest of data section to numeric sequence */
+    for (int j = 0; j < DATALEN - sizeof(struct timeval); j++)
+      data[j] = j;
+
+    icmpout->icmp_cksum = checksum_ip((unsigned char *)icmpout, len_out);
+
+    sa = (struct sockaddr_in *)result->ai_addr;
+    memcpy(&sout, sa, result->ai_addrlen);
+    sout.sin_family = AF_INET;
+    sout.sin_port   = 0;
+
+    do {
+      n = (int)sendto(s, (char *)icmpout, len_out, 0, (struct sockaddr *)&sout, sizeof(struct sockaddr));
+    } while(n == -1 && errno == EINTR);
+    if (n < 0) {
+      LogError("ICMP echo request for %s %d/%d failed -- %s\n", hostname, i + 1, count, STRERROR);
+      continue;
+    }
+    read_timeout = timeout * 1000;
+readnext:
+    if (can_read_ms(s, read_timeout)) {
+      socklen_t size = sizeof(struct sockaddr_in);
+      do {
+        n = (int)recvfrom(s, buf, STRLEN, 0, (struct sockaddr *)&sout, &size);
+      } while(n == -1 && errno == EINTR);
+      if (n < 0) {
+        LogError("ICMP echo response for %s %d/%d failed -- %s\n", hostname, i + 1, count, STRERROR);
+        continue;
+      } else if (n < len_in) {
+        LogError("ICMP echo response for %s %d/%d failed -- received %d bytes, expected at least %d bytes\n", hostname, i + 1, count, n, len_in);
+        continue;
+      }
+
+      iphdrin = (struct ip *)buf;
+      icmpin  = (struct icmp *)(buf + iphdrin->ip_hl * 4);
+      id_in   = ntohs(icmpin->icmp_id);
+      seq_in  = ntohs(icmpin->icmp_seq);
+      gettimeofday(&t_in, NULL);
+
+      /* The read from connection-less raw socket via recvfrom() provides messages regardless of origin, the source IP address is set in sout, we have to check the IP and skip responses belonging to other ICMP conversations */
+      if (sout.sin_addr.s_addr != sa->sin_addr.s_addr || icmpin->icmp_type != ICMP_ECHOREPLY || id_in != id_out || seq_in >= (uint16_t)count) {
+        if ((read_timeout = timeout * 1000. - ((t_in.tv_sec - t_out.tv_sec) * 1000. + (t_in.tv_usec - t_out.tv_usec) / 1000.)) > 0)
+          goto readnext; // Try to read next packet, but don't exceed the timeout while waiting for our response so we won't loop forever if the socket is flooded with other ICMP packets
+      } else {
+        memcpy(&t_out, icmpin->icmp_data, sizeof(struct timeval));
+        response = (double)(t_in.tv_sec - t_out.tv_sec) + (double)(t_in.tv_usec - t_out.tv_usec) / 1000000;
+        DEBUG("ICMP echo response for %s %d/%d succeeded -- received id=%d sequence=%d response_time=%fs\n", hostname, i + 1, count, id_in, seq_in, response);
+        break; // Wait for one response only
+      }
+    } else
+      LogError("ICMP echo response for %s %d/%d timed out -- no response within %d seconds\n", hostname, i + 1, count, timeout);
+  }
+
+error1:
+  do {
+    r = close(s);
+  } while(r == -1 && errno == EINTR);
+  if (r == -1)
+    LogError("%s: Socket %d close failed -- %s\n", prog, s, STRERROR);
+
+error2:
+  freeaddrinfo(result);
+
+  return response;
+}
+
+
diff --git a/monit-5.4/src/net.h b/monit-5.4/src/net.h
new file mode 100644
index 0000000..c2da167
--- /dev/null
+++ b/monit-5.4/src/net.h
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef NET_H
+#define NET_H
+
+#include "config.h"
+#include "monit.h"
+
+
+/**
+ *  General purpose Network and Socket methods.
+ *
+ *  @file
+ */
+
+
+/**
+ * Standard seconds to wait for a socket connection or for socket read
+ * i/o before aborting
+ */
+#define NET_TIMEOUT 5
+
+
+/**
+ * Check if the hostname resolves
+ * @param hostname The host to check
+ * @return TRUE if hostname resolves, otherwise FALSE
+ */
+int check_host(const char *hostname);
+
+
+/**
+ * Verify that the socket is ready for i|o
+ * @param socket A socket
+ * @return TRUE if the socket is ready, otherwise FALSE.
+ */
+int check_socket(int socket);
+
+
+/**
+ * Verify that the udp server is up. The given socket must be a 
+ * connected udp socket if we should be able to test the udp server. 
+ * The test is conducted by sending a datagram to the server and
+ * check for a returned ICMP error when reading from the socket.
+ * @param socket A socket
+ * @return TRUE if the socket is ready, otherwise FALSE.
+ */
+int check_udp_socket(int socket);
+
+
+/**
+ * Create a non-blocking socket against hostname:port with the given
+ * protocol. The protocol should be either SOCK_STREAM or SOCK_DGRAM.
+ * @param hostname The host to open a socket at
+ * @param port The port number to connect to
+ * @param protocol Socket protocol to use (SOCK_STREAM|SOCK_DGRAM)
+ * @param timeout If not connected within timeout seconds abort and return -1
+ * @return The socket or -1 if an error occured.
+ */
+int create_socket(const char *hostname, int port, int protocol, int timeout);
+
+
+/**
+ * Open a socket using the given Port_T structure. The protocol,
+ * destination and type are selected appropriately.
+ * @param p connection description
+ * @return The socket or -1 if an error occured.
+ */
+int create_generic_socket(Port_T p);
+
+
+/**
+ * Create a non-blocking UNIX socket.
+ * @param pathname The pathname to use for the unix socket
+ * @param timeout If not connected within timeout seconds abort and return -1
+ * @return The socket or -1 if an error occured.
+ */
+int create_unix_socket(const char *pathname, int timeout);
+
+
+/**
+ * Create a blocking server socket and bind it to the specified local
+ * port number, with the specified backlog. Set a socket option to
+ * make the port reusable again. If a bind address is given the socket
+ * will only accept connect requests to this addresses. If the bind
+ * address is NULL it will accept connections on any/all local
+ * addresses
+ * @param port The localhost port number to open
+ * @param backlog The maximum queue length for incomming connections
+ * @param bindAddr the local address the server will bind to
+ * @return The socket ready for accept, or -1 if an error occured.
+ */
+int create_server_socket(int port, int backlog, const char *bindAddr);
+
+
+/**
+ * Shutdown a socket and close the descriptor.
+ * @param socket The socket to shutdown and close
+ * @return TRUE if the close succeed otherwise FALSE
+ */
+int close_socket(int socket);
+
+
+/**
+ * Enable nonblocking i|o on the given socket.
+ * @param socket A socket
+ * @return TRUE if success, otherwise FALSE
+ */
+int set_noblock(int socket);
+
+
+/**
+ * Disable nonblocking i|o on the given socket
+ * @param socket A socket
+ * @return TRUE if success, otherwise FALSE
+ */
+int set_block(int socket);
+
+
+/**
+ * Check if data is available, if not, wait timeout seconds for data
+ * to be present.
+ * @param socket A socket
+ * @param timeout How long to wait before timeout (value in seconds)
+ * @return Return TRUE if the event occured, otherwise FALSE.
+ */
+int can_read(int socket, int timeout);
+
+
+/**
+ * Check if data can be sent to the socket, if not, wait timeout
+ * seconds for the socket to be ready.
+ * @param socket A socket
+ * @param timeout How long to wait before timeout (value in seconds)
+ * @return Return TRUE if the event occured, otherwise FALSE.
+ */
+int can_write(int socket, int timeout);
+
+
+/**
+ * Write <code>size</code> bytes from the <code>buffer</code> to the
+ * <code>socket</code> 
+ * @param socket the socket to write to
+ * @param buffer The buffer to write
+ * @param size Number of bytes to send
+ * @param timeout Seconds to wait for data to be written
+ * @return The number of bytes sent or -1 if an error occured.
+ */
+ssize_t sock_write(int socket, const void *buffer, size_t size, int timeout);
+  
+
+/**
+ * Read up to size bytes from the <code>socket</code> into the
+ * <code>buffer</code>. If data is not available wait for
+ * <code>timeout</code> seconds.
+ * @param socket the Socket to read data from
+ * @param buffer The buffer to write the data to
+ * @param size Number of bytes to read from the socket
+ * @param timeout Seconds to wait for data to be available
+ * @return The number of bytes read or -1 if an error occured. 
+*/
+ssize_t sock_read(int socket, void *buffer, int size, int timeout);
+
+
+/**
+ * Write <code>size</code> bytes from the <code>buffer</code> to the
+ * <code>socket</code>. The given socket <b>must</b> be a connected
+ * UDP socket
+ * @param socket the socket to write to
+ * @param buffer The buffer to write
+ * @param size Number of bytes to send
+ * @param timeout Seconds to wait for data to be written
+ * @return The number of bytes sent or -1 if an error occured.
+ */
+int udp_write(int socket, void *b, size_t len, int timeout);
+
+
+/**
+ * Create a ICMP socket against hostname, send echo and wait for response.
+ * The 'count' echo requests  is send and we expect at least one reply.
+ * @param hostname The host to open a socket at
+ * @param timeout If response will not come within timeout seconds abort
+ * @param count How many pings to send
+ * @return response time on succes, -1 on error
+ */
+double icmp_echo(const char *hostname, int timeout, int count);
+
+#endif
diff --git a/monit-5.4/src/p.y b/monit-5.4/src/p.y
new file mode 100644
index 0000000..6e5324a
--- /dev/null
+++ b/monit-5.4/src/p.y
@@ -0,0 +1,3587 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+%{
+  
+/*
+ * DESCRIPTION
+ *   Simple context-free grammar for parsing the control file. 
+ *
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif 
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif 
+
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif 
+  
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+  
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+  
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+  
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_ASM_PARAM_H
+#include <asm/param.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifndef HAVE_SOL_IP
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#endif
+
+#ifdef HAVE_NETINET_IP_ICMP_H
+#include <netinet/ip_icmp.h>
+#endif
+
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+  
+#include "net.h"
+#include "monit.h"
+#include "protocol.h"
+#include "engine.h"
+#include "alert.h"
+#include "process.h"
+#include "ssl.h"
+#include "device.h"
+
+// libmonit
+#include "io/File.h"
+
+
+/* ------------------------------------------------------------- Definitions */
+
+  struct IHavePrecedence {
+    int daemon;
+    int logfile;
+    int pidfile;
+  }; 
+
+  struct myrate {
+    unsigned count;
+    unsigned cycles;
+  }; 
+
+  /* yacc interface */
+  void  yyerror(const char *,...);
+  void  yyerror2(const char *,...);
+  void  yywarning(const char *,...);
+  void  yywarning2(const char *,...);
+
+  /* lexer interface */
+  int yylex(void);
+  extern FILE *yyin;
+  extern int lineno;
+  extern int arglineno;
+  extern char *yytext;
+  extern char *argyytext;
+  extern char *currentfile;
+  extern char *argcurrentfile;
+  extern int buffer_stack_ptr;
+
+  /* Local variables */
+  static int cfg_errflag = FALSE;
+  static Service_T tail = NULL;
+  static Service_T current = NULL;
+  static Request_T urlrequest = NULL;
+  static command_t command = NULL;
+  static command_t command1 = NULL;
+  static command_t command2 = NULL;
+  static Service_T depend_list = NULL;
+  static struct mygid gidset;
+  static struct myuid uidset;
+  static struct myprogram programset;
+  static struct myperm permset;
+  static struct mysize sizeset;
+  static struct myuptime uptimeset;
+  static struct mymatch matchset;
+  static struct myicmp icmpset;
+  static struct mymail mailset;
+  static struct myport portset;
+  static struct mymailserver mailserverset;
+  static struct myfilesystem filesystemset;
+  static struct myresource resourceset;
+  static struct mychecksum checksumset;
+  static struct mytimestamp timestampset;
+  static struct myactionrate actionrateset;
+  static struct IHavePrecedence ihp = {FALSE, FALSE, FALSE};
+  static struct myrate rate1 = {1, 1};
+  static struct myrate rate2 = {1, 1};
+  static char * htpasswd_file = NULL;
+  static int    digesttype = DIGEST_CLEARTEXT;
+  static int    hassystem = FALSE;
+
+#define BITMAP_MAX (sizeof(long long) * 8)
+
+  
+/* -------------------------------------------------------------- Prototypes */
+
+  static void  preparse();
+  static void  postparse();
+  static void  addservice(Service_T);
+  static void  addmail(char *, Mail_T, Mail_T *);
+  static void  createservice(int, char *, char *, int (*)(Service_T));
+  static void  adddependant(char *);
+  static void  addservicegroup(char *);
+  static void  addport(Port_T);
+  static void  addresource(Resource_T);
+  static void  addtimestamp(Timestamp_T, int);
+  static void  addactionrate(ActionRate_T);
+  static void  addsize(Size_T);
+  static void  adduptime(Uptime_T);
+  static void  addfilesystem(Filesystem_T);
+  static void  addicmp(Icmp_T);
+  static void  addgeneric(Port_T, char*, char*);
+  static void  addcommand(int, unsigned);
+  static void  addargument(char *);
+  static void  addmmonit(URL_T, int, int, char *);
+  static void  addmailserver(MailServer_T);
+  static int   addcredentials(char *, char *, int, int);
+#ifdef HAVE_LIBPAM
+  static void  addpamauth(char *, int);
+#endif
+  static void  addhtpasswdentry(char *, char *, int);
+  static uid_t get_uid(char *, uid_t);
+  static gid_t get_gid(char *, gid_t);
+  static void  addchecksum(Checksum_T);
+  static void  addperm(Perm_T);
+  static void  addmatch(Match_T, int, int);
+  static void  addmatchpath(Match_T, int);
+  static void  addprogram(Program_T);
+  static void  adduid(Uid_T);
+  static void  addgid(Gid_T);
+  static void  addeuid(uid_t);
+  static void  addegid(gid_t);
+  static void  addeventaction(EventAction_T *, int, int);
+  static void  seteventaction(EventAction_T *, int, int);
+  static void  prepare_urlrequest(URL_T U);
+  static void  seturlrequest(int, char *);
+  static void  setlogfile(char *);
+  static void  setpidfile(char *);
+  static void  reset_mailset();
+  static void  reset_mailserverset();
+  static void  reset_portset();
+  static void  reset_resourceset();
+  static void  reset_timestampset();
+  static void  reset_actionrateset();
+  static void  reset_sizeset();
+  static void  reset_uptimeset();
+  static void  reset_checksumset();
+  static void  reset_permset();
+  static void  reset_uidset();
+  static void  reset_programset();
+  static void  reset_gidset();
+  static void  reset_filesystemset();
+  static void  reset_icmpset();
+  static void  reset_rateset();
+  static void  check_name(char *);
+  static int   check_perm(int);
+  static void  check_hostname (char *);
+  static void  check_exec(char *);
+  static int   cleanup_hash_string(char *);
+  static void  check_depend();
+  static void  setsyslog(char *);
+  static command_t copycommand(command_t);
+  static int verifyMaxForward(int);  
+
+%}
+
+%union {
+  URL_T url;
+  float real;
+  int   number;
+  char *string;
+}
+
+%token IF ELSE THEN OR FAILED
+%token SET LOGFILE FACILITY DAEMON SYSLOG MAILSERVER HTTPD ALLOW ADDRESS INIT
+%token READONLY CLEARTEXT MD5HASH SHA1HASH CRYPT DELAY
+%token PEMFILE ENABLE DISABLE HTTPDSSL CLIENTPEMFILE ALLOWSELFCERTIFICATION
+%token IDFILE STATEFILE SEND EXPECT EXPECTBUFFER CYCLE COUNT REMINDER
+%token PIDFILE START STOP PATHTOK
+%token HOST HOSTNAME PORT TYPE UDP TCP TCPSSL PROTOCOL CONNECTION
+%token ALERT NOALERT MAILFORMAT UNIXSOCKET SIGNATURE
+%token TIMEOUT RETRY RESTART CHECKSUM EVERY NOTEVERY
+%token DEFAULT HTTP APACHESTATUS FTP SMTP POP IMAP CLAMAV NNTP NTP3 MYSQL DNS
+%token SSH DWP LDAP2 LDAP3 RDATE RSYNC TNS PGSQL POSTFIXPOLICY SIP LMTP GPS RADIUS MEMCACHE
+%token <string> STRING PATH MAILADDR MAILFROM MAILREPLYTO MAILSUBJECT
+%token <string> MAILBODY SERVICENAME STRINGNAME
+%token <number> NUMBER PERCENT LOGLIMIT CLOSELIMIT DNSLIMIT KEEPALIVELIMIT 
+%token <number> REPLYLIMIT REQUESTLIMIT STARTLIMIT WAITLIMIT GRACEFULLIMIT 
+%token <number> CLEANUPLIMIT 
+%token <real> REAL
+%token CHECKPROC CHECKFILESYS CHECKFILE CHECKDIR CHECKHOST CHECKSYSTEM CHECKFIFO CHECKPROGRAM
+%token CHILDREN SYSTEM STATUS
+%token RESOURCE MEMORY TOTALMEMORY LOADAVG1 LOADAVG5 LOADAVG15 SWAP
+%token MODE ACTIVE PASSIVE MANUAL CPU TOTALCPU CPUUSER CPUSYSTEM CPUWAIT
+%token GROUP REQUEST DEPENDS BASEDIR SLOT EVENTQUEUE SECRET HOSTHEADER
+%token UID GID MMONIT INSTANCE USERNAME PASSWORD
+%token TIMESTAMP CHANGED SECOND MINUTE HOUR DAY
+%token SSLAUTO SSLV2 SSLV3 TLSV1 CERTMD5
+%token BYTE KILOBYTE MEGABYTE GIGABYTE
+%token INODE SPACE PERMISSION SIZE MATCH NOT IGNORE ACTION UPTIME
+%token EXEC UNMONITOR ICMP ICMPECHO NONEXIST EXIST INVALID DATA RECOVERED PASSED SUCCEEDED
+%token URL CONTENT PID PPID FSFLAG
+%token REGISTER CREDENTIALS 
+%token <url> URLOBJECT
+%token <string> TARGET TIMESPEC
+%token <number> MAXFORWARD
+%token FIPS
+
+%left GREATER LESS EQUAL NOTEQUAL
+
+
+%%
+cfgfile         : /* EMPTY */
+                | statement_list
+                ;
+
+statement_list  : statement
+                | statement_list statement
+                ;
+
+statement       : setalert
+                | setdaemon
+                | setlog
+                | seteventqueue
+                | setmmonits
+                | setmailservers
+                | setmailformat
+                | sethttpd
+                | setpid
+                | setidfile
+                | setstatefile
+                | setexpectbuffer
+                | setinit
+                | setfips
+                | checkproc optproclist
+                | checkfile optfilelist
+                | checkfilesys optfilesyslist
+                | checkdir optdirlist
+                | checkhost opthostlist
+                | checksystem optsystemlist
+                | checkfifo optfifolist
+                | checkprogram optstatuslist
+                ;
+
+optproclist     : /* EMPTY */
+                | optproclist optproc
+                ;
+
+optproc         : start
+                | stop
+                | restart
+                | exist
+                | pid
+                | ppid
+                | uptime
+                | connection
+                | connectionunix
+                | actionrate
+                | alert
+                | every
+                | mode
+                | group
+                | depend
+                | resourceprocess
+                ;
+
+optfilelist      : /* EMPTY */
+                | optfilelist optfile
+                ;
+
+optfile         : start
+                | stop
+                | restart
+                | exist
+                | timestamp
+                | actionrate
+                | every
+                | alert
+                | permission
+                | uid
+                | gid
+                | checksum
+                | size
+                | match
+                | mode
+                | group
+                | depend
+                ;
+
+optfilesyslist  : /* EMPTY */
+                | optfilesyslist optfilesys
+                ;
+
+optfilesys      : start
+                | stop
+                | restart
+                | exist
+                | actionrate
+                | every
+                | alert
+                | permission
+                | uid
+                | gid
+                | mode
+                | group
+                | depend
+                | inode
+                | space
+                | fsflag
+                ;
+
+optdirlist      : /* EMPTY */
+                | optdirlist optdir
+                ;
+
+optdir          : start
+                | stop
+                | restart
+                | exist
+                | timestamp
+                | actionrate
+                | every
+                | alert
+                | permission
+                | uid
+                | gid
+                | mode
+                | group
+                | depend
+                ;
+
+opthostlist     : opthost
+                | opthostlist opthost
+                ;
+
+opthost         : start
+                | stop
+                | restart
+                | exist
+                | connection
+                | icmp
+                | actionrate
+                | alert
+                | every
+                | mode
+                | group
+                | depend
+                ;
+
+optsystemlist   : /* EMPTY */
+                | optsystemlist optsystem
+                ;
+
+optsystem       : start
+                | stop
+                | restart
+                | actionrate
+                | alert
+                | every
+                | group
+                | depend
+                | resourcesystem
+                ;
+
+optfifolist     : /* EMPTY */
+                | optfifolist optfifo
+                ;
+
+optfifo         : start
+                | stop
+                | restart
+                | exist
+                | timestamp
+                | actionrate
+                | every
+                | alert
+                | permission
+                | uid
+                | gid
+                | mode
+                | group
+                | depend
+                ;
+
+optstatuslist   : /* EMPTY */
+                | optstatuslist optstatus
+                ;
+               
+optstatus       : start
+                | stop
+                | restart
+                | actionrate
+                | exist
+                | alert
+                | every
+                | group
+                | depend
+                | exitvalue
+                ; 
+
+setalert        : SET alertmail formatlist reminder {
+                   mailset.events = Event_All;
+                    addmail($<string>2, &mailset, &Run.maillist);
+                  }
+                | SET alertmail '{' eventoptionlist '}' formatlist reminder {
+                    addmail($<string>2, &mailset, &Run.maillist);
+                  }
+                | SET alertmail NOT '{' eventoptionlist '}' formatlist reminder {
+                   mailset.events = ~mailset.events;
+                   addmail($<string>2, &mailset, &Run.maillist);
+                  }
+                ;
+
+setdaemon       : SET DAEMON NUMBER startdelay {
+                    if (!Run.isdaemon || ihp.daemon) {
+                      ihp.daemon     = TRUE;
+                      Run.isdaemon   = TRUE;
+                      Run.polltime   = $3;
+                      Run.startdelay = $<number>4;
+                    }
+                  }
+                ;
+
+startdelay      : /* EMPTY */        { $<number>$ = START_DELAY; }
+                | START DELAY NUMBER { $<number>$ = $3; }
+                ;
+
+setexpectbuffer : SET EXPECTBUFFER NUMBER unit {
+                    Run.expectbuffer = $3 * $<number>4;
+                  }
+                ;
+
+setinit         : SET INIT {
+                    Run.init = TRUE;
+                  }
+                ;
+
+setfips         : SET FIPS {
+                  #ifdef OPENSSL_FIPS
+                    Run.fipsEnabled = TRUE;
+                  #endif
+                  }
+                ;
+
+setlog          : SET LOGFILE PATH   {
+                   if (!Run.logfile || ihp.logfile) {
+                     ihp.logfile = TRUE;
+                     setlogfile($3);
+                     Run.use_syslog = FALSE;
+                     Run.dolog =TRUE;
+                   }
+                  }
+                | SET LOGFILE SYSLOG {
+                    setsyslog(NULL);
+                  }
+                | SET LOGFILE SYSLOG FACILITY STRING {
+                    setsyslog($5); FREE($5);
+                  }
+                ;
+
+seteventqueue   : SET EVENTQUEUE BASEDIR PATH {
+                    Run.eventlist_dir = $4;
+                  }
+                | SET EVENTQUEUE BASEDIR PATH SLOT NUMBER {
+                    Run.eventlist_dir = $4;
+                    Run.eventlist_slots = $6;
+                  }
+                | SET EVENTQUEUE SLOT NUMBER {
+                    Run.eventlist_dir = Str_dup(MYEVENTLISTBASE);
+                    Run.eventlist_slots = $4;
+                  }
+                ;
+
+setidfile       : SET IDFILE PATH {
+                    Run.idfile = $3;
+                  }
+                ;
+
+setstatefile    : SET STATEFILE PATH {
+                    Run.statefile = $3;
+                  }
+                ;
+
+setpid          : SET PIDFILE PATH {
+                   if (!Run.pidfile || ihp.pidfile) {
+                     ihp.pidfile = TRUE;
+                     setpidfile($3);
+                   }
+                 }
+                ;
+
+setmmonits      : SET MMONIT mmonitlist
+                ;
+
+mmonitlist      : mmonit credentials
+                | mmonitlist mmonit credentials
+                ;
+
+mmonit          : URLOBJECT nettimeout sslversion certmd5 {
+                    check_hostname(($<url>1)->hostname);
+                    addmmonit($<url>1, $<number>2, $<number>3, $<string>4); 
+                  }
+                ;
+
+credentials     : /* EMPTY */
+                | REGISTER CREDENTIALS {
+                    Run.dommonitcredentials = FALSE;
+                  }
+                ;
+
+setmailservers  : SET MAILSERVER mailserverlist nettimeout hostname {
+                   Run.mailserver_timeout = $<number>4;
+                   Run.mail_hostname = $<string>5;
+                  }
+                ;
+
+setmailformat   : SET MAILFORMAT '{' formatoptionlist '}' {
+                   Run.MailFormat.from    = mailset.from    ?  mailset.from    : Str_dup(ALERT_FROM);
+                   Run.MailFormat.replyto = mailset.replyto ?  mailset.replyto : NULL;
+                   Run.MailFormat.subject = mailset.subject ?  mailset.subject : Str_dup(ALERT_SUBJECT);
+                   Run.MailFormat.message = mailset.message ?  mailset.message : Str_dup(ALERT_MESSAGE);
+                   reset_mailset();
+                 }
+                ;
+
+sethttpd        : SET HTTPD PORT NUMBER httpdlist {
+                   Run.dohttpd = TRUE;
+                   Run.httpdport = $4;
+                 }
+                ;
+
+mailserverlist  : mailserver
+                | mailserverlist mailserver
+                ;
+
+mailserver      : STRING username password sslversion certmd5 {
+                    /* Restore the current text overriden by lookahead */
+                    FREE(argyytext);
+                    argyytext = Str_dup($1);
+
+                    check_hostname($1);
+                    mailserverset.host = $1;
+                    mailserverset.username = $<string>2;
+                    mailserverset.password = $<string>3;
+                    mailserverset.ssl.version = $<number>4;
+                    if (mailserverset.ssl.version != SSL_VERSION_NONE) {
+                      mailserverset.ssl.use_ssl = TRUE;
+                      if (mailserverset.ssl.version == SSL_VERSION_SSLV2 ||
+                         mailserverset.ssl.version == SSL_VERSION_SSLV3)
+                         mailserverset.port = PORT_SMTPS;
+                      mailserverset.ssl.certmd5 = $<string>5;
+                    }
+                    addmailserver(&mailserverset);
+                  }
+                | STRING PORT NUMBER username password sslversion certmd5 {
+                    /* Restore the current text overriden by lookahead */
+                    FREE(argyytext);
+                    argyytext = Str_dup($1);
+
+                    check_hostname($1);
+                    mailserverset.host = $1;
+                    mailserverset.port = $<number>3;
+                    mailserverset.username = $<string>4;
+                    mailserverset.password = $<string>5;
+                    mailserverset.ssl.version = $<number>6;
+                    if (mailserverset.ssl.version != SSL_VERSION_NONE) {
+                      mailserverset.ssl.use_ssl = TRUE;
+                      mailserverset.ssl.certmd5 = $<string>7;
+                    }
+                    addmailserver(&mailserverset);
+                  }
+                ;
+
+httpdlist       : /* EMPTY */
+                | httpdlist httpdoption
+                ; 
+
+httpdoption     : ssl
+                | signature
+                | bindaddress
+                | allow
+                ;
+
+ssl             : ssldisable { Run.httpdssl = FALSE; }
+                | sslenable optssllist {
+                    Run.httpdssl = TRUE;                   
+                    if (! have_ssl())
+                      yyerror("SSL is not supported");
+                    else if (! Run.httpsslpem)
+                      yyerror("SSL server PEM file is required (pemfile option)");
+                    else if (! file_checkStat(Run.httpsslpem, "SSL server PEM file", S_IRWXU))
+                      yyerror("SSL server PEM file permissions check failed");
+                  }
+                ;
+
+optssllist      : /* EMPTY */
+                | optssllist optssl
+                ;
+
+optssl          : pemfile
+                | clientpemfile
+                | allowselfcert
+                ;
+
+sslenable       : HTTPDSSL
+                | HTTPDSSL ENABLE
+                | ENABLE HTTPDSSL
+                ;
+
+ssldisable      : HTTPDSSL DISABLE
+                | DISABLE HTTPDSSL
+                | ssldisable PEMFILE PATH { FREE($3); }
+                | ssldisable CLIENTPEMFILE PATH { FREE($3); }
+                | ssldisable ALLOWSELFCERTIFICATION
+                ;
+
+signature       : sigenable  { Run.httpdsig = TRUE; }
+                | sigdisable { Run.httpdsig = FALSE; }
+                ;
+
+sigenable       : SIGNATURE ENABLE
+                | ENABLE SIGNATURE
+                ;
+
+sigdisable      : SIGNATURE DISABLE
+                | DISABLE SIGNATURE
+                ;
+
+bindaddress     : ADDRESS STRING { Run.bind_addr = $2; }
+                ;
+
+pemfile         : PEMFILE PATH {
+                    Run.httpsslpem = $2;
+                  }
+                ;
+
+clientpemfile   : CLIENTPEMFILE PATH {
+                    Run.httpsslclientpem = $2; 
+                    Run.clientssl = TRUE;
+                    if (!file_checkStat(Run.httpsslclientpem, "SSL client PEM file", S_IRWXU | S_IRGRP | S_IROTH))
+                      yyerror2("SSL client PEM file has too loose permissions");
+                  }
+                ;
+
+allowselfcert   : ALLOWSELFCERTIFICATION {   
+                    Run.allowselfcert = TRUE;
+                  }
+                ;
+
+allow           : ALLOW STRING':'STRING readonly {
+                    addcredentials($2,$4, DIGEST_CLEARTEXT, $<number>5);
+                  }
+                | ALLOW '@'STRING readonly {
+#ifdef HAVE_LIBPAM
+                    addpamauth($3, $<number>4);
+#else
+                    yyerror("PAM is not supported");
+                    FREE($3);
+#endif
+                  }
+                | ALLOW PATH {
+                    addhtpasswdentry($2, NULL, DIGEST_CLEARTEXT);
+                    FREE($2);
+                  }
+                | ALLOW CLEARTEXT PATH {
+                    addhtpasswdentry($3, NULL, DIGEST_CLEARTEXT);
+                    FREE($3);
+                  }
+                | ALLOW MD5HASH PATH {
+                    addhtpasswdentry($3, NULL, DIGEST_MD5);
+                    FREE($3);
+                  }
+                | ALLOW CRYPT PATH {
+                    addhtpasswdentry($3, NULL, DIGEST_CRYPT);
+                    FREE($3);
+                  }
+                | ALLOW PATH {
+                    htpasswd_file = $2;
+                    digesttype = CLEARTEXT;
+                  }
+                  allowuserlist {
+                    FREE(htpasswd_file);
+                  }
+                | ALLOW CLEARTEXT PATH {
+                    htpasswd_file = $3;
+                    digesttype = DIGEST_CLEARTEXT;
+                  }
+                  allowuserlist {
+                    FREE(htpasswd_file);
+                  }
+                | ALLOW MD5HASH PATH {
+                    htpasswd_file = $3;
+                    digesttype = DIGEST_MD5;
+                  }
+                  allowuserlist {
+                    FREE(htpasswd_file);
+                  }
+                | ALLOW CRYPT PATH {
+                    htpasswd_file = $3;
+                    digesttype = DIGEST_CRYPT;
+                  }
+                  allowuserlist {
+                    FREE(htpasswd_file);
+                  }
+                | ALLOW STRING {
+                    if (! (add_net_allow($2) || add_host_allow($2))) {
+                      yyerror2("erroneous network or host identifier %s", $2); 
+                    }
+                    FREE($2);
+                  }
+                ;
+
+allowuserlist   : allowuser
+                | allowuserlist allowuser
+                ;
+
+allowuser       : STRING { addhtpasswdentry(htpasswd_file, $1, digesttype);
+                           FREE($1); }
+                ;
+
+readonly        : /* EMPTY */ { $<number>$ = FALSE; }
+                | READONLY { $<number>$ = TRUE; }
+                ;
+
+checkproc       : CHECKPROC SERVICENAME PIDFILE PATH {
+                    createservice(TYPE_PROCESS, $<string>2, $4, check_process);
+                  }
+                | CHECKPROC SERVICENAME PATHTOK PATH {
+                    createservice(TYPE_PROCESS, $<string>2, $4, check_process);
+                  }
+                | CHECKPROC SERVICENAME MATCH STRING {
+                    createservice(TYPE_PROCESS, $<string>2, $4, check_process);
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = Str_dup($4);
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+                | CHECKPROC SERVICENAME MATCH PATH {
+                    createservice(TYPE_PROCESS, $<string>2, $4, check_process);
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = Str_dup($4);
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+                ;
+
+checkfile       : CHECKFILE SERVICENAME PATHTOK PATH {
+                    createservice(TYPE_FILE, $<string>2, $4, check_file);
+                  }
+                ;
+
+checkfilesys    : CHECKFILESYS SERVICENAME PATHTOK PATH {
+                    createservice(TYPE_FILESYSTEM, $<string>2, $4, check_filesystem);
+                  }
+                ;
+
+checkdir        : CHECKDIR SERVICENAME PATHTOK PATH {
+                    createservice(TYPE_DIRECTORY, $<string>2, $4, check_directory);
+                  }
+                ;
+
+checkhost       : CHECKHOST SERVICENAME ADDRESS STRING {
+                    check_hostname($4); 
+                    createservice(TYPE_HOST, $<string>2, $4, check_remote_host);
+                  }
+                ;
+
+checksystem     : CHECKSYSTEM SERVICENAME {
+                    createservice(TYPE_SYSTEM, $<string>2, Str_dup(""), check_system);
+                    hassystem = TRUE;
+                  }
+                ;
+
+checkfifo       : CHECKFIFO SERVICENAME PATHTOK PATH {
+                    createservice(TYPE_FIFO, $<string>2, $4, check_fifo);
+                  }
+                ;
+
+checkprogram     : CHECKPROGRAM SERVICENAME PATHTOK PATH {
+                        check_exec($4);
+                        createservice(TYPE_PROGRAM, $<string>2, $4, check_program);
+                  }
+                ;
+
+start           : START argumentlist exectimeout {
+                    addcommand(START, $<number>3);
+                  }
+                | START argumentlist useroptionlist exectimeout {
+                    addcommand(START, $<number>4);
+                  }
+                ;
+
+stop            : STOP argumentlist exectimeout {
+                    addcommand(STOP, $<number>3);
+                  }
+                | STOP argumentlist useroptionlist exectimeout {
+                    addcommand(STOP, $<number>4);
+                  }
+                ;
+
+
+restart         : RESTART argumentlist exectimeout {
+                    addcommand(RESTART, $<number>3);
+                  }
+                | RESTART argumentlist useroptionlist exectimeout {
+                    addcommand(RESTART, $<number>4);
+                  }
+                ;
+
+argumentlist    : argument
+                | argumentlist argument
+                ;
+
+useroptionlist  : useroption
+                | useroptionlist useroption
+                ;
+
+argument        : STRING { addargument($1); }
+                | PATH   { addargument($1); }
+                ;
+
+useroption      : UID STRING { addeuid( get_uid($2, 0) ); FREE($2); }
+                | GID STRING { addegid( get_gid($2, 0) ); FREE($2); }
+                | UID NUMBER { addeuid( get_uid(NULL, $2) ); }
+                | GID NUMBER { addegid( get_gid(NULL, $2) ); }
+                ;
+
+username        : /* EMPTY */     { $<string>$ = NULL; }
+                | USERNAME MAILADDR { $<string>$ = $2; }
+                | USERNAME STRING { $<string>$ = $2; }
+                ;
+
+password        : /* EMPTY */     { $<string>$ = NULL; }
+                | PASSWORD STRING { $<string>$ = $2; }
+                ;
+
+hostname        : /* EMPTY */     { $<string>$ = NULL; }
+                | HOSTNAME STRING { $<string>$ = $2; }
+                ;
+
+connection      : IF FAILED host port type protocol nettimeout retry rate1
+                  THEN action1 recovery {
+                    portset.timeout = $<number>7;
+                    portset.retry = $<number>8;
+                    addeventaction(&(portset).action, $<number>11, $<number>12);
+                    addport(&portset);
+                  }
+                | IF FAILED URL URLOBJECT urloption nettimeout retry rate1
+                  THEN action1 recovery { 
+                    prepare_urlrequest($<url>4);
+                    portset.timeout = $<number>6;
+                    portset.retry = $<number>7;
+                    addeventaction(&(portset).action, $<number>10, $<number>11);
+                    addport(&portset);
+                  }
+                ;
+
+connectionunix  : IF FAILED unixsocket type protocol nettimeout retry rate1
+                  THEN action1 recovery {
+                   portset.timeout = $<number>6;
+                   portset.retry = $<number>7;
+                   addeventaction(&(portset).action, $<number>10, $<number>11);
+                   addport(&portset);
+                  }
+                ;
+
+icmp            : IF FAILED ICMP icmptype icmpcount nettimeout rate1
+                  THEN action1 recovery {
+                   icmpset.type = $<number>4;
+                   icmpset.count = $<number>5;
+                   icmpset.timeout = $<number>6;
+                   addeventaction(&(icmpset).action, $<number>9, $<number>10);
+                   addicmp(&icmpset);
+                  }
+                ;
+
+host            : /* EMPTY */ {
+                    if (current->type == TYPE_HOST)
+                      portset.hostname = Str_dup(current->path);
+                    else
+                      portset.hostname = Str_dup(LOCALHOST);
+                  }
+                | HOST STRING { check_hostname($2); portset.hostname = $2; }
+		;
+
+port            : PORT NUMBER { portset.port = $2; portset.family = AF_INET; }
+                ;
+
+unixsocket      : UNIXSOCKET PATH {
+                    portset.pathname = $2; portset.family = AF_UNIX;
+                  }
+                ;
+
+type            : /* EMPTY */ {
+                    portset.type = SOCK_STREAM;
+                  }
+                | TYPE TCP {
+                    portset.type = SOCK_STREAM;
+                  }
+                | TYPE TCPSSL sslversion certmd5  {
+                    portset.type = SOCK_STREAM;
+                    portset.SSL.use_ssl = TRUE;
+                    portset.SSL.version = $<number>3;
+                    if (portset.SSL.version == SSL_VERSION_NONE)
+                      portset.SSL.version = SSL_VERSION_AUTO;
+                    portset.SSL.certmd5 = $<string>4;
+                  }
+                | TYPE UDP {
+                    portset.type = SOCK_DGRAM;
+                  }
+                ;
+
+certmd5         : /* EMPTY */    { $<string>$ = NULL; }
+                | CERTMD5 STRING { $<string>$ = $2; }
+                ;
+
+sslversion      : /* EMPTY */  { $<number>$ = SSL_VERSION_NONE; }
+                | SSLV2        { $<number>$ = SSL_VERSION_SSLV2; }
+                | SSLV3        { $<number>$ = SSL_VERSION_SSLV3; }
+                | TLSV1        { $<number>$ = SSL_VERSION_TLS; }
+                | SSLAUTO      { $<number>$ = SSL_VERSION_AUTO; }
+                ;
+
+protocol        : /* EMPTY */  {
+                    portset.protocol = Protocol_get(Protocol_DEFAULT);
+                  }
+                | PROTOCOL APACHESTATUS apache_stat_list {
+                    portset.protocol = Protocol_get(Protocol_APACHESTATUS);
+                  }
+                | PROTOCOL DEFAULT {
+                    portset.protocol = Protocol_get(Protocol_DEFAULT);
+                  }
+                | PROTOCOL DNS {
+                    portset.protocol = Protocol_get(Protocol_DNS);
+                  }
+                | PROTOCOL DWP  {
+                    portset.protocol = Protocol_get(Protocol_DWP);
+                  }
+                | PROTOCOL FTP {
+                    portset.protocol = Protocol_get(Protocol_FTP);
+                  }
+                | PROTOCOL HTTP request {
+                    portset.protocol = Protocol_get(Protocol_HTTP);
+                  }
+                | PROTOCOL IMAP {
+                    portset.protocol = Protocol_get(Protocol_IMAP);
+                  }
+                | PROTOCOL CLAMAV {
+                    portset.protocol = Protocol_get(Protocol_CLAMAV);
+                  }
+                | PROTOCOL LDAP2 {
+                    portset.protocol = Protocol_get(Protocol_LDAP2);
+                  }
+                | PROTOCOL LDAP3 {
+                    portset.protocol = Protocol_get(Protocol_LDAP3);
+                  }
+                | PROTOCOL MYSQL {
+                    portset.protocol = Protocol_get(Protocol_MYSQL);
+                  }
+                | PROTOCOL SIP target maxforward {
+                    portset.protocol = Protocol_get(Protocol_SIP);
+                  }
+                | PROTOCOL NNTP {
+                    portset.protocol = Protocol_get(Protocol_NNTP);
+                  }
+                | PROTOCOL NTP3  {
+                    portset.protocol = Protocol_get(Protocol_NTP3);
+                    portset.type = SOCK_DGRAM;
+                  }
+                | PROTOCOL POSTFIXPOLICY {
+                    portset.protocol = Protocol_get(Protocol_POSTFIXPOLICY);
+                  }
+                | PROTOCOL POP {
+                    portset.protocol = Protocol_get(Protocol_POP);
+                  }
+                | PROTOCOL SMTP {
+                    portset.protocol = Protocol_get(Protocol_SMTP);
+                  }
+                | PROTOCOL SSH  {
+                    portset.protocol = Protocol_get(Protocol_SSH);
+                  }
+                | PROTOCOL RDATE {
+                    portset.protocol = Protocol_get(Protocol_RDATE);
+                  }
+                | PROTOCOL RSYNC {
+                    portset.protocol = Protocol_get(Protocol_RSYNC);
+                  }
+                | PROTOCOL TNS {
+                    portset.protocol = Protocol_get(Protocol_TNS);
+                  }
+                | PROTOCOL PGSQL {
+                    portset.protocol = Protocol_get(Protocol_PGSQL);
+                  }
+                | PROTOCOL LMTP {
+                    portset.protocol = Protocol_get(Protocol_LMTP);
+                  }
+                | PROTOCOL GPS {
+                    portset.protocol = Protocol_get(Protocol_GPS);
+                  }
+                | PROTOCOL RADIUS secret {
+                    portset.protocol = Protocol_get(Protocol_RADIUS);
+                  }
+                | PROTOCOL MEMCACHE {
+                    portset.protocol = Protocol_get(Protocol_MEMCACHE);
+                  }
+                | sendexpectlist {
+                    portset.protocol = Protocol_get(Protocol_GENERIC);
+                  }
+                ;     
+
+sendexpectlist  : sendexpect
+                | sendexpectlist sendexpect
+                ;
+
+sendexpect      : SEND STRING { addgeneric(&portset, $2, NULL); FREE($2);}
+                | EXPECT STRING { addgeneric(&portset, NULL, $2); FREE($2);}
+                ;
+
+target          : /* EMPTY */
+                | TARGET MAILADDR {
+                    portset.request = $2;
+                  }
+                | TARGET STRING {
+                    portset.request = $2;
+                  }
+                ;
+                
+maxforward      : /* EMPTY */ 
+                |  MAXFORWARD NUMBER {
+                     portset.maxforward = verifyMaxForward($2); 
+                   }
+                ;
+
+request         : /* EMPTY */
+                | REQUEST PATH hostheader { 
+                    portset.request = Util_urlEncode($2); 
+                    FREE($2); 
+                  }
+                | REQUEST PATH CHECKSUM STRING hostheader {
+                    portset.request = Util_urlEncode($2);
+                    FREE($2);
+                    portset.request_checksum = $4;
+                  }
+                ;
+
+hostheader      : /* EMPTY */
+                | HOSTHEADER STRING {
+                    portset.request_hostheader = $2;
+                  }
+                ;
+
+secret          : SECRET STRING { 
+                    portset.request = $2; 
+                  }
+                ;
+
+apache_stat_list: apache_stat
+                | apache_stat_list OR apache_stat
+                ;
+
+apache_stat     : LOGLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.loglimitOP = $<number>2; 
+                    portset.ApacheStatus.loglimit = (int)$3; 
+                  }
+                | CLOSELIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.closelimitOP = $<number>2; 
+                    portset.ApacheStatus.closelimit = (int)($3); 
+                  }
+                | DNSLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.dnslimitOP = $<number>2; 
+                    portset.ApacheStatus.dnslimit = (int)($3); 
+                  }
+                | KEEPALIVELIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.keepalivelimitOP = $<number>2; 
+                    portset.ApacheStatus.keepalivelimit = (int)($3); 
+                  }
+                | REPLYLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.replylimitOP = $<number>2; 
+                    portset.ApacheStatus.replylimit = (int)($3); 
+                  }
+                | REQUESTLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.requestlimitOP = $<number>2; 
+                    portset.ApacheStatus.requestlimit = (int)($3); 
+                  }
+                | STARTLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.startlimitOP = $<number>2; 
+                    portset.ApacheStatus.startlimit = (int)($3); 
+                  }
+                | WAITLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.waitlimitOP = $<number>2; 
+                    portset.ApacheStatus.waitlimit = (int)($3); 
+                  }
+                | GRACEFULLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.gracefullimitOP = $<number>2; 
+                    portset.ApacheStatus.gracefullimit = (int)($3); 
+                  }
+                | CLEANUPLIMIT operator NUMBER PERCENT { 
+                    portset.ApacheStatus.cleanuplimitOP = $<number>2; 
+                    portset.ApacheStatus.cleanuplimit = (int)($3); 
+                  }
+                ;
+
+exist           : IF NOT EXIST rate1 THEN action1 recovery {
+                    seteventaction(&(current)->action_NONEXIST, $<number>6, $<number>7);
+                  }
+                ;
+
+
+pid             : IF CHANGED PID rate1 THEN action1 {
+                    seteventaction(&(current)->action_PID, $<number>6, ACTION_IGNORE);
+                  }
+                ;
+
+ppid            : IF CHANGED PPID rate1 THEN action1 {
+                    seteventaction(&(current)->action_PPID, $<number>6, ACTION_IGNORE);
+                  }
+                ;
+
+uptime          : IF UPTIME operator NUMBER time rate1 THEN action1 recovery {
+                    uptimeset.operator = $<number>3;
+                    uptimeset.uptime = ((unsigned long long)$4 * $<number>5);
+                    addeventaction(&(uptimeset).action, $<number>8, $<number>9);
+                    adduptime(&uptimeset);
+                  }
+
+icmpcount       : /* EMPTY */ {
+                   $<number>$ = ICMP_ATTEMPT_COUNT;
+                  }
+                | COUNT NUMBER {    
+                   $<number>$ = $2;
+                  }
+                ;
+
+exectimeout     : /* EMPTY */ {
+                   $<number>$ = EXEC_TIMEOUT;
+                  }
+                | TIMEOUT NUMBER SECOND {
+                   $<number>$ = $2;
+                  }
+                ;
+                
+programtimeout  : /* EMPTY */ {
+                   $<number>$ = 600; // Default program status check timeout is 5 min
+                  }
+                | TIMEOUT NUMBER SECOND {
+                   $<number>$ = $2;
+                  }
+                ;
+
+nettimeout      : /* EMPTY */ {
+                   $<number>$ = NET_TIMEOUT;
+                  }
+                | TIMEOUT NUMBER SECOND {
+                   $<number>$ = $2;
+                  }
+                ;
+
+retry           : /* EMPTY */ {
+                   $<number>$ = 1;
+                  }
+                | RETRY NUMBER {
+                   $<number>$ = $2;
+                  }
+                ;
+
+actionrate      : IF NUMBER RESTART NUMBER CYCLE THEN action1 {
+                   actionrateset.count = $2;
+                   actionrateset.cycle = $4;
+                   addeventaction(&(actionrateset).action, $<number>7, ACTION_IGNORE);
+                   addactionrate(&actionrateset);
+                 }
+                | IF NUMBER RESTART NUMBER CYCLE THEN TIMEOUT {
+                   actionrateset.count = $2;
+                   actionrateset.cycle = $4;
+                   addeventaction(&(actionrateset).action, ACTION_UNMONITOR, ACTION_IGNORE);
+                   addactionrate(&actionrateset);
+                 }
+                ;
+
+urloption       : /* EMPTY */
+                | CONTENT urloperator STRING {
+                    seturlrequest($<number>2, $<string>3);
+                    FREE($3);
+                  }
+                ;
+
+urloperator     : EQUAL    { $<number>$ = OPERATOR_EQUAL; }
+                | NOTEQUAL { $<number>$ = OPERATOR_NOTEQUAL; }
+                ;
+
+alert           : alertmail formatlist reminder {
+                   mailset.events = Event_All;
+                   addmail($<string>1, &mailset, &current->maillist);
+                  }
+                | alertmail '{' eventoptionlist '}' formatlist reminder {
+                   addmail($<string>1, &mailset, &current->maillist);
+                  }
+                | alertmail NOT '{' eventoptionlist '}' formatlist reminder {
+                   mailset.events = ~mailset.events;
+                   addmail($<string>1, &mailset, &current->maillist);
+                  }
+                | noalertmail {
+                   addmail($<string>1, &mailset, &current->maillist);
+                  }
+                ;
+
+alertmail       : ALERT MAILADDR { $<string>$ = $2; }
+                ;
+
+noalertmail     : NOALERT MAILADDR { $<string>$ = $2; }
+                ;
+
+eventoptionlist : eventoption
+                | eventoptionlist eventoption
+                ;
+
+eventoption     : ACTION          { mailset.events |= Event_Action; }
+                | CHECKSUM        { mailset.events |= Event_Checksum; }
+                | CONNECTION      { mailset.events |= Event_Connection; }
+                | CONTENT         { mailset.events |= Event_Content; }
+                | DATA            { mailset.events |= Event_Data; }
+                | EXEC            { mailset.events |= Event_Exec; }
+                | FSFLAG          { mailset.events |= Event_Fsflag; }
+                | GID             { mailset.events |= Event_Gid; }
+                | ICMP            { mailset.events |= Event_Icmp; }
+                | INSTANCE        { mailset.events |= Event_Instance; }
+                | INVALID         { mailset.events |= Event_Invalid; }
+                | NONEXIST        { mailset.events |= Event_Nonexist; }
+                | PERMISSION      { mailset.events |= Event_Permission; }
+                | PID             { mailset.events |= Event_Pid; }
+                | PPID            { mailset.events |= Event_PPid; }
+                | RESOURCE        { mailset.events |= Event_Resource; }
+                | SIZE            { mailset.events |= Event_Size; }
+                | STATUS          { mailset.events |= Event_Status; }
+                | TIMEOUT         { mailset.events |= Event_Timeout; }
+                | TIMESTAMP       { mailset.events |= Event_Timestamp; }
+                | UID             { mailset.events |= Event_Uid; }
+                | UPTIME          { mailset.events |= Event_Uptime; }
+                ;
+
+formatlist      : /* EMPTY */
+                | MAILFORMAT '{' formatoptionlist '}'
+                ;
+
+formatoptionlist: formatoption
+                | formatoptionlist formatoption
+                ;
+
+formatoption    : MAILFROM { mailset.from = $1; }
+                | MAILREPLYTO { mailset.replyto = $1; }
+                | MAILSUBJECT { mailset.subject = $1; }
+                | MAILBODY { mailset.message = $1; }
+                ;
+
+every           : EVERY NUMBER CYCLE {
+                   current->every.type = EVERY_SKIPCYCLES;
+                   current->every.spec.cycle.number = $2;
+                 }
+                | EVERY TIMESPEC {
+                   current->every.type = EVERY_CRON;
+                   current->every.spec.cron = $2;
+                 }
+                | NOTEVERY TIMESPEC {
+                   current->every.type = EVERY_NOTINCRON;
+                   current->every.spec.cron = $2;
+                 }
+                ;
+
+mode            : MODE ACTIVE  {
+                    current->mode = MODE_ACTIVE;
+                  }
+                | MODE PASSIVE {
+                    current->mode = MODE_PASSIVE;
+                  }
+                | MODE MANUAL  {
+                    current->mode = MODE_MANUAL;
+                    current->monitor = MONITOR_NOT;
+                  }
+                ;
+
+group           : GROUP STRINGNAME { addservicegroup($2); FREE($2);}
+                ;
+
+
+depend          : DEPENDS dependlist
+                ;
+
+dependlist      : dependant
+                | dependlist dependant
+                ;
+ 
+dependant       : SERVICENAME { adddependant($<string>1); }
+                ;
+
+exitvalue       : IF STATUS operator NUMBER programtimeout rate1 THEN action1 recovery {
+                        programset.operator = $<number>3;
+                        programset.return_value = $<number>4;
+                        programset.timeout = $<number>5;
+                        addeventaction(&(programset).action, $<number>8, $<number>9);
+                        addprogram(&programset);
+                   }
+                ;
+
+resourceprocess : IF resourceprocesslist rate1 THEN action1 recovery {
+                     addeventaction(&(resourceset).action, $<number>5, $<number>6);
+                     addresource(&resourceset);
+                   }
+                ;
+
+resourceprocesslist : resourceprocessopt
+                    | resourceprocesslist resourceprocessopt
+                    ;
+
+resourceprocessopt  : resourcecpuproc
+                    | resourcemem
+                    | resourcechild
+                    | resourceload
+                    ;
+
+resourcesystem  : IF resourcesystemlist rate1 THEN action1 recovery {
+                     addeventaction(&(resourceset).action, $<number>5, $<number>6);
+                     addresource(&resourceset);
+                   }
+                ;
+
+resourcesystemlist : resourcesystemopt
+                   | resourcesystemlist resourcesystemopt
+                   ;
+
+resourcesystemopt  : resourceload
+                   | resourcemem
+                   | resourceswap
+                   | resourcecpu
+                   ;
+
+resourcecpuproc : CPU operator NUMBER PERCENT {
+                    resourceset.resource_id = RESOURCE_ID_CPU_PERCENT;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10); 
+                  }
+                | TOTALCPU operator NUMBER PERCENT {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_CPU_PERCENT;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10); 
+                  }
+                ;
+
+resourcecpu     : resourcecpuid operator NUMBER PERCENT {
+                    resourceset.resource_id = $<number>1;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10); 
+                  }
+                ;
+
+resourcecpuid   : CPUUSER   { $<number>$ = RESOURCE_ID_CPUUSER; }
+                | CPUSYSTEM { $<number>$ = RESOURCE_ID_CPUSYSTEM; }
+                | CPUWAIT   { $<number>$ = RESOURCE_ID_CPUWAIT; }
+                ;
+
+resourcemem     : MEMORY operator value unit {
+                    resourceset.resource_id = RESOURCE_ID_MEM_KBYTE;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = (int) ($<real>3 * ($<number>4 / 1024.0)); 
+                  }
+                | MEMORY operator NUMBER PERCENT {
+                    resourceset.resource_id = RESOURCE_ID_MEM_PERCENT;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10); 
+                  }
+                | TOTALMEMORY operator value unit {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_MEM_KBYTE;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = (int) ($<real>3 * ($<number>4 / 1024.0));
+                  }
+                | TOTALMEMORY operator NUMBER PERCENT  {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_MEM_PERCENT;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10);
+                  }
+                ;
+
+resourceswap    : SWAP operator value unit {
+                    resourceset.resource_id = RESOURCE_ID_SWAP_KBYTE;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = (int) ($<real>3 * ($<number>4 / 1024.0));
+                  }
+                | SWAP operator NUMBER PERCENT {
+                    resourceset.resource_id = RESOURCE_ID_SWAP_PERCENT;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = ($3 * 10);
+                  }
+                ;
+
+resourcechild   : CHILDREN operator NUMBER { 
+                    resourceset.resource_id = RESOURCE_ID_CHILDREN;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = (int) $3; 
+                  }
+                ;
+
+resourceload    : resourceloadavg operator value { 
+                    resourceset.resource_id = $<number>1;
+                    resourceset.operator = $<number>2;
+                    resourceset.limit = (int) ($<real>3 * 10.0); 
+                  }
+                ;
+
+resourceloadavg : LOADAVG1  { $<number>$ = RESOURCE_ID_LOAD1; }
+                | LOADAVG5  { $<number>$ = RESOURCE_ID_LOAD5; }
+                | LOADAVG15 { $<number>$ = RESOURCE_ID_LOAD15; }
+                ;
+
+value           : REAL { $<real>$ = $1; }
+                | NUMBER { $<real>$ = (float) $1; }
+                ;
+
+timestamp       : IF TIMESTAMP operator NUMBER time rate1 THEN action1 recovery {
+                    timestampset.operator = $<number>3;
+                    timestampset.time = ($4 * $<number>5);
+                    addeventaction(&(timestampset).action, $<number>8, $<number>9);
+                    addtimestamp(&timestampset, FALSE);
+                  }
+                | IF CHANGED TIMESTAMP rate1 THEN action1 {
+                    timestampset.test_changes = TRUE;
+                    addeventaction(&(timestampset).action, $<number>6, ACTION_IGNORE);
+                    addtimestamp(&timestampset, TRUE);
+                  }
+                ;
+
+operator        : /* EMPTY */ { $<number>$ = OPERATOR_EQUAL; }
+                | GREATER     { $<number>$ = OPERATOR_GREATER; }
+                | LESS        { $<number>$ = OPERATOR_LESS; }
+                | EQUAL       { $<number>$ = OPERATOR_EQUAL; }
+                | NOTEQUAL    { $<number>$ = OPERATOR_NOTEQUAL; }
+                | CHANGED     { $<number>$ = OPERATOR_NOTEQUAL; }
+                ;
+
+time            : /* EMPTY */ { $<number>$ = TIME_SECOND; }
+                | SECOND      { $<number>$ = TIME_SECOND; }
+                | MINUTE      { $<number>$ = TIME_MINUTE; }
+                | HOUR        { $<number>$ = TIME_HOUR; }
+                | DAY         { $<number>$ = TIME_DAY; }
+                ;
+
+action          : ALERT                            { $<number>$ = ACTION_ALERT; }
+                | EXEC argumentlist                { $<number>$ = ACTION_EXEC; }
+                | EXEC argumentlist useroptionlist { $<number>$ = ACTION_EXEC; }
+                | RESTART                          { $<number>$ = ACTION_RESTART; }
+                | START                            { $<number>$ = ACTION_START; }
+                | STOP                             { $<number>$ = ACTION_STOP; }
+                | UNMONITOR                        { $<number>$ = ACTION_UNMONITOR; }
+                ;
+
+action1         : action {
+                    $<number>$ = $<number>1;
+                    if ($<number>1 == ACTION_EXEC && command) {
+                      command1 = command;
+                      command = NULL;
+                    }
+                  }
+                ;
+
+action2         : action {
+                    $<number>$ = $<number>1;
+                    if ($<number>1 == ACTION_EXEC && command) {
+                      command2 = command;
+                      command = NULL;
+                    }
+                  }
+                ;
+
+rate1           : /* EMPTY */
+                | NUMBER CYCLE {
+                    rate1.count  = $<number>1;
+                    rate1.cycles = $<number>1;
+                    if (rate1.cycles < 1 || rate1.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                  }
+                | NUMBER NUMBER CYCLE {
+                    rate1.count  = $<number>1;
+                    rate1.cycles = $<number>2;
+                    if (rate1.cycles < 1 || rate1.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                    if (rate1.count < 1 || rate1.count > rate1.cycles)
+                      yyerror2("the number of events must be bigger then 0 and less than poll cycles");
+                  }
+                ;
+
+rate2           : /* EMPTY */
+                | NUMBER CYCLE {
+                    rate2.count  = $<number>1;
+                    rate2.cycles = $<number>1;
+                    if (rate2.cycles < 1 || rate2.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                  }
+                | NUMBER NUMBER CYCLE {
+                    rate2.count  = $<number>1;
+                    rate2.cycles = $<number>2;
+                    if (rate2.cycles < 1 || rate2.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                    if (rate2.count < 1 || rate2.count > rate2.cycles)
+                      yyerror2("the number of events must be bigger then 0 and less than poll cycles");
+                  }
+                ;
+
+recovery        : /* EMPTY */ {
+                    $<number>$ = ACTION_ALERT;
+                  }
+                | ELSE IF RECOVERED rate2 THEN action2 {
+                    $<number>$ = $<number>6;
+                  }
+                | ELSE IF PASSED rate2 THEN action2 {
+                    $<number>$ = $<number>6;
+                  }
+                | ELSE IF SUCCEEDED rate2 THEN action2 {
+                    $<number>$ = $<number>6;
+                  }
+                ;
+
+checksum        : IF FAILED hashtype CHECKSUM rate1 THEN action1 recovery {
+                    addeventaction(&(checksumset).action, $<number>7, $<number>8);
+                    addchecksum(&checksumset);
+                  }
+                | IF FAILED hashtype CHECKSUM EXPECT STRING rate1 THEN action1
+                  recovery {
+                    snprintf(checksumset.hash, sizeof(checksumset.hash), "%s", $6);
+                    FREE($6);
+                    addeventaction(&(checksumset).action, $<number>9, $<number>10);
+                    addchecksum(&checksumset);
+                  }
+                | IF CHANGED hashtype CHECKSUM rate1 THEN action1 {
+                    checksumset.test_changes = TRUE;
+                    addeventaction(&(checksumset).action, $<number>7, ACTION_IGNORE);
+                    addchecksum(&checksumset);
+                  }
+                ;
+hashtype        : /* EMPTY */ { checksumset.type = HASH_UNKNOWN; }
+                | MD5HASH     { checksumset.type = HASH_MD5; }
+                | SHA1HASH    { checksumset.type = HASH_SHA1; }
+                ;
+
+inode           : IF INODE operator NUMBER rate1 THEN action1 recovery {
+                    filesystemset.resource = RESOURCE_ID_INODE;
+                    filesystemset.operator = $<number>3;
+                    filesystemset.limit_absolute = $4;
+                    addeventaction(&(filesystemset).action, $<number>7, $<number>8);
+                    addfilesystem(&filesystemset);
+                  }
+                | IF INODE operator NUMBER PERCENT rate1 THEN action1 recovery {
+                    filesystemset.resource = RESOURCE_ID_INODE;
+                    filesystemset.operator = $<number>3;
+                    filesystemset.limit_percent = (int)($4 * 10);
+                    addeventaction(&(filesystemset).action, $<number>8, $<number>9);
+                    addfilesystem(&filesystemset);
+                  }
+                ;
+
+space           : IF SPACE operator value unit rate1 THEN action1 recovery {
+                    if (!filesystem_usage(current->inf, current->path))
+                      yyerror2("cannot read usage of filesystem %s", current->path);
+                    filesystemset.resource = RESOURCE_ID_SPACE;
+                    filesystemset.operator = $<number>3;
+                    filesystemset.limit_absolute = (int)((float)$<real>4 / (float)current->inf->priv.filesystem.f_bsize * (float)$<number>5);
+                    addeventaction(&(filesystemset).action, $<number>8, $<number>9);
+                    addfilesystem(&filesystemset);
+                  }
+                | IF SPACE operator NUMBER PERCENT rate1 THEN action1 recovery {
+                    filesystemset.resource = RESOURCE_ID_SPACE;
+                    filesystemset.operator = $<number>3;
+                    filesystemset.limit_percent = (int)($4 * 10);
+                    addeventaction(&(filesystemset).action, $<number>8, $<number>9);
+                    addfilesystem(&filesystemset);
+                  }
+                ;
+
+fsflag          : IF CHANGED FSFLAG rate1 THEN action1 {
+                    seteventaction(&(current)->action_FSFLAG, $<number>6, ACTION_IGNORE);
+                  }
+                ;
+
+unit            : /* empty */  { $<number>$ = UNIT_BYTE; }
+                | BYTE         { $<number>$ = UNIT_BYTE; }
+                | KILOBYTE     { $<number>$ = UNIT_KILOBYTE; }
+                | MEGABYTE     { $<number>$ = UNIT_MEGABYTE; }
+                | GIGABYTE     { $<number>$ = UNIT_GIGABYTE; }
+                ;
+
+permission      : IF FAILED PERMISSION NUMBER rate1 THEN action1 recovery {
+                    permset.perm = check_perm($4);
+                    addeventaction(&(permset).action, $<number>7, $<number>8);
+                    addperm(&permset);
+                  }
+                ;
+
+match           : IF matchflagnot MATCH PATH rate1 THEN action1 {
+                    matchset.ignore = FALSE;
+                    matchset.match_path = $4;
+                    matchset.match_string = NULL;
+                    addmatchpath(&matchset, $<number>7);
+                    FREE($4); 
+                  }
+                | IF matchflagnot MATCH STRING rate1 THEN action1 {
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = $4;
+                    addmatch(&matchset, $<number>7, 0);
+                  }
+                | IGNORE matchflagnot MATCH PATH {
+                    matchset.ignore = TRUE;
+                    matchset.match_path = $4;
+                    matchset.match_string = NULL;
+                    addmatchpath(&matchset, ACTION_IGNORE);
+                    FREE($4); 
+                  }
+                | IGNORE matchflagnot MATCH STRING {
+                    matchset.ignore = TRUE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = $4;
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+                ;
+
+matchflagnot    : /* EMPTY */ {
+                    matchset.not = FALSE;
+                  }
+                | NOT {
+                    matchset.not = TRUE;
+                  }
+                ;
+
+
+size            : IF SIZE operator NUMBER unit rate1 THEN action1 recovery {
+                    sizeset.operator = $<number>3;
+                    sizeset.size = ((unsigned long long)$4 * $<number>5);
+                    addeventaction(&(sizeset).action, $<number>8, $<number>9);
+                    addsize(&sizeset);
+                  }
+                | IF CHANGED SIZE rate1 THEN action1 {
+                    sizeset.test_changes = TRUE;
+                    addeventaction(&(sizeset).action, $<number>6, ACTION_IGNORE);
+                    addsize(&sizeset);
+                  }
+                ;
+
+uid             : IF FAILED UID STRING rate1 THEN action1 recovery {
+                    uidset.uid = get_uid($4, 0);
+                    addeventaction(&(uidset).action, $<number>7, $<number>8);
+                    adduid(&uidset);
+                    FREE($4);
+                  }
+                | IF FAILED UID NUMBER rate1 THEN action1 recovery {
+                    uidset.uid = get_uid(NULL, $4);
+                    addeventaction(&(uidset).action, $<number>7, $<number>8);
+                    adduid(&uidset);
+                  }
+                ;
+
+gid             : IF FAILED GID STRING rate1 THEN action1 recovery {
+                    gidset.gid = get_gid($4, 0);
+                    addeventaction(&(gidset).action, $<number>7, $<number>8);
+                    addgid(&gidset);
+                    FREE($4);
+                  }
+                | IF FAILED GID NUMBER rate1 THEN action1 recovery {
+                    gidset.gid = get_gid(NULL, $4);
+                    addeventaction(&(gidset).action, $<number>7, $<number>8);
+                    addgid(&gidset);
+                  }
+                ;
+
+icmptype        : TYPE ICMPECHO { $<number>$ = ICMP_ECHO; }
+                ;
+
+reminder        : /* EMPTY */           { mailset.reminder = 0; }
+                | REMINDER NUMBER       { mailset.reminder = $<number>2; }
+                | REMINDER NUMBER CYCLE { mailset.reminder = $<number>2; }
+                ;
+
+%%
+
+
+/* -------------------------------------------------------- Parser interface */
+
+
+/**
+ * Syntactic error routine
+ *
+ * This routine is automatically called by the lexer!
+ */
+void yyerror(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogError("%s:%i: Error: %s '%s'\n", currentfile, lineno, msg, yytext);
+  cfg_errflag++;
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Syntactical warning routine
+ */
+void yywarning(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogWarning("%s:%i: Warning: %s '%s'\n", currentfile, lineno, msg, yytext);
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Argument error routine
+ */
+void yyerror2(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogError("%s:%i: Error: %s '%s'\n", argcurrentfile, arglineno, msg, argyytext);
+  cfg_errflag++;
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Argument warning routine
+ */
+void yywarning2(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogWarning("%s:%i: Warning: %s '%s'\n", argcurrentfile, arglineno, msg, argyytext);
+ 
+  FREE(msg);
+  
+}
+
+/*
+ * The Parser hook - start parsing the control file
+ * Returns TRUE if parsing succeeded, otherwise FALSE
+ */
+int parse(char *controlfile) {
+
+  ASSERT(controlfile);
+
+  servicelist = tail = current = NULL;
+
+  /*
+   * Secure check the monitrc file. The run control file must have the
+   * same uid as the REAL uid of this process, it must have permissions
+   * no greater than 700 and it must not be a symbolic link.
+   */
+  if (! file_checkStat(controlfile, "control file", S_IRUSR|S_IWUSR|S_IXUSR))
+    return FALSE;
+
+  if ((yyin = fopen(controlfile,"r")) == (FILE *)NULL) {
+    LogError("%s: Error: cannot open the control file '%s' -- %s\n", prog, controlfile, STRERROR);
+    return FALSE;
+  }
+
+  currentfile = Str_dup(controlfile);
+
+  /* 
+   * Creation of the global service list is synchronized  
+   */
+  LOCK(Run.mutex)
+    preparse();
+    yyparse();
+    fclose(yyin);
+    /* Add the default general system service if not specified explicitly */
+    if (!hassystem) {
+      char *name = Str_cat("system_%s", Run.localhostname);
+      if (Util_existService(name) || (current && IS(name, current->name))) {
+        LogError("'check system' not defined in control file, failed to add automatic configuration (service name %s is used already) -- please add 'check system <name>' manually\n", name, name);
+        FREE(name);
+        cfg_errflag++;
+      } else {
+        createservice(TYPE_SYSTEM, name, Str_dup(""), check_system);
+      }
+    }
+    /* If defined - add the last service to the service list */
+    if (current) {
+      addservice(current);
+      FREE(current);
+    }
+    postparse();
+  END_LOCK;
+
+  FREE(currentfile);
+
+  if (argyytext != NULL)
+    FREE(argyytext);
+
+  return(cfg_errflag == 0);
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Initialize objects used by the parser.
+ */
+static void preparse() {
+  int i;
+  char localhost[STRLEN];
+
+  /*
+   * Get the localhost name
+   */
+  if (Util_getfqdnhostname(localhost, sizeof(localhost)))
+    snprintf(localhost, STRLEN, "%s", LOCALHOST);
+
+  /* Set instance incarnation ID */
+  time(&Run.incarnation);
+  /* Reset lexer */
+  buffer_stack_ptr        = 0;
+  lineno                  = 1;
+  arglineno               = 1;
+  argcurrentfile          = NULL;
+  argyytext               = NULL;
+  /* Reset parser */
+  Run.stopped             = FALSE;
+  Run.dolog               = FALSE;
+  Run.dohttpd             = FALSE;
+  Run.doaction            = FALSE;
+  Run.httpdsig            = TRUE;
+  Run.dommonitcredentials = TRUE;
+  Run.mmonitcredentials   = NULL;
+  Run.credentials         = NULL;
+  Run.httpdssl            = FALSE;
+  Run.httpsslpem          = NULL;
+  Run.httpsslclientpem    = NULL;
+  Run.clientssl           = FALSE;
+  Run.allowselfcert       = FALSE; 
+  Run.mailserver_timeout  = NET_TIMEOUT;
+  Run.bind_addr           = NULL;
+  Run.eventlist           = NULL;
+  Run.eventlist_dir       = NULL;
+  Run.eventlist_slots     = -1;
+  Run.system              = NULL;
+  Run.expectbuffer        = STRLEN;
+  Run.mmonits             = NULL;
+  Run.maillist            = NULL;
+  Run.mailservers         = NULL;
+  Run.MailFormat.from     = NULL;
+  Run.MailFormat.replyto  = NULL;
+  Run.MailFormat.subject  = NULL;
+  Run.MailFormat.message  = NULL;
+  Run.localhostname       = Str_dup(localhost);
+  depend_list             = NULL;
+  Run.handler_init        = TRUE;
+#ifdef OPENSSL_FIPS  
+  Run.fipsEnabled         = FALSE;
+#endif
+  for (i = 0; i <= HANDLER_MAX; i++)
+    Run.handler_queue[i] = 0;
+  /* 
+   * Initialize objects
+   */
+  reset_uidset();
+  reset_programset();
+  reset_gidset();
+  reset_sizeset();
+  reset_mailset();
+  reset_mailserverset();
+  reset_portset();
+  reset_permset();
+  reset_icmpset();
+  reset_rateset();
+  reset_filesystemset();
+  reset_resourceset();
+  reset_checksumset();
+  reset_timestampset();
+  reset_actionrateset();
+}
+
+
+/*
+ * Check that values are reasonable after parsing
+ */
+static void postparse() {
+        Service_T s;
+        
+        if (cfg_errflag || ! servicelist)
+                return;
+        
+        /* Check the sanity of any dependency graph */
+        check_depend();
+        
+        /* Check that we do not start monit in daemon mode without having a
+         * poll time */
+        if (!Run.polltime && (Run.isdaemon || Run.init)) {
+                LogError("%s: Error: Poll time not defined. Please define poll time in the\n control file or use the -d option when starting monit\n", prog);
+                cfg_errflag++;
+        }
+        
+        if (Run.logfile)
+                Run.dolog = TRUE;
+
+        for (s = servicelist; s; s = s->next) {
+                /* Set the general system service shortcut */
+                if (s->type == TYPE_SYSTEM)
+                        Run.system = s;
+                else if (s->type == TYPE_HOST) {
+                        /* Verify that a remote service has a port or an icmp list */
+                        if (!s->portlist && !s->icmplist) {
+                                LogError("%s: Error: 'check host' statement is incomplete; Please specify a port number to test\n or an icmp test at the remote host: '%s'\n", prog, s->name);
+                                cfg_errflag++;
+                        }
+                }
+                else if (s->type == TYPE_PROGRAM) {
+                        /* Verify that a program test has a status test */
+                        if (! s->program) {
+                                LogError("%s: Error: 'check program %s' is incomplete; Please add an 'if status != n' test\n", prog, s->name);
+                                cfg_errflag++;
+                        }
+                }
+        }
+        
+        if (Run.mmonits) {
+                if (Run.dohttpd) {
+                        if (Run.dommonitcredentials) {
+                                Auth_T c;
+                                for (c = Run.credentials; c; c = c->next) {
+                                        if (c->digesttype == DIGEST_CLEARTEXT && ! c->is_readonly) {
+                                                Run.mmonitcredentials = c;
+                                                break;
+                                        }
+                                }
+                                if (! Run.mmonitcredentials)
+                                LogWarning("%s: Warning: M/Monit registration with credentials enabled, but no suitable credentials found in monit configuration file -- please add 'allow user:password' option to 'set httpd' statement\n", prog);
+                        }
+                } else
+                LogWarning("%s: Warning: M/Monit enabled but no httpd allowed -- please add 'set httpd' statement\n", prog);
+        }
+}
+
+
+/*
+ * Create a new service object and add any current objects to the
+ * service list.
+ */
+static void createservice(int type, char *name, char *value, int (*check)(Service_T s)) {
+
+  ASSERT(name);
+  ASSERT(value);
+
+  check_name(name);
+
+  if (current) {
+    addservice(current);
+    memset(current, 0, sizeof(*current));
+  } else {
+    NEW(current);
+  }
+
+  current->type = type;
+
+  NEW(current->inf);
+  Util_resetInfo(current);
+
+  /* Set default values */
+  current->monitor = MONITOR_INIT;
+  current->mode    = MODE_ACTIVE;
+  current->name    = name;
+  current->check   = check;
+  current->path    = value;
+
+  /* Initialize general event handlers */
+  addeventaction(&(current)->action_DATA,     ACTION_ALERT,     ACTION_ALERT);
+  addeventaction(&(current)->action_EXEC,     ACTION_ALERT,     ACTION_ALERT);
+  addeventaction(&(current)->action_INVALID,  ACTION_RESTART,   ACTION_ALERT);
+  addeventaction(&(current)->action_NONEXIST, ACTION_RESTART,   ACTION_ALERT);
+  addeventaction(&(current)->action_PID,      ACTION_ALERT,     ACTION_IGNORE);
+  addeventaction(&(current)->action_PPID,     ACTION_ALERT,     ACTION_IGNORE);
+  addeventaction(&(current)->action_FSFLAG,   ACTION_ALERT,     ACTION_IGNORE);
+
+  /* Initialize internal event handlers */
+  addeventaction(&(current)->action_MONIT_START,  ACTION_START, ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_STOP,   ACTION_STOP,  ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_RELOAD, ACTION_START, ACTION_IGNORE);
+  addeventaction(&(current)->action_ACTION,       ACTION_ALERT, ACTION_IGNORE);
+  
+  gettimeofday(&current->collected, NULL);
+}
+
+
+/*
+ * Add a service object to the servicelist
+ */
+static void addservice(Service_T s) {
+  Service_T n;
+
+  ASSERT(s);
+ 
+  NEW(n);
+  memcpy(n, s, sizeof(*s));
+  /* Add the service to the end of the service list */
+  if (tail != NULL) {
+    tail->next = n;
+    tail->next_conf = n;
+  } else {
+    servicelist = n;
+    servicelist_conf = n;
+  }
+  tail = n;
+}
+
+
+/* 
+ * Add entry to service group list
+ */
+static void addservicegroup(char *name) {
+  ServiceGroup_T g;
+  ServiceGroupMember_T m;
+
+  ASSERT(name);
+ 
+  /* Check if service group with the same name is defined already */
+  for (g = servicegrouplist; g; g = g->next)
+    if (! strcasecmp(g->name, name))
+      break;
+
+  if (! g) {
+    NEW(g);
+    g->name = Str_dup(name);
+    g->next = servicegrouplist;
+    servicegrouplist = g;
+  }
+
+  NEW(m);
+  m->name = Str_dup(current->name);
+  m->next = g->members;
+  g->members = m;
+}
+
+
+/* 
+ * Add a dependant entry to the current service dependant list
+ *
+ */
+static void adddependant(char *dependant) {
+  Dependant_T d; 
+
+  ASSERT(dependant);
+  
+  NEW(d);
+  
+  if (current->dependantlist != NULL)
+    d->next = current->dependantlist;
+
+  d->dependant = dependant;
+  current->dependantlist = d;
+
+}
+
+
+/*
+ * Add the given mailaddress with the appropriate alert notification
+ * values and mail attributes to the given mailinglist.
+ */
+static void addmail(char *mailto, Mail_T f, Mail_T *l) {
+  Mail_T m;
+
+  ASSERT(mailto);
+
+  NEW(m);
+  m->to       = mailto;
+  m->from     = f->from;
+  m->subject  = f->subject;
+  m->message  = f->message;
+  m->events   = f->events;
+  m->reminder = f->reminder;
+  
+  m->next = *l;
+  *l = m;
+
+  reset_mailset();
+}
+
+
+/*
+ * Add the given portset to the current service's portlist
+ */
+static void addport(Port_T port) {
+  Port_T p;
+  
+  ASSERT(port);
+
+  NEW(p);
+  p->port               = port->port;
+  p->type               = port->type;
+  p->socket             = port->socket;
+  p->family             = port->family;
+  p->action             = port->action;
+  p->timeout            = port->timeout;
+  p->retry              = port->retry;
+  p->request            = port->request;
+  p->generic            = port->generic;
+  p->protocol           = port->protocol;
+  p->pathname           = port->pathname;
+  p->hostname           = port->hostname;
+  p->url_request        = port->url_request;
+  p->request_checksum   = port->request_checksum;
+  p->request_hostheader = port->request_hostheader;
+  memcpy(&p->ApacheStatus, &port->ApacheStatus, sizeof(struct apache_status));
+
+  if (p->request_checksum) {
+    cleanup_hash_string(p->request_checksum);
+    if (strlen(p->request_checksum) == 32)
+      p->request_hashtype = HASH_MD5;
+    else if (strlen(p->request_checksum) == 40)
+      p->request_hashtype = HASH_SHA1;
+    else
+      yyerror2("invalid checksum [%s]", p->request_checksum);
+  } else
+    p->request_hashtype = 0;
+
+  if (port->SSL.use_ssl == TRUE) {
+    if (!have_ssl()) {
+      yyerror("ssl check cannot be activated. SSL is not supported");
+    } else {
+      if (port->SSL.certmd5 != NULL) {
+	p->SSL.certmd5 = port->SSL.certmd5;
+	cleanup_hash_string(p->SSL.certmd5);
+      }
+      p->SSL.use_ssl = TRUE;
+      p->SSL.version = port->SSL.version;
+    }
+  }
+  p->maxforward = port->maxforward;
+  p->next = current->portlist;
+  current->portlist = p;
+  
+  reset_portset();
+
+}
+
+
+/*
+ * Add a new resource object to the current service resource list
+ */
+static void addresource(Resource_T rr) {
+  Resource_T r;
+
+  ASSERT(rr);
+
+  NEW(r);
+  if (! Run.doprocess)
+    yyerror("Cannot activate service check. The process status engine was disabled. On certain systems you must run monit as root to utilize this feature)\n");
+  r->resource_id = rr->resource_id;
+  r->limit       = rr->limit;
+  r->action      = rr->action;
+  r->operator    = rr->operator;
+  r->next        = current->resourcelist;
+
+  current->resourcelist = r;
+  reset_resourceset();
+}
+
+
+/*
+ * Add a new file object to the current service timestamp list
+ */
+static void addtimestamp(Timestamp_T ts, int notime) {
+  Timestamp_T t;
+
+  ASSERT(ts);
+
+  NEW(t);
+  t->operator     = ts->operator;
+  t->time         = ts->time;
+  t->action       = ts->action;
+  t->test_changes = ts->test_changes;
+  
+  if (t->test_changes || notime) {
+    if (! file_exist(current->path)) {
+      DEBUG("%s: Debug: the path '%s' used in the TIMESTAMP statement refer to a non-existing object\n", prog, current->path);
+    } else if (!(t->timestamp = file_getTimestamp(current->path, S_IFDIR|S_IFREG))) {
+      yyerror2("cannot get the timestamp for '%s'", current->path);
+    }
+  }
+  
+  t->next = current->timestamplist;
+  current->timestamplist = t;
+
+  reset_timestampset();
+}
+
+
+/*
+ * Add a new object to the current service actionrate list
+ */
+static void addactionrate(ActionRate_T ar) {
+  ActionRate_T a;
+
+  ASSERT(ar);
+
+  if (ar->count > ar->cycle)
+    yyerror2("the number of restarts must be less than poll cycles");
+  if (ar->count <= 0 || ar->cycle <= 0)
+    yyerror2("zero or negative values not allowed in a action rate statement");
+
+  NEW(a);
+  a->count  = ar->count;
+  a->cycle  = ar->cycle;
+  a->action = ar->action;
+
+  a->next = current->actionratelist;
+  current->actionratelist = a;
+
+  reset_actionrateset();
+}
+
+
+
+/*
+ * Add a new Size object to the current service size list
+ */
+static void addsize(Size_T ss) {
+  Size_T s;
+  struct stat buf;
+
+  ASSERT(ss);
+
+  NEW(s);
+  s->operator     = ss->operator;
+  s->size         = ss->size;
+  s->action       = ss->action;
+  s->test_changes = ss->test_changes;
+  /* Get the initial size for future comparision, if the file exists */
+  if (s->test_changes) {
+    s->test_changes_ok = !stat(current->path, &buf);
+    if (s->test_changes_ok)
+      s->size = (unsigned long long)buf.st_size;
+  }
+ 
+  s->next = current->sizelist;
+  current->sizelist = s;
+
+  reset_sizeset();
+}
+
+
+/*
+ * Add a new Uptime object to the current service uptime list
+ */
+static void adduptime(Uptime_T uu) {
+  Uptime_T u;
+
+  ASSERT(uu);
+
+  NEW(u);
+  u->operator = uu->operator;
+  u->uptime = uu->uptime;
+  u->action = uu->action;
+
+  u->next = current->uptimelist;
+  current->uptimelist = u;
+
+  reset_uptimeset();
+}
+
+
+/*
+ * Set Checksum object in the current service
+ */
+static void addchecksum(Checksum_T cs) {
+
+  int len;
+  Checksum_T c;
+
+  ASSERT(cs);
+
+  cs->test_changes_ok = TRUE;
+
+  if (! *cs->hash) {
+    if (cs->type == HASH_UNKNOWN)
+      cs->type = DEFAULT_HASH;
+    if ( !(Util_getChecksum(current->path, cs->type, cs->hash, sizeof(cs->hash)))) {
+      if (cs->test_changes == TRUE) {
+        /* If the file doesn't exist and we're checking for checksum changes, set dummy value */
+        cs->test_changes_ok = FALSE;
+        snprintf(cs->hash, sizeof(cs->hash), "00000000000000000000000000000000");
+      } else {
+        yyerror2("cannot compute a checksum for file %s", current->path);
+        reset_checksumset();
+        return;
+      }
+    }
+  }
+
+  len = cleanup_hash_string(cs->hash);
+
+  if (cs->type == HASH_UNKNOWN) {
+    if (len == 32) {
+      cs->type = HASH_MD5;
+    } else if (len == 40) {
+      cs->type = HASH_SHA1;
+    } else {
+      yyerror2("invalid checksum [%s] for file %s", cs->hash, current->path);
+      reset_checksumset();
+      return;
+    }
+  } else if (( cs->type == HASH_MD5 && len!=32 ) || ( cs->type == HASH_SHA1 && len != 40 )) {
+    yyerror2("invalid checksum [%s] for file %s", cs->hash, current->path);
+    reset_checksumset();
+    return;
+  }
+
+  NEW(c);
+
+  c->type            = cs->type;
+  c->test_changes    = cs->test_changes;
+  c->test_changes_ok = cs->test_changes_ok;
+  c->action          = cs->action;
+  snprintf(c->hash, sizeof(c->hash), "%s", cs->hash);
+ 
+  current->checksum = c;
+
+  reset_checksumset();
+
+}
+
+
+/*
+ * Set Perm object in the current service
+ */
+static void addperm(Perm_T ps) {
+  Perm_T p;
+
+  ASSERT(ps);
+
+  NEW(p);
+  p->perm       = ps->perm;
+  p->action     = ps->action;
+  current->perm = p;
+  reset_permset();
+
+}
+
+
+static void appendmatch(Match_T *list, Match_T item) {
+  if (*list) {
+    /* Find the end of the list (keep the same patterns order as in the config file) */
+    Match_T last;
+    for (last = *list; last->next; last = last->next)
+      ;
+    last->next = item;
+  } else {
+    *list = item;
+  }
+}
+
+
+/*
+ * Set Match object in the current service
+ */
+static void addmatch(Match_T ms, int actionnumber, int linenumber) {
+  Match_T m;
+  int     reg_return;
+  
+  ASSERT(ms);
+
+  NEW(m);
+#ifdef HAVE_REGEX_H
+  NEW(m->regex_comp);
+#endif
+
+  m->match_string = ms->match_string;
+  m->match_path   = ms->match_path ? Str_dup(ms->match_path) : NULL;
+  m->action       = ms->action;
+  m->not          = ms->not;
+  m->ignore       = ms->ignore;
+  m->next         = NULL;
+
+  addeventaction(&(m->action), actionnumber, ACTION_IGNORE);
+
+#ifdef HAVE_REGEX_H
+  reg_return = regcomp(m->regex_comp, ms->match_string, REG_NOSUB|REG_EXTENDED);
+
+  if (reg_return != 0) {
+    char errbuf[STRLEN];
+    regerror(reg_return, ms->regex_comp, errbuf, STRLEN);
+    if (m->match_path != NULL) 
+      yyerror2("regex parsing error:%s on line %i of", errbuf, linenumber);
+    else
+      yyerror2("regex parsing error:%s", errbuf);
+  }
+#endif
+  appendmatch(m->ignore ? &current->matchignorelist : &current->matchlist, m);
+}
+
+
+static void addmatchpath(Match_T ms, int actionnumber) {
+
+  FILE *handle;
+  command_t savecommand = NULL;
+  char buf[2048];
+  int linenumber = 0;
+
+  ASSERT(ms->match_path);
+
+  handle = fopen(ms->match_path, "r");
+  if (handle == NULL) {
+    yyerror2("cannot read regex match file (%s)", ms->match_path);
+    return;
+  }
+  
+  while (!feof(handle)) {
+    size_t len;
+
+    linenumber++;
+    
+    if (! fgets(buf, 2048, handle))
+      continue;
+
+    len = strlen(buf);
+
+    if (len == 0 || buf[0] == '\n')
+      continue;
+
+    if (buf[len-1] == '\n')
+      buf[len-1] = 0;
+
+    ms->match_string = Str_dup(buf);
+
+    /* The addeventaction() called from addmatch() will reset the
+     * command1 to NULL, but we need to duplicate the command for
+     * each line, thus need to save it here */
+    if (actionnumber == ACTION_EXEC) {
+      if (command1 == NULL) {
+        ASSERT(savecommand);
+        command1 = savecommand;
+      }
+      savecommand = copycommand(command1);
+    }
+
+    addmatch(ms, actionnumber, linenumber);
+  }
+
+  if (actionnumber == ACTION_EXEC && savecommand)
+    gccmd(&savecommand);
+
+  fclose(handle);
+}
+
+
+/*
+ * Set program object in the current service
+ */
+static void addprogram(Program_T program) {
+        Program_T p;
+        ASSERT(program);
+        NEW(p);
+        p->return_value = program->return_value;
+        p->operator = program->operator;
+        p->action = program->action;
+        p->timeout = program->timeout;
+        p->C = program->C;
+        current->program = p;
+        reset_programset();
+}
+
+
+/*
+ * Set Uid object in the current service
+ */
+static void adduid(Uid_T us) {
+  Uid_T u;
+
+  ASSERT(us);
+
+  NEW(u);
+  u->uid       = us->uid;
+  u->action    = us->action;
+  current->uid = u;
+  reset_uidset();
+}
+
+
+/*
+ * Set Gid object in the current service
+ */
+static void addgid(Gid_T gs) {
+  Gid_T g;
+
+  ASSERT(gs);
+
+  NEW(g);
+  g->gid       = gs->gid;
+  g->action    = gs->action;
+  current->gid = g;
+  reset_gidset();
+}
+
+
+/*
+ * Add a new filesystem to the current service's filesystem list
+ */
+static void addfilesystem(Filesystem_T ds) {
+  Filesystem_T dev;
+
+  ASSERT(ds);
+  
+  NEW(dev);
+  dev->resource           = ds->resource;
+  dev->operator           = ds->operator;
+  dev->limit_absolute     = ds->limit_absolute;
+  dev->limit_percent      = ds->limit_percent;
+  dev->action             = ds->action;
+
+  dev->next               = current->filesystemlist;
+  current->filesystemlist = dev;
+
+  reset_filesystemset();
+
+}
+
+
+/*
+ * Add a new icmp object to the current service's icmp list
+ */
+static void addicmp(Icmp_T is) {
+  Icmp_T icmp;
+
+  ASSERT(is);
+
+  NEW(icmp);
+  icmp->type         = is->type;      
+  icmp->count        = is->count;
+  icmp->timeout      = is->timeout;
+  icmp->action       = is->action;
+  icmp->is_available = FALSE;
+  icmp->response     = -1;
+  
+  icmp->next         = current->icmplist;
+  current->icmplist  = icmp;
+
+  reset_icmpset();
+}
+
+
+/*
+ * Set EventAction object
+ */
+static void addeventaction(EventAction_T *_ea, int failed, int succeeded) {
+  EventAction_T ea;
+
+  ASSERT(_ea);
+
+  NEW(ea);
+  NEW(ea->failed);
+  NEW(ea->succeeded);
+
+  ea->failed->id     = failed;
+  ea->failed->count  = rate1.count;
+  ea->failed->cycles = rate1.cycles;
+  if (failed == ACTION_EXEC) {
+    ASSERT(command1);
+    ea->failed->exec = command1;
+    command1 = NULL;
+  }
+
+  ea->succeeded->id     = succeeded;
+  ea->succeeded->count  = rate2.count;
+  ea->succeeded->cycles = rate2.cycles;
+  if (succeeded == ACTION_EXEC) {
+    ASSERT(command2);
+    ea->succeeded->exec = command2;
+    command2 = NULL;
+  }
+  *_ea = ea;
+  reset_rateset();
+}
+
+
+/*
+ * Redefine EventAction object (used for default action overloading)
+ */
+static void seteventaction(EventAction_T *_ea, int failed, int succeeded) {
+  EventAction_T ea = *_ea;
+
+  ASSERT(ea);
+  ASSERT(ea->failed);
+  ASSERT(ea->succeeded);
+
+  ea->failed->id     = failed;
+  ea->failed->count  = rate1.count;
+  ea->failed->cycles = rate1.cycles;
+  if (failed == ACTION_EXEC) {
+    ASSERT(command1);
+    ea->failed->exec = command1;
+    command1 = NULL;
+  }
+
+  ea->succeeded->id     = succeeded;
+  ea->succeeded->count  = rate2.count;
+  ea->succeeded->cycles = rate2.cycles;
+  if (succeeded == ACTION_EXEC) {
+    ASSERT(command2);
+    ea->succeeded->exec = command2;
+    command2 = NULL;
+  }
+}
+
+
+/*
+ * Add a generic protocol handler to 
+ */
+static void addgeneric(Port_T port, char *send, char *expect) {
+  Generic_T g = port->generic;
+  
+  if (g == NULL) {
+    NEW(g);
+    port->generic = g;
+  } else {
+    while (g->next != NULL)
+      g = g->next;
+    NEW(g->next);
+    g = g->next;
+  }
+  
+  if (send != NULL) {
+    g->send = Str_dup(send);
+    g->expect = NULL;
+  } else if (expect != NULL) {
+#ifdef HAVE_REGEX_H
+    
+    int   reg_return;
+    NEW(g->expect);
+    reg_return = regcomp(g->expect, expect, REG_NOSUB|REG_EXTENDED);
+    if (reg_return != 0) {
+      char errbuf[STRLEN];
+      regerror(reg_return, g->expect, errbuf, STRLEN);
+      yyerror2("regex parsing error:%s", errbuf);
+    }
+#else
+    g->expect = Str_dup(expect);
+#endif
+    g->send = NULL;
+  } 
+}
+
+
+/*
+ * Add the current command object to the current service object's
+ * start or stop program.
+ */
+static void addcommand(int what, unsigned timeout) {
+
+  switch(what) {
+          case START:   current->start = command; break;
+          case STOP:    current->stop = command; break;
+          case RESTART: current->restart = command; break;
+  }
+
+  command->timeout = timeout;
+  
+  command = NULL;
+  
+}
+
+  
+/*
+ * Add a new argument to the argument list
+ */
+static void addargument(char *argument) {
+
+  ASSERT(argument);
+
+  if (! command) {
+    
+    NEW(command);
+    check_exec(argument);
+    
+  }
+  
+  command->arg[command->length++] = argument;
+  command->arg[command->length] = NULL;
+  
+  if (command->length >= ARGMAX)
+    yyerror("exceeded maximum number of program arguments");
+  
+}
+
+
+/*
+ * Setup a url request for the current port object
+ */
+static void prepare_urlrequest(URL_T U) {
+
+  ASSERT(U);
+  
+  portset.protocol = Protocol_get(Protocol_HTTP);
+
+  if (urlrequest == NULL)
+    NEW(urlrequest);
+  urlrequest->url = U;
+  portset.hostname = Str_dup(U->hostname);
+  check_hostname(portset.hostname);
+  portset.port = U->port;
+  portset.url_request = urlrequest;
+  portset.type = SOCK_STREAM;
+  portset.request = Str_cat("%s%s%s", U->path, U->query ? "?" : "", U->query ? U->query : "");
+  /* Only the HTTP protocol is supported for URLs.
+     See also the lexer if this is to be changed in
+     the future */
+  portset.protocol = Protocol_get(Protocol_HTTP);
+  if (IS(U->protocol, "https"))
+    portset.SSL.use_ssl = TRUE;
+  
+}
+
+
+/*
+ * Set the url request for a port
+ */
+static void  seturlrequest(int operator, char *regex) {
+  
+  ASSERT(regex);
+
+  if (! urlrequest)
+    NEW(urlrequest);
+  urlrequest->operator = operator;
+#ifdef HAVE_REGEX_H
+  {    
+    int reg_return;
+    NEW(urlrequest->regex);
+    reg_return = regcomp(urlrequest->regex, regex, REG_NOSUB|REG_EXTENDED);
+    if (reg_return != 0) {
+      char errbuf[STRLEN];
+      regerror(reg_return, urlrequest->regex, errbuf, STRLEN);
+      yyerror2("regex parsing error: %s", errbuf);
+    }
+  }
+#else
+  urlrequest->regex = Str_dup(regex);
+#endif
+
+}
+
+
+/*
+ * Add a new data recipient server to the mmonit server list
+ */
+static void addmmonit(URL_T url, int timeout, int sslversion, char *certmd5) {
+  Mmonit_T c;
+  
+  ASSERT(url);
+
+  NEW(c);
+  c->url = url;
+  if (!strcmp(c->url->protocol, "https")) {
+    if (!have_ssl()) {
+      yyerror("ssl check cannot be activated. SSL is not supported");
+    } else {
+      c->ssl.use_ssl = TRUE;
+      c->ssl.version = (sslversion == SSL_VERSION_NONE) ? SSL_VERSION_AUTO : sslversion;
+      if (certmd5) {
+	c->ssl.certmd5 = certmd5;
+	cleanup_hash_string(c->ssl.certmd5);
+      }
+    }
+  }
+  c->timeout = timeout;
+  c->next = NULL;
+
+  if (Run.mmonits) {
+    Mmonit_T C;
+    for (C = Run.mmonits; C->next; C = C->next)
+      /* Empty */ ;
+    C->next = c;
+  } else {
+    Run.mmonits = c;
+  }
+}
+
+
+/*
+ * Add a new smtp server to the mail server list
+ */
+static void addmailserver(MailServer_T mailserver) {
+
+  MailServer_T s;
+  
+  ASSERT(mailserver->host);
+
+  NEW(s);
+  s->host        = mailserver->host;
+  s->port        = mailserver->port;
+  s->username    = mailserver->username;
+  s->password    = mailserver->password;
+  s->ssl.use_ssl = mailserver->ssl.use_ssl;
+  s->ssl.version = mailserver->ssl.version;
+  s->ssl.certmd5 = mailserver->ssl.certmd5;
+
+  s->next = NULL;
+
+  if (Run.mailservers) {
+    MailServer_T l;
+    for (l = Run.mailservers; l->next; l = l->next) /* empty */;
+    l->next = s;
+  } else {
+    Run.mailservers = s;
+  }
+  
+  reset_mailserverset();
+}
+
+
+/*
+ * Return uid if found on the system. If the parameter user is NULL
+ * the uid parameter is used for looking up the user id on the system,
+ * otherwise the user parameter is used.
+ */
+static uid_t get_uid(char *user, uid_t uid) {
+  struct passwd *pwd;
+
+  if (user) {
+    pwd = getpwnam(user);
+
+    if (pwd == NULL) {
+      yyerror2("requested user not found on the system");
+      return(0);
+    }
+
+  } else {
+
+    if ( (pwd = getpwuid(uid)) == NULL ) {
+      yyerror2("requested uid not found on the system");
+      return(0);
+    }
+  }
+
+  return(pwd->pw_uid);
+
+}
+
+
+/*
+ * Return gid if found on the system. If the parameter group is NULL
+ * the gid parameter is used for looking up the group id on the system,
+ * otherwise the group parameter is used.
+ */
+static gid_t get_gid(char *group, gid_t gid) {
+  struct group *grd;
+
+  if (group) {
+    grd = getgrnam(group);
+
+    if (grd == NULL) {
+      yyerror2("requested group not found on the system");
+      return(0);
+    }
+
+  } else {
+
+    if ( (grd = getgrgid(gid)) == NULL ) {
+      yyerror2("requested gid not found on the system");
+      return(0);
+    }
+
+  }
+
+  return(grd->gr_gid);
+
+}
+
+
+/*
+ * Add a new user id to the current command object.
+ */
+static void addeuid(uid_t uid) {
+  if (!getuid()) {
+    command->has_uid = TRUE;
+    command->uid = uid;
+  } else
+    yyerror("uid statement requires root privileges");
+}
+
+
+/*
+ * Add a new group id to the current command object.
+ */
+static void addegid(gid_t gid) {
+  if (!getuid()) {
+    command->has_gid = TRUE;
+    command->gid = gid;
+  } else
+    yyerror("gid statement requires root privileges");
+}
+
+
+/*
+ * Reset the logfile if changed
+ */
+static void setlogfile(char *logfile) {
+  if (Run.logfile) {
+    if (IS(Run.logfile, logfile)) {
+      FREE(logfile);
+      return;
+    } else
+      FREE(Run.logfile);
+  }
+  Run.logfile = logfile;
+}
+
+
+/*
+ * Reset the pidfile if changed
+ */
+static void setpidfile(char *pidfile) {
+  if (Run.pidfile) {
+    if (IS(Run.pidfile, pidfile)) {
+      FREE(pidfile);
+      return;
+    } else
+      FREE(Run.pidfile);
+  }
+  Run.pidfile = pidfile;
+}
+
+
+/*
+ * Read a apache htpasswd file and add credentials found for username
+ */
+static void addhtpasswdentry(char *filename, char *username, int dtype) {
+  char *ht_username = NULL;
+  char *ht_passwd = NULL;
+  char buf[STRLEN];
+  FILE *handle = NULL;
+  int credentials_added = 0;
+  
+  ASSERT(filename);
+
+  handle = fopen(filename, "r");
+
+  if ( handle == NULL ) {
+    if (username != NULL)
+      yyerror2("cannot read htpasswd (%s)", filename);
+    else
+      yyerror2("cannot read htpasswd", filename);
+    return;
+  }
+  
+  while (!feof(handle)) {
+    char *colonindex = NULL;
+    int i;
+    
+    if (! fgets(buf, STRLEN, handle))
+      continue;
+
+    /* strip trailing non visible characters */
+    for (i = (int)strlen(buf)-1; i >= 0; i--) {
+      if ( buf[i] == ' '  || buf[i] == '\r' || buf[i] == '\n' || buf[i] == '\t' )
+        buf[i] ='\0';
+      else
+        break;
+    }
+
+    if ( NULL == (colonindex = strchr(buf, ':')))
+      continue;
+
+    ht_passwd = Str_dup(colonindex+1);
+    *colonindex = '\0';
+
+    /* In case we have a file in /etc/passwd or /etc/shadow style we
+     *  want to remove ":.*$" and Crypt and MD5 hashed dont have a colon
+     */ 
+    
+    if ( (NULL != (colonindex = strchr(ht_passwd, ':'))) && ( dtype != DIGEST_CLEARTEXT) )
+      *colonindex = '\0';
+
+    ht_username = Str_dup(buf);
+
+    if (username == NULL) {
+      if (addcredentials(ht_username, ht_passwd, dtype, FALSE))
+        credentials_added++;
+    } else if (strcmp(username, ht_username) == 0)  {
+      if (addcredentials(ht_username, ht_passwd, dtype, FALSE))
+        credentials_added++;
+    } else {
+      FREE(ht_passwd);
+      FREE(ht_username);
+    }
+  }
+
+  if (credentials_added == 0) {
+    if ( username == NULL )
+      yywarning2("htpasswd file (%s) has no usable credentials", filename);
+    else
+      yywarning2("htpasswd file (%s) has no usable credentials for user %s", filename, username);
+  }
+  fclose(handle);
+}
+
+
+#ifdef HAVE_LIBPAM
+static void addpamauth(char* groupname, int readonly) {
+  Auth_T c = NULL;
+  Auth_T prev = NULL;
+
+  ASSERT(groupname);
+
+  if (Run.credentials == NULL)
+    NEW(Run.credentials);
+
+  c = Run.credentials;
+  do {
+    if (c->groupname != NULL && IS(c->groupname, groupname)) {
+      yywarning2("PAM group %s was added already, entry ignored", groupname);
+      FREE(groupname);
+      return;
+    }
+    prev = c;
+    c = c->next;
+  } while (c != NULL);
+
+  NEW(prev->next);
+  c = prev->next;
+
+  c->next        = NULL;
+  c->uname       = NULL;
+  c->passwd      = NULL;
+  c->groupname   = groupname;
+  c->digesttype  = DIGEST_PAM;
+  c->is_readonly = readonly;
+  
+  DEBUG("%s: Adding PAM group '%s'.\n", prog, groupname); 
+
+  return;
+}
+#endif
+
+
+/*
+ * Add Basic Authentication credentials
+ */
+static int addcredentials(char *uname, char *passwd, int dtype, int readonly) {
+  Auth_T c;
+
+  ASSERT(uname);
+  ASSERT(passwd);
+
+  if (Run.credentials == NULL) {
+    NEW(Run.credentials);
+    c = Run.credentials;
+  } else {
+
+    if (Util_getUserCredentials(uname) != NULL) {
+      yywarning2("credentials for user %s were already added, entry ignored", uname);
+      FREE(uname);
+      FREE(passwd);
+      return FALSE;
+    }
+
+    c = Run.credentials;
+
+    while ( c->next != NULL )
+      c = c->next;
+
+    NEW(c->next);
+    c = c->next;
+        
+  }
+  
+  c->next        = NULL;
+  c->uname       = uname;
+  c->passwd      = passwd;
+  c->groupname   = NULL;
+  c->digesttype  = dtype;
+  c->is_readonly = readonly;
+  
+  DEBUG("%s: Debug: Adding credentials for user '%s'.\n", prog, uname); 
+  
+  return TRUE;
+  
+}
+
+
+/*
+ * Set the syslog and the facilities to be used
+ */
+static void setsyslog(char *facility) {
+
+  if (!Run.logfile || ihp.logfile) {
+    ihp.logfile = TRUE;
+    setlogfile(Str_dup("syslog"));
+    Run.use_syslog = TRUE;
+    Run.dolog = TRUE;
+  }
+
+  if (facility) {
+    if (IS(facility,"log_local0"))
+      Run.facility = LOG_LOCAL0;
+    else if (IS(facility, "log_local1"))
+      Run.facility = LOG_LOCAL1;
+    else if (IS(facility, "log_local2"))
+      Run.facility = LOG_LOCAL2;
+    else if (IS(facility, "log_local3"))
+      Run.facility = LOG_LOCAL3;
+    else if (IS(facility, "log_local4"))
+      Run.facility = LOG_LOCAL4;
+    else if (IS(facility, "log_local5"))
+      Run.facility = LOG_LOCAL5;
+    else if (IS(facility, "log_local6"))
+      Run.facility = LOG_LOCAL6;
+    else if (IS(facility, "log_local7"))
+      Run.facility = LOG_LOCAL7;
+    else if (IS(facility, "log_daemon"))
+      Run.facility = LOG_DAEMON;
+    else
+      yyerror2("invalid syslog facility");
+  } else {
+    Run.facility = LOG_USER;
+  }
+  
+}
+
+
+/*
+ * Reset the current mailset for reuse
+ */
+static void reset_mailset() {
+  memset(&mailset, 0, sizeof(struct mymail));
+}
+
+
+/*
+ * Reset the mailserver set to default values
+ */
+static void reset_mailserverset() {
+  memset(&mailserverset, 0, sizeof(struct mymailserver));
+  mailserverset.port = PORT_SMTP;
+  mailserverset.ssl.use_ssl = FALSE;
+  mailserverset.ssl.version = SSL_VERSION_AUTO;
+}
+
+
+/*
+ * Reset the Port set to default values
+ */
+static void reset_portset() {
+  memset(&portset, 0, sizeof(struct myport));
+  portset.socket = -1;
+  portset.type = SOCK_STREAM;
+  portset.family = AF_INET;
+  portset.SSL.version = SSL_VERSION_AUTO;
+  portset.timeout = NET_TIMEOUT;
+  portset.retry = 1;
+  portset.maxforward = 70;
+  urlrequest = NULL;
+}
+
+
+/*
+ * Reset the Proc set to default values
+ */
+static void reset_resourceset() {
+  resourceset.resource_id = 0;
+  resourceset.limit = 0;
+  resourceset.action = NULL;
+  resourceset.operator = OPERATOR_EQUAL;
+}
+
+
+/*
+ * Reset the Timestamp set to default values
+ */
+static void reset_timestampset() {
+  timestampset.operator = OPERATOR_EQUAL;
+  timestampset.time = 0;
+  timestampset.test_changes = FALSE;
+  timestampset.action = NULL;
+}
+
+
+/*
+ * Reset the ActionRate set to default values
+ */
+static void reset_actionrateset() {
+  actionrateset.count = 0;
+  actionrateset.cycle = 0;
+  actionrateset.action = NULL;
+}
+
+
+/*
+ * Reset the Size set to default values
+ */
+static void reset_sizeset() {
+  sizeset.operator = OPERATOR_EQUAL;
+  sizeset.size = 0;
+  sizeset.test_changes = FALSE;
+  sizeset.action = NULL;
+}
+
+
+/*
+ * Reset the Uptime set to default values
+ */
+static void reset_uptimeset() {
+  uptimeset.operator = OPERATOR_EQUAL;
+  uptimeset.uptime = 0;
+  uptimeset.action = NULL;
+}
+
+
+/*
+ * Reset the Checksum set to default values
+ */
+static void reset_checksumset() {
+  checksumset.type         = HASH_UNKNOWN;
+  checksumset.test_changes = FALSE;
+  checksumset.action       = NULL;
+  *checksumset.hash        = 0;
+}
+
+
+/*
+ * Reset the Perm set to default values
+ */
+static void reset_permset() {
+  permset.perm = 0;
+  permset.action = NULL;
+}
+
+
+/*
+ * Reset the Status set to default values
+ */
+static void reset_programset() {
+        programset.return_value = 0;
+        programset.operator = OPERATOR_EQUAL;
+        programset.action = NULL;
+        programset.timeout = EXEC_TIMEOUT;
+        programset.started = 0;
+        programset.P = NULL;
+        programset.C = NULL;
+}
+
+
+/*
+ * Reset the Uid set to default values
+ */
+static void reset_uidset() {
+  uidset.uid = 0;
+  uidset.action = NULL;
+}
+
+
+/*
+ * Reset the Gid set to default values
+ */
+static void reset_gidset() {
+  gidset.gid = 0;
+  gidset.action = NULL;
+}
+
+
+/*
+ * Reset the Filesystem set to default values
+ */
+static void reset_filesystemset() {
+  filesystemset.resource = 0;
+  filesystemset.operator = OPERATOR_EQUAL;
+  filesystemset.limit_absolute = -1;
+  filesystemset.limit_percent = -1;
+  filesystemset.action = NULL;
+}
+
+
+/*
+ * Reset the ICMP set to default values
+ */
+static void reset_icmpset() {
+  icmpset.type = ICMP_ECHO;
+  icmpset.count = ICMP_ATTEMPT_COUNT;
+  icmpset.timeout = NET_TIMEOUT;
+  icmpset.action = NULL;
+}
+
+
+/*
+ * Reset the Rate set to default values
+ */
+static void reset_rateset() {
+  rate1.count  = 1;
+  rate1.cycles = 1;
+
+  rate2.count  = 1;
+  rate2.cycles = 1;
+}
+
+
+/* ---------------------------------------------------------------- Checkers */
+
+
+/*
+ * Check for unique service name
+ */
+static void check_name(char *name) {
+  ASSERT(name);
+
+  if (Util_existService(name) || (current && IS(name, current->name)))
+    yyerror2("service name conflict, %s already defined", name);
+  if (name && *name == '/')		
+          yyerror2("service name '%s' must not start with '/' -- ", name);	
+}
+
+
+/*
+ * Permission statement semantic check
+ */
+static int check_perm(int perm) {
+  int result;
+  char *status;
+  char buf[STRLEN];
+
+  snprintf(buf, STRLEN, "%d", perm);
+
+  result = (int)strtol(buf, &status, 8);
+
+  if ( *status != '\0' || result < 0 || result > 07777 )
+    yyerror2("permission statements must have an octal value between 0 and 7777");
+
+  return result;
+}
+
+
+/*
+ * Check hostname 
+ */
+static void check_hostname(char *hostname) {
+
+  ASSERT(hostname);
+
+  if (!check_host(hostname))
+    yywarning2("hostname did not resolve");
+}
+
+/*
+ * Check the dependency graph for errors
+ * by doing a topological sort, thereby finding any cycles.
+ * Assures that graph is a Directed Acyclic Graph (DAG).
+ */
+static void check_depend() {
+  Service_T s;
+  Service_T depends_on = NULL;
+  Service_T* dlt = &depend_list; /* the current tail of it                                 */
+  int done;                      /* no unvisited nodes left?                               */
+  int found_some;                /* last iteration found anything new ?                    */
+  depend_list = NULL;            /* depend_list will be the topological sorted servicelist */
+
+  do { 
+    done = TRUE;
+    found_some = FALSE; 
+    for (s = servicelist; s; s = s->next) {
+        Dependant_T d;
+      if (s->visited)
+	  continue;
+      done = FALSE; // still unvisited nodes
+      depends_on = NULL;
+      for (d = s->dependantlist; d; d = d->next) {
+        Service_T dp = Util_getService(d->dependant);
+        if (!dp) {
+          LogError("%s: Error: Depend service '%s' is not defined in the control file\n", prog, d->dependant);
+          exit(1);
+        }
+        if (!dp->visited) {
+          depends_on = dp;
+        }
+      }
+
+      if (!depends_on) {
+        s->visited = TRUE;
+        found_some = TRUE;
+        *dlt = s;
+        dlt = &s->next_depend;
+      }
+    }
+  } while (found_some && !done);
+	
+  if (!done) {
+        ASSERT(depends_on);
+	LogError("%s: Error: Found a depend loop in the control file involving the service '%s'\n", prog, depends_on->name);
+	exit(1);
+   } 
+
+  ASSERT(depend_list);
+  servicelist = depend_list;
+    
+  for (s = depend_list; s; s = s->next_depend)
+    s->next = s->next_depend;
+    
+  reset_depend();
+}
+
+
+/*
+ * Check if the executable exist
+ */
+static void check_exec(char *exec) {
+        if (! File_exist(exec))
+                yywarning2("Program does not exist:");
+        else if (! File_isExecutable(exec))
+                yywarning2("Program is not executable:");
+}
+ 
+ 
+/* Return a valid max forward value for SIP header */
+static int verifyMaxForward(int mf) { 
+  int max = 70;
+  
+  if (mf >= 0 && mf <= 255)
+    max = mf;
+  else
+    yywarning2("SIP max forward is outside the range [0..255]. Setting max forward to 70");
+  
+  return max;
+}
+
+
+/* -------------------------------------------------------------------- Misc */
+
+
+/*
+ * Cleans up an md5 string, tolower and remove byte separators
+ */
+static int cleanup_hash_string(char *hashstring) {
+  int i = 0, j = 0;
+
+  ASSERT(hashstring);
+
+  while (hashstring[i] != '\0') {
+    if (isxdigit((int) hashstring[i])) {
+      hashstring[j] = tolower((int)hashstring[i]);
+      j++;
+    } 
+    i++;
+  }
+  hashstring[j] = '\0';
+  return j;
+}
+
+
+/* Return deep copy of the command */
+static command_t copycommand(command_t source) {
+  int i;
+  command_t copy = NULL;
+
+  NEW(copy);
+  copy->length = source->length;
+  copy->has_uid = source->has_uid;
+  copy->uid = source->uid;
+  copy->has_gid = source->has_gid;
+  copy->gid = source->gid;
+  copy->timeout = source->timeout;
+  for (i = 0; i < copy->length; i++)
+     copy->arg[i] = Str_dup(source->arg[i]);
+  copy->arg[copy->length] = NULL;
+
+  return copy;
+}
+
diff --git a/monit-5.4/src/process.c b/monit-5.4/src/process.c
new file mode 100644
index 0000000..040972a
--- /dev/null
+++ b/monit-5.4/src/process.c
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <stdio.h>
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+/**
+ *  General purpose /proc methods.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Initialize the proc information code
+ * @return TRUE if succeeded otherwise FALSE.
+ */
+int init_process_info(void) {
+  memset(&systeminfo, 0, sizeof(SystemInfo_T));
+  gettimeofday(&systeminfo.collected, NULL);
+  if(uname(&systeminfo.uname) < 0) {
+    LogError("'%s' resource monitoring initialization error -- uname failed: %s\n", Run.system->name, STRERROR);
+    return FALSE;
+  }
+
+  systeminfo.total_cpu_user_percent = -10;
+  systeminfo.total_cpu_syst_percent = -10;
+  systeminfo.total_cpu_wait_percent = -10;
+
+  return (init_process_info_sysdep());
+
+}
+
+
+/**
+ * Get the proc infomation (CPU percentage, MEM in MByte and percent,
+ * status), enduser version. 
+ * @param p A Service object
+ * @param pid The process id
+ * @return TRUE if succeeded otherwise FALSE.
+ */
+int update_process_data(Service_T s, ProcessTree_T *pt, int treesize, pid_t pid) {
+  int leaf;
+
+  ASSERT(s);
+  ASSERT(systeminfo.mem_kbyte_max > 0);
+
+  /* save the previous pid and set actual one */
+  s->inf->priv.process._pid = s->inf->priv.process.pid;
+  s->inf->priv.process.pid  = pid;
+
+  if ((leaf = findprocess(pid, pt, treesize)) != -1) {
+ 
+    /* save the previous ppid and set actual one */
+    s->inf->priv.process._ppid             = s->inf->priv.process.ppid;
+    s->inf->priv.process.ppid              = pt[leaf].ppid;
+    s->inf->priv.process.uptime            = time(NULL) - pt[leaf].starttime;
+    s->inf->priv.process.children          = pt[leaf].children_sum;
+    s->inf->priv.process.mem_kbyte         = pt[leaf].mem_kbyte;
+    s->inf->priv.process.status_flag       = pt[leaf].status_flag;
+    s->inf->priv.process.total_mem_kbyte   = pt[leaf].mem_kbyte_sum;
+    s->inf->priv.process.cpu_percent       = pt[leaf].cpu_percent;
+    s->inf->priv.process.total_cpu_percent = pt[leaf].cpu_percent_sum;
+
+    if (systeminfo.mem_kbyte_max == 0) {
+      s->inf->priv.process.total_mem_percent = 0;
+      s->inf->priv.process.mem_percent       = 0;
+    } else {
+      s->inf->priv.process.total_mem_percent = (int)((double)pt[leaf].mem_kbyte_sum * 1000.0 / systeminfo.mem_kbyte_max);
+      s->inf->priv.process.mem_percent       = (int)((double)pt[leaf].mem_kbyte * 1000.0 / systeminfo.mem_kbyte_max);
+    }
+
+  } else {
+    s->inf->priv.process.ppid              = 0;
+    s->inf->priv.process.uptime            = 0;
+    s->inf->priv.process.children          = 0;
+    s->inf->priv.process.total_mem_kbyte   = 0;
+    s->inf->priv.process.total_mem_percent = 0;
+    s->inf->priv.process.mem_kbyte         = 0;
+    s->inf->priv.process.mem_percent       = 0;
+    s->inf->priv.process.cpu_percent       = 0;
+    s->inf->priv.process.total_cpu_percent = 0;
+  }
+  
+  return TRUE;
+}
+
+
+/**
+ * Updates the system wide statistic
+ * @return TRUE if successful, otherwise FALSE
+ */
+int update_system_load() {
+
+  if (Run.doprocess) {
+
+    ASSERT(systeminfo.mem_kbyte_max > 0);
+
+    /** Get load average triplet */
+    if (-1 == getloadavg_sysdep(systeminfo.loadavg, 3)) {
+      LogError("'%s' statistic error -- load average gathering failed\n", Run.system->name);
+      goto error1;
+    }
+
+    /** Get memory usage statistic */
+    if (! used_system_memory_sysdep(&systeminfo)) {
+      LogError("'%s' statistic error -- memory usage gathering failed\n", Run.system->name);
+      goto error2;
+    }
+    systeminfo.total_mem_percent  = (int)(1000 * (double)systeminfo.total_mem_kbyte / (double)systeminfo.mem_kbyte_max);
+    systeminfo.total_swap_percent = systeminfo.swap_kbyte_max ? (int)(1000 * (double)systeminfo.total_swap_kbyte / (double)systeminfo.swap_kbyte_max) : 0;
+
+    /** Get CPU usage statistic */
+    if (! used_system_cpu_sysdep(&systeminfo)) {
+      LogError("'%s' statistic error -- cpu usage gathering failed\n", Run.system->name);
+      goto error3;
+    }
+
+    return TRUE;
+  }
+
+error1:
+  systeminfo.loadavg[0] = 0;
+  systeminfo.loadavg[1] = 0;
+  systeminfo.loadavg[2] = 0;
+error2:
+  systeminfo.total_mem_kbyte   = 0;
+  systeminfo.total_mem_percent = 0;
+error3:
+  systeminfo.total_cpu_user_percent = 0;
+  systeminfo.total_cpu_syst_percent = 0;  
+  systeminfo.total_cpu_wait_percent = 0;  
+
+  return FALSE;
+}
+
+
+/**
+ * Initialize the process tree 
+ * @return treesize >= 0 if succeeded otherwise < 0
+ */
+int initprocesstree(ProcessTree_T **pt_r, int *size_r, ProcessTree_T **oldpt_r, int *oldsize_r) {
+  int i;
+  int oldentry;
+  ProcessTree_T *pt;
+  ProcessTree_T *oldpt;
+  int root = -1;
+
+  if (*pt_r != NULL) {  
+    if (oldpt_r && *oldpt_r != NULL)
+      delprocesstree(oldpt_r, oldsize_r);
+    *oldpt_r   = *pt_r; 
+    *oldsize_r = *size_r; 
+  }
+  
+  if ((*size_r = initprocesstree_sysdep(pt_r)) <= 0) {
+    DEBUG("system statistic error -- cannot initialize the process tree => process resource monitoring disabled\n");
+    Run.doprocess = FALSE;
+    return -1;
+  } else if (Run.doprocess == FALSE) {
+    DEBUG("system statistic -- initialization of the process tree succeeded => process resource monitoring enabled\n");
+    Run.doprocess = TRUE;
+  }
+
+  pt    = *pt_r;
+  oldpt = *oldpt_r;
+
+  if (pt == NULL)
+    return 0;
+
+  for (i = 0; i < (volatile int)*size_r; i ++) {
+    if (oldpt && ((oldentry = findprocess(pt[i].pid, oldpt, *oldsize_r)) != -1)) {
+      pt[i].cputime_prev = oldpt[oldentry].cputime;
+      pt[i].time_prev    = oldpt[oldentry].time;
+ 
+      /* The cpu_percent may be set already (for example by HPUX module) */
+      if (pt[i].cpu_percent  == 0 && pt[i].cputime_prev != 0 && pt[i].cputime != 0 && pt[i].cputime > pt[i].cputime_prev) {
+        pt[i].cpu_percent = (int)((1000 * (double)(pt[i].cputime - pt[i].cputime_prev) / (pt[i].time - pt[i].time_prev)) / systeminfo.cpus);
+        if (pt[i].cpu_percent > 1000)
+          pt[i].cpu_percent = 1000;
+      }
+    } else {
+      pt[i].cputime_prev = 0;
+      pt[i].time_prev    = 0.0;
+      pt[i].cpu_percent  = 0;
+    }
+        
+    if (pt[i].pid == pt[i].ppid) {
+      pt[i].parent = i;
+      continue;
+    }
+
+    if ((pt[i].parent = findprocess(pt[i].ppid, pt, *size_r)) == -1) {
+      /* Parent process wasn't found - on Linux this is normal: main process with PID 0 is not listed, similarly in FreeBSD jail.
+       * We create virtual process entry for missing parent so we can have full tree-like structure with root. */
+      int j = (*size_r)++;
+
+      pt = RESIZE(*pt_r, *size_r * sizeof(ProcessTree_T));
+      memset(&pt[j], 0, sizeof(ProcessTree_T));
+      pt[j].ppid = pt[j].pid  = pt[i].ppid;
+      pt[i].parent = j;
+    }
+    
+    if (! connectchild(pt, pt[i].parent, i)) {
+      /* connection to parent process has failed, this is usually caused in the part above */
+      DEBUG("system statistic error -- cannot connect process id %d to its parent %d\n", pt[i].pid, pt[i].ppid);
+      pt[i].pid = 0;
+      continue;
+    }
+  }
+
+  /* The main process in Solaris zones and FreeBSD host doesn't have pid 1, so try to find process which is parent of itself */
+  for (i = 0; i < *size_r; i++) {
+    if (pt[i].pid == pt[i].ppid) {
+      root = i;
+      break;
+    }
+  }
+
+  if (root == -1) {
+    DEBUG("system statistic error -- cannot find root process id\n");
+    return -1;
+  }
+
+  fillprocesstree(pt, root);
+
+  return *size_r;
+}
+
+
+/**
+ * Search a leaf in the processtree
+ * @param pid  pid of the process
+ * @param pt  processtree
+ * @param treesize  size of the processtree
+ * @return process index if succeeded otherwise -1
+ */
+int findprocess(int pid, ProcessTree_T *pt, int size) {
+  int i;
+
+  ASSERT(pt);
+
+  if (size <= 0)
+    return -1;
+
+  for (i = 0; i < size; i++)
+    if (pid == pt[i].pid)
+      return i;
+
+  return -1;
+}
+
+/**
+ * Delete the process tree 
+ */
+void delprocesstree(ProcessTree_T **reference, int *size) {
+  int i;
+  ProcessTree_T *pt = *reference;
+  if (pt) {
+    for (i = 0; i < *size; i++) {
+      FREE(pt[i].cmdline);
+      FREE(pt[i].children);
+    }
+    FREE(pt);
+    *reference = NULL;
+    *size = 0;
+  }
+  return;
+}
+
+
+void process_testmatch(char *pattern) {
+#ifdef HAVE_REGEX_H
+  regex_t *regex_comp;
+  int reg_return;
+#endif
+
+#ifdef HAVE_REGEX_H
+  NEW(regex_comp);
+  if ((reg_return = regcomp(regex_comp, pattern, REG_NOSUB|REG_EXTENDED))) {
+    char errbuf[STRLEN];
+    regerror(reg_return, regex_comp, errbuf, STRLEN);
+    regfree(regex_comp);
+    FREE(regex_comp);
+    printf("Regex %s parsing error: %s\n", pattern, errbuf);
+    exit(1);
+  }
+#endif
+  initprocesstree(&ptree, &ptreesize, &oldptree, &oldptreesize);
+  if (Run.doprocess) {
+    int i, count = 0;
+    printf("List of processes matching pattern \"%s\":\n", pattern);
+    printf("------------------------------------------\n");
+    for (i = 0; i < ptreesize; i++) {
+      int match = FALSE;
+      if (ptree[i].cmdline && ! strstr(ptree[i].cmdline, "procmatch")) {
+#ifdef HAVE_REGEX_H
+        match = regexec(regex_comp, ptree[i].cmdline, 0, NULL, 0) ? FALSE : TRUE;
+#else
+        match = strstr(ptree[i].cmdline, pattern) ? TRUE : FALSE;
+#endif
+        if (match) {
+          printf("\t%s\n", ptree[i].cmdline);
+          count++;
+        }
+      }
+    }
+    printf("------------------------------------------\n");
+    printf("Total matches: %d\n", count);
+    if (count > 1)
+      printf("WARNING: multiple processes matched the pattern. The check is FIRST-MATCH based, please refine the pattern\n");
+  }
+}
+
+
diff --git a/monit-5.4/src/process.h b/monit-5.4/src/process.h
new file mode 100644
index 0000000..0022434
--- /dev/null
+++ b/monit-5.4/src/process.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MONIT_PROCESS_H
+#define MONIT_PROCESS_H
+
+#include "config.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#define PROCESS_ZOMBIE        1
+
+int update_process_data(Service_T s, ProcessTree_T *, int treesize, pid_t pid);
+int init_process_info(void);
+int update_system_load();
+int  findprocess(int, ProcessTree_T *, int);
+int  initprocesstree(ProcessTree_T **, int *, ProcessTree_T **, int *);
+void delprocesstree(ProcessTree_T **, int *);
+void process_testmatch(char *);
+
+#endif
+
diff --git a/monit-5.4/src/process/process_common.c b/monit-5.4/src/process/process_common.c
new file mode 100644
index 0000000..921cd4b
--- /dev/null
+++ b/monit-5.4/src/process/process_common.c
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+/**
+ *  System independent /proc & kvm methods.
+ *
+ *  @file
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_LOADAVG_H
+#include <sys/loadavg.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ * Reads an process dependent entry or the proc filesystem
+ * @param buf buffer to write to
+ * @param buf_size size of buffer "buf"
+ * @param name name of proc service
+ * @param pid number of the process / or <0 if main directory
+ * @param bytes_read number of bytes read to buffer
+ * @return TRUE if succeeded otherwise FALSE.
+ */
+int read_proc_file(char *buf, int buf_size, char *name, int pid, int *bytes_read) {
+        int fd;
+        char filename[STRLEN];
+        int bytes;
+        int rv = FALSE;
+        
+        ASSERT(buf);
+        ASSERT(name);
+        
+        if (pid < 0)
+                snprintf(filename, STRLEN, "/proc/%s", name);
+        else
+                snprintf(filename, STRLEN, "/proc/%d/%s", pid, name);
+        
+        if ((fd = open(filename, O_RDONLY)) < 0) {
+                DEBUG("%s: Cannot open proc file %s -- %s\n", prog, filename, STRERROR);
+                return rv;
+        }
+        
+        if ((bytes = (int)read(fd, buf, buf_size-1)) < 0) {
+                DEBUG("%s: Cannot read proc file %s -- %s\n", prog, filename, STRERROR);
+                goto error;
+        }
+        if (bytes_read)
+                *bytes_read = bytes;
+        
+        /* In case it is a string we have to 0 terminate it our self */
+        buf[bytes]='\0';
+        rv = TRUE;
+        
+error:
+        if (close(fd) < 0)
+                LogError("%s: Socket close failed -- %s\n", prog, STRERROR);
+        
+        return rv;
+}
+
+/**
+ * Get the actual time as a floating point number
+ * @return time in seconds
+ */
+double get_float_time(void) {    
+        struct timeval t;
+        
+        gettimeofday(&t, NULL);
+        return (double) t.tv_sec * 10 + (double) t.tv_usec / 100000.0;
+}
+
+
+/**
+ * Connects child and parent in a process tree
+ * @param pt process tree
+ * @param parent index
+ * @param child index
+ * @return TRUE if succeeded otherwise FALSE.
+ */
+int connectchild(ProcessTree_T *pt, int parent, int child) {
+        
+        ASSERT(pt);
+        
+        if (pt[parent].pid == pt[child].pid)
+                return FALSE;
+        RESIZE(pt[parent].children, sizeof(ProcessTree_T *) * (pt[parent].children_num + 1));
+        pt[parent].children[pt[parent].children_num] = child;
+        pt[parent].children_num++;
+        
+        return TRUE;
+}
+
+
+/**
+ * Fill data in the process tree by recusively walking through it
+ * @param pt process tree
+ * @param i process index
+ * @return TRUE if succeeded otherwise FALSE.
+ */
+void fillprocesstree(ProcessTree_T *pt, int index) {
+        int            i;
+        ProcessTree_T *parent_pt;
+        
+        ASSERT(pt);
+        
+        if (pt[index].visited == 1)
+                return;
+        
+        pt[index].visited         = 1;
+        pt[index].children_sum    = pt[index].children_num;
+        pt[index].mem_kbyte_sum   = pt[index].mem_kbyte;
+        pt[index].cpu_percent_sum = pt[index].cpu_percent;
+        
+        for (i = 0; i < pt[index].children_num; i++)
+                fillprocesstree(pt, pt[index].children[i]);
+        
+        if (pt[index].parent != -1 && pt[index].parent != index) {
+                parent_pt                   = &pt[pt[index].parent];
+                parent_pt->children_sum    += pt[index].children_sum;
+                parent_pt->mem_kbyte_sum   += pt[index].mem_kbyte_sum;
+                parent_pt->cpu_percent_sum += pt[index].cpu_percent_sum;
+                parent_pt->cpu_percent_sum  = (pt[index].cpu_percent_sum > 1000) ? 1000 : parent_pt->cpu_percent_sum;
+        } 
+}
+
diff --git a/monit-5.4/src/process/process_sysdep.h b/monit-5.4/src/process/process_sysdep.h
new file mode 100644
index 0000000..c0b8533
--- /dev/null
+++ b/monit-5.4/src/process/process_sysdep.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef MONIT_PROCESS_SYSDEP_H
+#define MONIT_PROCESS_SYSDEP_H
+
+int init_process_info_sysdep(void);
+int init_proc_info_sysdep(void);
+
+int read_proc_file(char *, int, char *, int, int *);
+int getloadavg_sysdep (double *, int);
+int used_system_memory_sysdep(SystemInfo_T *);
+int used_system_cpu_sysdep(SystemInfo_T *);
+
+double get_float_time(void);
+
+int    initprocesstree_sysdep(ProcessTree_T **);
+void   fillprocesstree(ProcessTree_T *, int);
+
+int    connectchild(ProcessTree_T *, int, int);
+
+
+#endif
diff --git a/monit-5.4/src/process/sysdep_AIX.c b/monit-5.4/src/process/sysdep_AIX.c
new file mode 100644
index 0000000..0908cbe
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_AIX.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#include "monit.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_PROCINFO_H
+#include <procinfo.h>
+#endif
+ 
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_PROC_H
+#include <sys/proc.h>
+#endif
+
+#ifdef HAVE_SYS_PROCFS_H
+#include <sys/procfs.h>
+#endif
+
+#ifdef HAVE_CF_H
+#include <cf.h>
+#endif
+
+#ifdef HAVE_SYS_CFGODM_H
+#include <sys/cfgodm.h>
+#endif
+
+#ifdef HAVE_SYS_CFGDB_H
+#include <sys/cfgdb.h>
+#endif
+
+#ifdef HAVE_SYS_SYSTEMCFG_H
+#include <sys/systemcfg.h>
+#endif
+
+#ifdef HAVE_SYS_PROC_H
+#include <sys/proc.h>
+#endif
+
+#ifdef HAVE_SYS_PROTOSW_H
+#include <sys/protosw.h>
+#endif
+
+#ifdef HAVE_LIBPERFSTAT_H
+#include <sys/protosw.h>
+#include <libperfstat.h>
+#endif
+
+#include "process.h"
+#include "process_sysdep.h"
+
+/**
+ *  System dependent resource gathering code for AIX
+ *
+ *  @file
+ */
+
+/* There is no prototype for getprocs64 in AIX <= 5.3 */
+int getprocs64(void *, int, void *, int, pid_t *, int);
+
+static int                page_size;
+static int                cpu_initialized = 0;
+static unsigned long long cpu_total_old = 0ULL;
+static unsigned long long cpu_user_old  = 0ULL;
+static unsigned long long cpu_syst_old  = 0ULL;
+static unsigned long long cpu_wait_old  = 0ULL;
+
+struct procentry64 *procs = NULL;
+
+
+int init_process_info_sysdep(void) {
+  perfstat_memory_total_t mem;
+
+  if (perfstat_memory_total(NULL, &mem, sizeof(perfstat_memory_total_t), 1) < 1) {
+    LogError("system statistic error -- perfstat_memory_total failed: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  page_size                = getpagesize();
+  systeminfo.mem_kbyte_max = (unsigned long)(mem.real_total * (page_size / 1024));
+  systeminfo.cpus          = sysconf(_SC_NPROCESSORS_ONLN);
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  perfstat_cpu_total_t cpu;
+
+  if (perfstat_cpu_total(NULL, &cpu, sizeof(perfstat_cpu_total_t), 1) < 1) {
+      LogError("system statistic error -- perfstat_cpu_total failed: %s\n", STRERROR);
+      return -1;
+  }
+      
+  switch (nelem) {
+    case 3:
+      loadv[2] = (double)cpu.loadavg[2] / (double)(1<<SBITS);
+
+    case 2:
+      loadv[1] = (double)cpu.loadavg[1] / (double)(1<<SBITS);
+
+    case 1:
+      loadv[0] = (double)cpu.loadavg[0] / (double)(1<<SBITS);
+  }
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the process tree
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+  int             i;
+  int             treesize;
+  struct userinfo user;
+  ProcessTree_T  *pt;
+  pid_t           firstproc = 0;
+
+  memset(&user, 0, sizeof(struct userinfo));
+
+  if ((treesize = getprocs64(NULL, 0, NULL, 0, &firstproc, PID_MAX)) < 0) {
+    LogError("system statistic error -- getprocs64 failed: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  procs = CALLOC(sizeof(struct procentry64), treesize);
+
+  firstproc = 0;
+  if ((treesize = getprocs64(procs, sizeof(struct procentry64), NULL, 0, &firstproc, treesize)) < 0) {
+    FREE(procs);
+    LogError("system statistic error -- getprocs64 failed: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  for (i = 0; i < treesize; i++) {
+    int fd;
+    struct psinfo ps;
+    char filename[STRLEN];
+
+    pt[i].cputime     = 0;
+    pt[i].cpu_percent = 0;
+    pt[i].mem_kbyte   = 0;
+    pt[i].pid         = procs[i].pi_pid;
+    pt[i].ppid        = procs[i].pi_ppid;
+    pt[i].starttime   = procs[i].pi_start;
+
+    if (procs[i].pi_state == SZOMB) {
+      pt[i].status_flag |= PROCESS_ZOMBIE;
+    } else if (getuser(&(procs[i]), sizeof(struct procinfo), &user, sizeof(struct userinfo)) != -1) {
+      pt[i].mem_kbyte = (user.ui_drss + user.ui_trss) * (page_size / 1024);
+      pt[i].cputime   = (user.ui_ru.ru_utime.tv_sec + user.ui_ru.ru_utime.tv_usec * 1.0e-6 + user.ui_ru.ru_stime.tv_sec + user.ui_ru.ru_stime.tv_usec * 1.0e-6) * 10;
+    }
+
+    snprintf(filename, sizeof(filename), "/proc/%d/psinfo", pt[i].pid);
+    if ((fd = open(filename, O_RDONLY)) < 0) {
+      DEBUG("%s: Cannot open proc file %s -- %s\n", prog, filename, STRERROR);
+      continue;
+    }
+    if (read(fd, &ps, sizeof(ps)) < 0) {
+      DEBUG("%s: Cannot read proc file %s -- %s\n", prog, filename, STRERROR);
+      if (close(fd) < 0)
+        LogError("%s: Socket close failed -- %s\n", prog, STRERROR);
+      return FALSE;
+    }
+    if (close(fd) < 0)
+      LogError("%s: Socket close failed -- %s\n", prog, STRERROR);
+    pt[i].cmdline = (ps.pr_psargs && *ps.pr_psargs) ? Str_dup(ps.pr_psargs) : Str_dup(procs[i].pi_comm);
+  }
+
+  FREE(procs);
+  *reference = pt;
+
+  return treesize;
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  perfstat_memory_total_t  mem;
+
+  /* Memory */
+  if (perfstat_memory_total(NULL, &mem, sizeof(perfstat_memory_total_t), 1) < 1) {
+    LogError("system statistic error -- perfstat_memory_total failed: %s\n", STRERROR);
+    return FALSE;
+  }
+  si->total_mem_kbyte = (unsigned long)((mem.real_total - mem.real_free - mem.numperm) * (page_size / 1024));
+
+  /* Swap */
+  si->swap_kbyte_max   = (unsigned long)(mem.pgsp_total * 4);                   /* 4kB blocks */
+  si->total_swap_kbyte = (unsigned long)((mem.pgsp_total - mem.pgsp_free) * 4); /* 4kB blocks */
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  perfstat_cpu_total_t cpu;
+  unsigned long long cpu_total;
+  unsigned long long cpu_total_new = 0ULL;
+  unsigned long long cpu_user      = 0ULL;
+  unsigned long long cpu_syst      = 0ULL;
+  unsigned long long cpu_wait      = 0ULL;
+
+  if (perfstat_cpu_total(NULL, &cpu, sizeof(perfstat_cpu_total_t), 1) < 0) {
+      LogError("system statistic error -- perfstat_cpu_total failed: %s\n", STRERROR);
+      return -1;
+  }
+
+  cpu_total_new = (cpu.user + cpu.sys + cpu.wait + cpu.idle) / cpu.ncpus;
+  cpu_total     = cpu_total_new - cpu_total_old;
+  cpu_total_old = cpu_total_new;
+  cpu_user      = cpu.user / cpu.ncpus;
+  cpu_syst      = cpu.sys / cpu.ncpus;
+  cpu_wait      = cpu.wait / cpu.ncpus;
+
+  if (cpu_initialized) {
+    if (cpu_total > 0) {
+      si->total_cpu_user_percent = 1000 * ((double)(cpu_user - cpu_user_old) / (double)cpu_total);
+      si->total_cpu_syst_percent = 1000 * ((double)(cpu_syst - cpu_syst_old) / (double)cpu_total);
+      si->total_cpu_wait_percent = 1000 * ((double)(cpu_wait - cpu_wait_old) / (double)cpu_total);
+    } else {
+      si->total_cpu_user_percent = 0;
+      si->total_cpu_syst_percent = 0;
+      si->total_cpu_wait_percent = 0;
+    }
+  }
+
+  cpu_user_old = cpu_user;
+  cpu_syst_old = cpu_syst;
+  cpu_wait_old = cpu_wait;
+
+  cpu_initialized = 1;
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/process/sysdep_DARWIN.c b/monit-5.4/src/process/sysdep_DARWIN.c
new file mode 100644
index 0000000..b422f5b
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_DARWIN.c
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_KVM_H
+#include <kvm.h>
+#endif
+
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HAVE_SYS_VMMETER_H
+#include <sys/vmmeter.h>
+#endif
+
+#ifdef HAVE_MACH_MACH_H
+#include <mach/mach.h>
+#endif
+
+#ifdef HAVE_MACH_HOST_INFO_H
+#include <mach/host_info.h>
+#endif
+
+#ifdef HAVE_MACH_MACH_HOST_H
+#include <mach/mach_host.h>
+#endif
+
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for MacOS X.
+ *
+ *  @file
+ */
+
+
+#define ARGSSIZE 8192
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static int  hz;
+static int  pagesize_kbyte;
+static long total_old    = 0;
+static long cpu_user_old = 0;
+static long cpu_syst_old = 0;
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int init_process_info_sysdep(void) {
+  int              mib[2];
+  size_t           len;
+  struct clockinfo clock;
+  uint64_t         memsize;
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_CLOCKRATE;
+  len    = sizeof(clock);
+  if (sysctl(mib, 2, &clock, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get clock rate: %s\n", STRERROR);
+    return FALSE;
+  }
+  hz     = clock.hz;
+
+  mib[0] = CTL_HW;
+  mib[1] = HW_NCPU;
+  len    = sizeof(systeminfo.cpus);
+  if (sysctl(mib, 2, &systeminfo.cpus, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get cpu count: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  mib[1]  = HW_MEMSIZE;
+  len     = sizeof(memsize);
+  memsize = 0L;
+  if (sysctl(mib, 2, &memsize, &len, NULL, 0 ) == -1) {
+    DEBUG("system statistic error -- cannot get real memory amount: %s\n", STRERROR);
+    return FALSE;
+  }
+  systeminfo.mem_kbyte_max = (memsize / 1024);
+
+  mib[1] = HW_PAGESIZE;
+  len    = sizeof(pagesize_kbyte);
+  if (sysctl(mib, 2, &pagesize_kbyte, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get memory page size: %s\n", STRERROR);
+    return FALSE;
+  }
+  pagesize_kbyte /= 1024;
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the information tree.
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T **reference) {
+  int                i;
+  size_t             treesize;
+  mach_port_t        mytask = mach_task_self();
+  ProcessTree_T     *pt;
+  struct kinfo_proc *pinfo;
+  size_t             pinfo_size = 0;
+  char              *args;
+  size_t             args_size = 0;
+  size_t             size;
+  int                mib[4];
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_PROC;
+  mib[2] = KERN_PROC_ALL;
+  mib[3] = 0;
+  if (sysctl(mib, 4, NULL, &pinfo_size, NULL, 0) < 0) {
+    LogError("system statistic error -- sysctl failed: %s\n", STRERROR);
+    return FALSE;
+  }
+  pinfo = CALLOC(1, pinfo_size);
+  if (sysctl(mib, 4, pinfo, &pinfo_size, NULL, 0)) {
+    FREE(pinfo);
+    LogError("system statistic error -- sysctl failed: %s\n", STRERROR);
+    return FALSE;
+  }
+  treesize = pinfo_size / sizeof(struct kinfo_proc);
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_ARGMAX;
+  size = sizeof(args_size);
+  if (sysctl(mib, 2, &args_size, &size, NULL, 0) == -1) {
+    FREE(pinfo);
+    FREE(pt);
+    LogError("system statistic error -- sysctl failed: %s\n", STRERROR);
+    return FALSE;
+  }
+  args = CALLOC(1, args_size + 1);
+  size = args_size; // save for per-process sysctl loop
+
+  for (i = 0; i < treesize; i++) {
+    mach_port_t task;
+
+    pt[i].pid       = pinfo[i].kp_proc.p_pid;
+    pt[i].ppid      = pinfo[i].kp_eproc.e_ppid;
+    pt[i].starttime = pinfo[i].kp_proc.p_starttime.tv_sec;
+
+    args_size = size;
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_PROCARGS2;
+    mib[2] = pt[i].pid;
+    if (sysctl(mib, 3, args, &args_size, NULL, 0) != -1) {
+      /* KERN_PROCARGS2 sysctl() returns following pseudo structure:
+       *        struct {
+       *                int argc
+       *                char execname[];
+       *                char argv[argc][];
+       *                char env[][];
+       *        }
+       * The strings are terminated with '\0' and may have variable '\0' padding
+       */
+      int  argc = *args;
+      char *p = args + sizeof(int); // arguments beginning
+      StringBuffer_T cmdline = StringBuffer_create(64);
+      p += strlen(p); // skip exename
+      while (argc && p < args + args_size) {
+        if (*p == 0) { // skip terminating 0 and variable length 0 padding
+          p++;
+          continue;
+        }
+        StringBuffer_append(cmdline, argc-- ? "%s " : "%s", p);
+        p += strlen(p);
+      }
+      if (StringBuffer_length(cmdline))
+        pt[i].cmdline = Str_dup(StringBuffer_toString(StringBuffer_trim(cmdline)));
+      StringBuffer_free(&cmdline);
+    }
+    if (! pt[i].cmdline || ! *pt[i].cmdline)
+      pt[i].cmdline = Str_dup(pinfo[i].kp_proc.p_comm);
+
+    if (pinfo[i].kp_proc.p_stat == SZOMB)
+      pt[i].status_flag |= PROCESS_ZOMBIE;
+    pt[i].time = get_float_time();
+
+    if (task_for_pid(mytask, pt[i].pid, &task) == KERN_SUCCESS) {
+      mach_msg_type_number_t   count;
+      task_basic_info_data_t   taskinfo;
+      thread_array_t           threadtable;
+      unsigned int             threadtable_size;
+      thread_basic_info_t      threadinfo;
+      thread_basic_info_data_t threadinfo_data;
+
+      count = TASK_BASIC_INFO_COUNT;
+      if (task_info(task, TASK_BASIC_INFO, (task_info_t)&taskinfo, &count) == KERN_SUCCESS) {
+        pt[i].mem_kbyte   = (unsigned long)(taskinfo.resident_size / 1024);
+        pt[i].cputime     = (long)((taskinfo.user_time.seconds + taskinfo.system_time.seconds) * 10 + (taskinfo.user_time.microseconds + taskinfo.system_time.microseconds) / 100000);
+        pt[i].cpu_percent = 0;
+      }
+      if (task_threads(task, &threadtable, &threadtable_size) == KERN_SUCCESS) {
+        int j;
+
+        threadinfo = &threadinfo_data;
+        for (j = 0; j < threadtable_size; j++) {
+          count = THREAD_BASIC_INFO_COUNT;
+          if (thread_info(threadtable[j], THREAD_BASIC_INFO, (thread_info_t)threadinfo, &count) == KERN_SUCCESS) {
+            if ((threadinfo->flags & TH_FLAGS_IDLE) == 0) {
+              pt[i].cputime += (long)((threadinfo->user_time.seconds + threadinfo->system_time.seconds) * 10 + (threadinfo->user_time.microseconds + threadinfo->system_time.microseconds) / 100000);
+              pt[i].cpu_percent = 0;
+            }
+          }
+          mach_port_deallocate(mytask, threadtable[j]);
+        }
+        vm_deallocate(mytask, (vm_address_t)threadtable,threadtable_size * sizeof(thread_act_t));
+      }
+      mach_port_deallocate(mytask, task); 	
+    }
+  }
+  FREE(args);
+  FREE(pinfo);
+
+  *reference = pt;
+
+  return (int)treesize;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  return getloadavg(loadv, nelem);
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  int                    mib[2];
+  unsigned int           pw, pa, pi;
+  size_t                 len;
+  struct xsw_usage       swap;
+  kern_return_t          kret;
+  vm_statistics_data_t   page_info;
+  mach_msg_type_number_t count;
+
+  /* Memory */
+  count = HOST_VM_INFO_COUNT;
+  kret  = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&page_info, &count);
+  if (kret != KERN_SUCCESS) {
+    DEBUG("system statistic error -- cannot get memory usage\n");
+    return FALSE;
+  }
+  pw = page_info.wire_count * pagesize_kbyte;
+  pa = page_info.active_count * pagesize_kbyte;
+  pi = page_info.inactive_count * pagesize_kbyte;
+  si->total_mem_kbyte = pw + pa + pi;
+
+  /* Swap */
+  mib[0] = CTL_VM;
+  mib[1] = VM_SWAPUSAGE;
+  len    = sizeof(struct xsw_usage);
+  if (sysctl(mib, 2, &swap, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get swap usage: %s\n", STRERROR);
+    si->swap_kbyte_max = 0;
+    return FALSE;
+  }
+  si->swap_kbyte_max   = (unsigned long)(double)(swap.xsu_total) / 1024.;
+  si->total_swap_kbyte = (unsigned long)(double)(swap.xsu_used) / 1024.;
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int                       i;
+  long                      total;
+  long                      total_new = 0;
+  kern_return_t             kret;
+  host_cpu_load_info_data_t cpu_info;
+  mach_msg_type_number_t    count;
+
+  count = HOST_CPU_LOAD_INFO_COUNT;
+  kret  = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu_info, &count);
+  if (kret == KERN_SUCCESS) {
+    for (i = 0; i < CPU_STATE_MAX; i++)
+      total_new += cpu_info.cpu_ticks[i];
+    total     = total_new - total_old;
+    total_old = total_new;
+
+    si->total_cpu_user_percent = (total > 0)?(int)(1000 * (double)(cpu_info.cpu_ticks[CPU_STATE_USER] - cpu_user_old) / total):-10;
+    si->total_cpu_syst_percent = (total > 0)?(int)(1000 * (double)(cpu_info.cpu_ticks[CPU_STATE_SYSTEM] - cpu_syst_old) / total):-10;
+    si->total_cpu_wait_percent = 0; /* there is no wait statistic available */
+
+    cpu_user_old = cpu_info.cpu_ticks[CPU_STATE_USER];
+    cpu_syst_old = cpu_info.cpu_ticks[CPU_STATE_SYSTEM];
+
+    return TRUE;
+  }
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/process/sysdep_FREEBSD.c b/monit-5.4/src/process/sysdep_FREEBSD.c
new file mode 100644
index 0000000..d891d40
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_FREEBSD.c
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_KVM_H
+#include <kvm.h>
+#endif
+
+#ifdef HAVE_PATHS_H
+#include <paths.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_PROC_H
+#include <sys/proc.h>
+#endif
+
+#ifdef HAVE_SYS_USER_H
+#include <sys/user.h>
+#endif
+
+#ifdef HAVE_SYS_VMMETER_H
+#include <sys/vmmeter.h>
+#endif
+
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HAVE_SYS_DKSTAT_H
+#include <sys/dkstat.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for FreeBSD.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static int  hz;
+static int  pagesize_kbyte;
+static long total_old    = 0;
+static long cpu_user_old = 0;
+static long cpu_syst_old = 0;
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int init_process_info_sysdep(void) {
+  int              mib[2];
+  size_t           len;
+  struct clockinfo clock;
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_CLOCKRATE;
+  len    = sizeof(clock);
+  if (sysctl(mib, 2, &clock, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get clock rate: %s\n", STRERROR);
+    return FALSE;
+  }
+  hz     = clock.hz;
+
+  mib[0] = CTL_HW;
+  mib[1] = HW_NCPU;
+  len    = sizeof(systeminfo.cpus);
+  if (sysctl(mib, 2, &systeminfo.cpus, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get cpu count: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  mib[1] = HW_PHYSMEM;
+  len    = sizeof(systeminfo.mem_kbyte_max);
+  if (sysctl(mib, 2, &systeminfo.mem_kbyte_max, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get real memory amount: %s\n", STRERROR);
+    return FALSE;
+  }
+  systeminfo.mem_kbyte_max /= 1024;
+
+  mib[1] = HW_PAGESIZE;
+  len    = sizeof(pagesize_kbyte);
+  if (sysctl(mib, 2, &pagesize_kbyte, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get memory page size: %s\n", STRERROR);
+    return FALSE;
+  }
+  pagesize_kbyte /= 1024;
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the information tree.
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T **reference) {
+  int                treesize;
+  static kvm_t      *kvm_handle;
+  ProcessTree_T     *pt;
+  struct kinfo_proc *pinfo;
+
+  if (!(kvm_handle = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, prog))) {
+    LogError("system statistic error -- cannot initialize kvm interface\n");
+    return FALSE;
+  }
+
+  pinfo = kvm_getprocs(kvm_handle, KERN_PROC_PROC, 0, &treesize);
+  if (!pinfo || (treesize < 1)) {
+    LogError("system statistic error -- cannot get process tree\n");
+    kvm_close(kvm_handle);
+    return FALSE;
+  }
+
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  for (int i = 0; i < treesize; i++) {
+    StringBuffer_T cmdline = StringBuffer_create(64);
+    pt[i].pid       = pinfo[i].ki_pid;
+    pt[i].ppid      = pinfo[i].ki_ppid;
+    pt[i].starttime = pinfo[i].ki_start.tv_sec;
+    pt[i].cputime   = (long)(pinfo[i].ki_runtime / 100000);
+    pt[i].mem_kbyte = (unsigned long)(pinfo[i].ki_rssize * pagesize_kbyte);
+    int flags       = pinfo[i].ki_stat;
+    char * procname = pinfo[i].ki_comm;
+    if (flags == SZOMB)
+      pt[i].status_flag |= PROCESS_ZOMBIE;
+    pt[i].cpu_percent = 0;
+    pt[i].time = get_float_time();
+    char **args;
+    if ((args = kvm_getargv(kvm_handle, &pinfo[i], 0))) {
+      for (int j = 0; args[j]; j++)
+        StringBuffer_append(cmdline, args[j + 1] ? "%s " : "%s", args[j]);
+      pt[i].cmdline = Str_dup(StringBuffer_toString(StringBuffer_trim(cmdline)));
+    }
+    StringBuffer_free(&cmdline);
+    if (! pt[i].cmdline || ! *pt[i].cmdline)
+      pt[i].cmdline = Str_dup(procname);
+  }
+
+  *reference = pt;
+  kvm_close(kvm_handle);
+
+  return treesize;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep(double *loadv, int nelem) {
+  return getloadavg(loadv, nelem);
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  int                mib[16];
+  size_t             len;
+  struct vmtotal     vm;
+  int                n = 0;
+  int                pagesize = getpagesize();
+  size_t             miblen;
+  struct xswdev      xsw;
+  unsigned long long total = 0ULL;
+  unsigned long long used  = 0ULL;
+
+  /* Memory */
+  memset(mib, 0, sizeof(mib));
+  mib[0] = CTL_VM;
+  mib[1] = VM_METER;
+  len    = sizeof(struct vmtotal);
+  if (sysctl(mib, 2, &vm, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get real memory usage: %s\n", STRERROR);
+    return FALSE;
+  }
+  si->total_mem_kbyte = (unsigned long)(vm.t_arm * pagesize_kbyte);
+
+  /* Swap */
+  memset(mib, 0, sizeof(mib));
+  miblen = sizeof(mib) / sizeof(mib[0]);
+  if (sysctlnametomib("vm.swap_info", mib, &miblen) == -1) {
+    LogError("system statistic error -- cannot get swap usage: %s\n", STRERROR);
+    si->swap_kbyte_max = 0;
+    return FALSE;
+  }
+  while (TRUE) {
+    mib[miblen] = n;
+    len = sizeof(struct xswdev);
+    if (sysctl(mib, miblen + 1, &xsw, &len, NULL, 0) == -1)
+      break;
+    if (xsw.xsw_version != XSWDEV_VERSION) {
+      LogError("system statistic error -- cannot get swap usage: xswdev version mismatch\n");
+      si->swap_kbyte_max = 0;
+      return FALSE;
+    }
+    total += xsw.xsw_nblks;
+    used  += xsw.xsw_used;
+    n++;
+  }
+  si->swap_kbyte_max   = (unsigned long)(double)total * (double)pagesize / 1024.;
+  si->total_swap_kbyte = (unsigned long)(double)used  * (double)pagesize / 1024.;
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int    i;
+  int    mib[2];
+  long   cp_time[CPUSTATES];
+  long   total_new = 0;
+  long   total;
+  size_t len;
+
+  len = sizeof(mib);
+  if (sysctlnametomib("kern.cp_time", mib, &len) == -1) {
+    LogError("system statistic error -- cannot get cpu time handler: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  len = sizeof(cp_time);
+  if (sysctl(mib, 2, &cp_time, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get cpu time: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  for (i = 0; i < CPUSTATES; i++)
+    total_new += cp_time[i];
+
+  total     = total_new - total_old;
+  total_old = total_new;
+
+  si->total_cpu_user_percent = (total > 0) ? (int)(1000 * (double)(cp_time[CP_USER] - cpu_user_old) / total) : -10;
+  si->total_cpu_syst_percent = (total > 0) ? (int)(1000 * (double)(cp_time[CP_SYS] - cpu_syst_old) / total) : -10;
+  si->total_cpu_wait_percent = 0; /* there is no wait statistic available */
+
+  cpu_user_old = cp_time[CP_USER];
+  cpu_syst_old = cp_time[CP_SYS];
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/process/sysdep_HPUX.c b/monit-5.4/src/process/sysdep_HPUX.c
new file mode 100644
index 0000000..1921229
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_HPUX.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#define _RUSAGE_EXTENDED
+
+#ifdef HAVE_SYS_PSTAT_H
+#include <sys/pstat.h>
+#endif
+
+#ifdef HAVE_NLIST_H
+#include <nlist.h>
+#endif
+
+#ifdef HAVE_SYS_DK_H
+#include <sys/dk.h>
+#endif
+
+#ifdef HAVE_SYS_SWAP_H
+#include <sys/swap.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+static int         page_size;
+static int         nproc;
+static long        cpu_total_old = 0;
+static long        cpu_user_old = 0;
+static long        cpu_syst_old = 0;
+static long        cpu_wait_old = 0;
+struct pst_dynamic pst_dyn;
+struct pst_status *psall;
+
+#define MAXSTRSIZE 80
+
+/**
+ *  System dependent resource gathering code for HP/UX.
+ *
+ *  @file
+ */
+
+/*
+ * Helpful guide for implematation:
+ * "SunOS to HP-UX 9.05 Porting Guide" at http://www.interex.org/tech/9000/Tech/sun_hpux_port/portguide.html
+ */
+
+int init_process_info_sysdep(void) {
+        struct pst_dynamic psd;
+        struct pst_static pst;
+        
+        if (pstat_getdynamic(&psd,sizeof(psd),(size_t)1,0) != -1)
+                systeminfo.cpus=psd.psd_proc_cnt;
+        else
+                return FALSE;
+        
+        if (pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0) != -1) {
+                systeminfo.mem_kbyte_max=(unsigned long)(pst.physical_memory * (pst.page_size / 1024)); 
+                page_size=pst.page_size;
+        } else {
+                return FALSE;
+        }
+        
+        return TRUE;
+}
+
+
+/**
+ * This routine returns 'na' double precision floats containing
+ * the load averages in 'a'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *a, int na) {
+        struct pst_dynamic psd;
+	
+        if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1) {
+                switch (na) {
+                        case 3:
+                                a[2] = psd.psd_avg_15_min;
+                                
+                        case 2:
+                                a[1] = psd.psd_avg_5_min;
+                                
+                        case 1:
+                                a[0] = psd.psd_avg_1_min;
+                }
+        } else {
+                return FALSE;
+        }
+        
+        return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the process tree
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise 0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+        int            i;
+        int            treesize;
+        ProcessTree_T *pt;
+        
+        ASSERT(reference);
+        
+        pstat_getdynamic(&pst_dyn, sizeof(struct pst_dynamic), 1, 0);
+        nproc = pst_dyn.psd_activeprocs;
+        
+        if (nproc)
+                RESIZE(psall, nproc * sizeof(struct pst_status));
+        else 
+                return 0;
+        
+        if ((treesize = pstat_getproc(psall, sizeof(struct pst_status), nproc , 0)) == -1) {
+                LogError("system statistic error 1 -- pstat_getproc failed: %s\n", strerror(errno));
+                return 0;
+        }
+        
+        pt = CALLOC(sizeof(ProcessTree_T), treesize);
+        
+        for (i = 0; i < treesize; i++) {
+                pt[i].pid         = psall[i].pst_pid;
+                pt[i].ppid        = psall[i].pst_ppid;
+                pt[i].starttime   = psall[i].pst_start;
+                pt[i].time        = get_float_time();
+                pt[i].cputime     =  psall[i].pst_utime + psall[i].pst_stime * 10;
+                pt[i].cpu_percent = (int)(1000. * psall[i].pst_pctcpu / (float)systeminfo.cpus);
+                pt[i].mem_kbyte   = (unsigned long)(psall[i].pst_rssize * (page_size / 1024.0));
+                pt[i].cmdline     = (psall[i].pst_cmd && *psall[i].pst_cmd) ? Str_dup(psall[i].pst_cmd) : Str_dup(psall[i].pst_ucomm);
+                
+                if ( psall[i].pst_stat == PS_ZOMBIE )
+                        pt[i].status_flag |= PROCESS_ZOMBIE;
+        }
+        
+        *reference = pt;
+        
+        return treesize;
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+        int                 i, n, num;
+        struct pst_static   pst;
+        struct pst_dynamic  psd;
+        struct swaptable   *s;
+        char               *strtab;
+        unsigned long long  total = 0ULL;
+        unsigned long long  used  = 0ULL;
+        
+        /* Memory */
+        if(pstat_getstatic(&pst, sizeof(pst), (size_t)1, 0) == -1) {
+                LogError("system statistic error -- pstat_getstatic failed: %s\n", STRERROR);
+                return FALSE;
+        }
+        if(pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) == -1) {
+                LogError("system statistic error -- pstat_getdynamic failed: %s\n", STRERROR);
+                return FALSE;
+        }
+        si->total_mem_kbyte = (unsigned long)((pst.physical_memory - psd.psd_free) * (pst.page_size/1024));
+        
+        /* Swap */
+again:
+        if ((num = swapctl(SC_GETNSWP, 0)) == -1) {
+                LogError("system statistic error -- swap usage gathering failed: %s\n", STRERROR);
+                return FALSE;
+        }
+        if (num == 0) {
+                DEBUG("system statistic -- no swap configured\n");
+                si->swap_kbyte_max = 0;
+                return TRUE;
+        }
+        s = (struct swaptable *)ALLOC(num * sizeof(struct swapent) + sizeof(struct swaptable));
+        strtab = (char *)ALLOC((num + 1) * MAXSTRSIZE);
+        for (i = 0; i < (num + 1); i++)
+                s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
+        s->swt_n = num + 1;
+        if ((n = swapctl(SC_LIST, s)) < 0) {
+                LogError("system statistic error -- swap usage gathering failed: %s\n", STRERROR);
+                si->swap_kbyte_max = 0;
+                FREE(s);
+                FREE(strtab);
+                return FALSE;
+        }
+        if (n > num) {
+                DEBUG("system statistic -- new swap added: deferring swap usage statistics to next cycle\n");
+                FREE(s);
+                FREE(strtab);
+                goto again;
+        }
+        for (i = 0; i < n; i++) {
+                if (!(s->swt_ent[i].ste_flags & ST_INDEL) && !(s->swt_ent[i].ste_flags & ST_DOINGDEL)) {
+                        total += s->swt_ent[i].ste_pages;
+                        used  += s->swt_ent[i].ste_pages - s->swt_ent[i].ste_free;
+                }
+        }
+        FREE(s);
+        FREE(strtab);
+        si->swap_kbyte_max   = (unsigned long)(double)(total * page_size) / 1024.;
+        si->total_swap_kbyte = (unsigned long)(double)(used  * page_size) / 1024.;
+        
+        return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+        int                i;
+        long               cpu_total;
+        long               cpu_total_new = 0;
+        long               cpu_user = 0;
+        long               cpu_syst = 0;
+        long               cpu_wait = 0;
+        struct pst_dynamic psd;
+        
+        pstat_getdynamic(&psd, sizeof(psd), 1, 0);
+        
+        for(i = 0; i < CPUSTATES; i++)
+                cpu_total_new += psd.psd_cpu_time[i];
+        cpu_total     = cpu_total_new - cpu_total_old;
+        cpu_total_old = cpu_total_new;
+        cpu_user      = psd.psd_cpu_time[CP_USER] + psd.psd_cpu_time[CP_NICE];
+        cpu_syst      = psd.psd_cpu_time[CP_SYS];
+        cpu_wait      = psd.psd_cpu_time[CP_WAIT];
+        
+        si->total_cpu_user_percent = (cpu_total > 0)?(int)(1000 * (double)(cpu_user - cpu_user_old) / cpu_total):-10;
+        si->total_cpu_syst_percent = (cpu_total > 0)?(int)(1000 * (double)(cpu_syst - cpu_syst_old) / cpu_total):-10;
+        si->total_cpu_wait_percent = (cpu_total > 0)?(int)(1000 * (double)(cpu_wait - cpu_wait_old) / cpu_total):-10;
+        
+        cpu_user_old = cpu_user;
+        cpu_syst_old = cpu_syst;
+        cpu_wait_old = cpu_wait;
+        
+        return TRUE;
+}
+
diff --git a/monit-5.4/src/process/sysdep_LINUX.c b/monit-5.4/src/process/sysdep_LINUX.c
new file mode 100644
index 0000000..6957f48
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_LINUX.c
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ASM_PARAM_H
+#include <asm/param.h>
+#endif
+
+#ifdef HAVE_GLOB_H
+#include <glob.h>
+#endif
+
+#ifndef HZ
+# define HZ sysconf(_SC_CLK_TCK)
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for Linux.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+#define MEMTOTAL  "MemTotal:"
+#define MEMFREE   "MemFree:"
+#define MEMBUF    "Buffers:"
+#define MEMCACHE  "Cached:"
+#define SWAPTOTAL "SwapTotal:"
+#define SWAPFREE  "SwapFree:"
+
+#define NSEC_PER_SEC    1000000000L
+
+static unsigned long long old_cpu_user     = 0;
+static unsigned long long old_cpu_syst     = 0;
+static unsigned long long old_cpu_wait     = 0;
+static unsigned long long old_cpu_total    = 0;
+static int                page_shift_to_kb = 0;
+
+
+/**
+ * Get system start time
+ * @return seconds since unix epoch
+ */
+static time_t get_starttime() {
+  char   buf[1024];
+  double up = 0;
+
+  if (! read_proc_file(buf, 1024, "uptime", -1, NULL)) {
+    LogError("system statistic error -- cannot get system uptime\n");
+    return 0;
+  }
+
+  if (sscanf(buf, "%lf", &up) != 1) {
+    LogError("system statistic error -- invalid uptime\n");
+    return 0;
+  }
+
+  return time(NULL) - (time_t)up;
+}
+  
+
+/* ------------------------------------------------------------------ Public */
+
+
+int init_process_info_sysdep(void) {
+  char *ptr;
+  char  buf[1024];
+  long  page_size;
+  int   page_shift;  
+
+  if (! read_proc_file(buf, sizeof(buf), "meminfo", -1, NULL)) 
+    return FALSE;
+  if (! (ptr = strstr(buf, MEMTOTAL))) {
+    DEBUG("system statistic error -- cannot get real memory amount\n");
+    return FALSE;
+  }
+  if (sscanf(ptr+strlen(MEMTOTAL), "%ld", &systeminfo.mem_kbyte_max) != 1) {
+    DEBUG("system statistic error -- cannot get real memory amount\n");
+    return FALSE;
+  }
+
+  if ((systeminfo.cpus = sysconf(_SC_NPROCESSORS_CONF)) < 0) {
+    DEBUG("system statistic error -- cannot get cpu count: %s\n", STRERROR);
+    return FALSE;
+  } else if (systeminfo.cpus == 0) {
+    DEBUG("system reports cpu count 0, setting dummy cpu count 1\n");
+    systeminfo.cpus = 1;
+  }
+
+  if ((page_size = sysconf(_SC_PAGESIZE)) <= 0) {
+    DEBUG("system statistic error -- cannot get page size: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  for (page_shift = 0; page_size != 1; page_size >>= 1, page_shift++);
+  page_shift_to_kb = page_shift - 10;
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes of the proc files system to initialize
+ * the process tree (sysdep version... but should work for
+ * all procfs based unices) 
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+  int                 i = 0, j;
+  int                 rv, bytes = 0;
+  int                 treesize = 0;
+  int                 stat_ppid = 0;
+  char               *tmp = NULL;
+  char                procname[STRLEN];
+  char                buf[1024];
+  char                stat_item_state;
+  long                stat_item_cutime = 0;
+  long                stat_item_cstime = 0;
+  long                stat_item_rss = 0;
+  glob_t              globbuf;
+  unsigned long       stat_item_utime = 0;
+  unsigned long       stat_item_stime = 0;
+  unsigned long long  stat_item_starttime = 0ULL;
+  ProcessTree_T      *pt = NULL;
+
+  ASSERT(reference);
+
+  /* Find all processes in the /proc directory */
+  if ((rv = glob("/proc/[0-9]*", GLOB_ONLYDIR, NULL, &globbuf))) {
+    LogError("system statistic error -- glob failed: %d (%s)\n", rv, STRERROR);
+    return FALSE;
+  } 
+
+  treesize = globbuf.gl_pathc;
+
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  /* Insert data from /proc directory */
+  for (i = 0; i < treesize; i++) {
+
+    pt[i].pid = atoi(globbuf.gl_pathv[i] + strlen("/proc/"));
+    
+    if (!read_proc_file(buf, sizeof(buf), "stat", pt[i].pid, NULL)) {
+      DEBUG("system statistic error -- cannot read /proc/%d/stat\n", pt[i].pid);
+      continue;
+    }
+
+    pt[i].time = get_float_time();
+
+    if (!(tmp = strrchr(buf, ')'))) {
+      DEBUG("system statistic error -- file /proc/%d/stat parse error\n", pt[i].pid);
+      continue;
+    }
+    *tmp = 0;
+    if (sscanf(buf, "%*d (%256s", procname) != 1) {
+      DEBUG("system statistic error -- file /proc/%d/stat process name parse error\n", pt[i].pid);
+      continue;
+    }
+
+    tmp += 2;
+
+    /* This implementation is done by using fs/procfs/array.c as a basis
+     * it is also worth looking into the source of the procps utils */
+    if (sscanf(tmp,
+         "%c %d %*d %*d %*d %*d %*u %*u"
+         "%*u %*u %*u %lu %lu %ld %ld %*d %*d %*d "
+         "%*u %llu %*u %ld %*u %*u %*u %*u %*u "
+         "%*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n",
+         &stat_item_state,
+         &stat_ppid,
+         &stat_item_utime,
+         &stat_item_stime,
+         &stat_item_cutime,
+         &stat_item_cstime,
+         &stat_item_starttime,
+         &stat_item_rss) != 8) {
+      DEBUG("system statistic error -- file /proc/%d/stat parse error\n", pt[i].pid);
+      continue;
+    }
+    
+    pt[i].ppid      = stat_ppid;
+    pt[i].starttime = get_starttime() + (time_t)(stat_item_starttime / HZ);
+  
+    /* jiffies -> seconds = 1 / HZ
+     * HZ is defined in "asm/param.h"  and it is usually 1/100s but on
+     * alpha system it is 1/1024s */
+    pt[i].cputime     = ((float)(stat_item_utime + stat_item_stime) * 10.0) / HZ;
+    pt[i].cpu_percent = 0;
+
+    /* State is Zombie -> then we are a Zombie ... clear or? (-: */
+    if (stat_item_state == 'Z')
+      pt[i].status_flag |= PROCESS_ZOMBIE;
+
+    if (page_shift_to_kb < 0)
+      pt[i].mem_kbyte = (stat_item_rss >> abs(page_shift_to_kb));
+    else
+      pt[i].mem_kbyte = (stat_item_rss << abs(page_shift_to_kb));
+
+    if (! read_proc_file(buf, sizeof(buf), "cmdline", pt[i].pid, &bytes)) {
+      DEBUG("system statistic error -- cannot read /proc/%d/cmdline\n", pt[i].pid);
+      continue;
+    }
+    /* The cmdline file contains argv elements/strings terminated separated by '\0' => join the string: */
+    for (j = 0; j < (bytes - 1); j++)
+      if (buf[j] == 0)
+        buf[j] = ' ';
+    pt[i].cmdline = *buf ? Str_dup(buf) : Str_dup(procname);
+  }
+  
+  *reference = pt;
+  globfree(&globbuf);
+
+  return treesize;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep(double *loadv, int nelem) {
+#ifdef HAVE_GETLOADAVG
+        return getloadavg(loadv, nelem);
+#else
+        char buf[STRLEN];
+        double load[3];
+        if (! read_proc_file(buf, sizeof(buf), "loadavg", -1, NULL))
+                return -1;
+        if (sscanf(buf, "%lf %lf %lf", &load[0], &load[1], &load[2]) != 3) {
+                DEBUG("system statistic error -- cannot get load average\n");
+                return -1;
+        }
+        for (int i = 0; i < nelem; i++)
+                loadv[i] = load[i];
+        return 0;
+#endif
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  char          *ptr;
+  char           buf[1024];
+  unsigned long  mem_free = 0UL;
+  unsigned long  buffers = 0UL;
+  unsigned long  cached = 0UL;
+  unsigned long  swap_total = 0UL;
+  unsigned long  swap_free = 0UL;
+  
+  if (! read_proc_file(buf, 1024, "meminfo", -1, NULL)) {
+    LogError("system statistic error -- cannot get real memory free amount\n");
+    goto error;
+  }
+
+  /* Memory */
+  if (! (ptr = strstr(buf, MEMFREE)) || sscanf(ptr + strlen(MEMFREE), "%ld", &mem_free) != 1) {
+    LogError("system statistic error -- cannot get real memory free amount\n");
+    goto error;
+  }
+  if (! (ptr = strstr(buf, MEMBUF)) || sscanf(ptr + strlen(MEMBUF), "%ld", &buffers) != 1)
+    DEBUG("system statistic error -- cannot get real memory buffers amount\n");
+  if (! (ptr = strstr(buf, MEMCACHE)) || sscanf(ptr + strlen(MEMCACHE), "%ld", &cached) != 1)
+    DEBUG("system statistic error -- cannot get real memory cache amount\n");
+  si->total_mem_kbyte = systeminfo.mem_kbyte_max - mem_free - buffers - cached;
+
+  /* Swap */
+  if (! (ptr = strstr(buf, SWAPTOTAL)) || sscanf(ptr + strlen(SWAPTOTAL), "%ld", &swap_total) != 1) {
+    LogError("system statistic error -- cannot get swap total amount\n");
+    goto error;
+  }
+  if (! (ptr = strstr(buf, SWAPFREE)) || sscanf(ptr + strlen(SWAPFREE), "%ld", &swap_free) != 1) {
+    LogError("system statistic error -- cannot get swap free amount\n");
+    goto error;
+  }
+  si->swap_kbyte_max   = swap_total;
+  si->total_swap_kbyte = swap_total - swap_free;
+
+  return TRUE;
+
+  error:
+  si->total_mem_kbyte = 0;
+  si->swap_kbyte_max = 0;
+  return FALSE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int                rv;
+  unsigned long long cpu_total;
+  unsigned long long cpu_user;
+  unsigned long long cpu_nice;
+  unsigned long long cpu_syst;
+  unsigned long long cpu_idle;
+  unsigned long long cpu_wait;
+  unsigned long long cpu_irq;
+  unsigned long long cpu_softirq;
+  char               buf[1024];
+
+  if (!read_proc_file(buf, 1024, "stat", -1, NULL)) {
+    LogError("system statistic error -- cannot read /proc/stat\n");
+    goto error;
+  }
+
+  rv = sscanf(buf, "cpu %llu %llu %llu %llu %llu %llu %llu",
+         &cpu_user,
+         &cpu_nice,
+         &cpu_syst,
+         &cpu_idle,
+         &cpu_wait,
+         &cpu_irq,
+         &cpu_softirq);
+  if (rv < 4) {
+    LogError("system statistic error -- cannot read cpu usage\n");
+    goto error;
+  } else if (rv == 4) {
+    /* linux 2.4.x doesn't support these values */
+    cpu_wait    = 0;
+    cpu_irq     = 0;
+    cpu_softirq = 0;
+  }
+
+  cpu_total = cpu_user + cpu_nice + cpu_syst + cpu_idle + cpu_wait + cpu_irq + cpu_softirq;
+  cpu_user  = cpu_user + cpu_nice;
+
+  if (old_cpu_total == 0) {
+    si->total_cpu_user_percent = -10;
+    si->total_cpu_syst_percent = -10;
+    si->total_cpu_wait_percent = -10;
+  } else {
+    unsigned long long delta = cpu_total - old_cpu_total;
+  
+    si->total_cpu_user_percent = (int)(1000 * (double)(cpu_user - old_cpu_user) / delta);
+    si->total_cpu_syst_percent = (int)(1000 * (double)(cpu_syst - old_cpu_syst) / delta);
+    si->total_cpu_wait_percent = (int)(1000 * (double)(cpu_wait - old_cpu_wait) / delta);
+  }
+
+  old_cpu_user  = cpu_user;
+  old_cpu_syst  = cpu_syst;
+  old_cpu_wait  = cpu_wait;
+  old_cpu_total = cpu_total;
+  return TRUE;
+
+  error:
+  si->total_cpu_user_percent = 0;
+  si->total_cpu_syst_percent = 0;
+  si->total_cpu_wait_percent = 0;
+  return FALSE;
+}
+
+
diff --git a/monit-5.4/src/process/sysdep_NETBSD.c b/monit-5.4/src/process/sysdep_NETBSD.c
new file mode 100644
index 0000000..7243db4
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_NETBSD.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_PROC_H
+#include <sys/proc.h>
+#endif
+
+#ifdef HAVE_KVM_H
+#include <kvm.h>
+#endif
+
+#ifdef HAVE_UVM_UVM_H
+#include <uvm/uvm.h>
+#endif
+
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HAVE_SYS_DKSTAT_H
+#include <sys/dkstat.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for NetBSD.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static int      hz;
+static int      pagesize_kbyte; 
+static long     total_old    = 0;
+static long     cpu_user_old = 0;
+static long     cpu_syst_old = 0;
+static unsigned maxslp;
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int init_process_info_sysdep(void) {
+  int              mib[2];
+  size_t           len;
+  struct clockinfo clock;
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_CLOCKRATE;
+  len    = sizeof(clock);
+  if (sysctl(mib, 2, &clock, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get clock rate: %s\n", STRERROR);
+    return FALSE;
+  }
+  hz     = clock.hz;
+
+  mib[0] = CTL_HW;
+
+  mib[1] = HW_NCPU;
+  len    = sizeof(systeminfo.cpus);
+  if (sysctl(mib, 2, &systeminfo.cpus, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get cpu count: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  mib[1] = HW_PHYSMEM;
+  len    = sizeof(systeminfo.mem_kbyte_max);
+  if (sysctl(mib, 2, &systeminfo.mem_kbyte_max, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get real memory amount: %s\n", STRERROR);
+    return FALSE;
+  }
+  systeminfo.mem_kbyte_max /= 1024;
+
+  mib[1] = HW_PAGESIZE;
+  len    = sizeof(pagesize_kbyte);
+  if (sysctl(mib, 2, &pagesize_kbyte, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get memory page size: %s\n", STRERROR);
+    return FALSE;
+  }
+  pagesize_kbyte /= 1024;
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the information tree.
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+  int                        treesize;
+  size_t                     size = sizeof(maxslp);
+  char                       buf[_POSIX2_LINE_MAX];
+  int                        mib_proc2[6] = {CTL_KERN, KERN_PROC2, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc2), 0};
+  static int                 mib_maxslp[] = {CTL_VM, VM_MAXSLP};
+  ProcessTree_T             *pt;
+  kvm_t                     *kvm_handle;
+  static struct kinfo_proc2 *pinfo;
+
+  if (sysctl(mib_maxslp, 2, &maxslp, &size, NULL, 0) < 0) {
+    LogError("system statistic error -- vm.maxslp failed");
+    return FALSE;
+  }
+  
+  if (sysctl(mib_proc2, 6, NULL, &size, NULL, 0) == -1) {
+    LogError("system statistic error -- kern.proc2 #1 failed");
+    return FALSE;
+  }
+  
+  size *= 2; // Add reserve for new processes which were created between calls of sysctl
+  pinfo = CALLOC(1, size);
+  mib_proc2[5] = (int)(size / sizeof(struct kinfo_proc2));
+  if (sysctl(mib_proc2, 6, pinfo, &size, NULL, 0) == -1) {
+    FREE(pinfo);
+    LogError("system statistic error -- kern.proc2 #2 failed");
+    return FALSE;
+  }
+  
+  treesize = (int)(size / sizeof(struct kinfo_proc2));
+    
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  if (! (kvm_handle = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, buf))) {
+    LogError("system statistic error -- kvm_openfiles failed: %s", buf);
+    return FALSE;
+  }
+
+  for (int i = 0; i < treesize; i++) {
+    pt[i].pid         = pinfo[i].p_pid;
+    pt[i].ppid        = pinfo[i].p_ppid;
+    pt[i].starttime   = pinfo[i].p_ustart_sec;
+    pt[i].cputime     = (long)((pinfo[i].p_rtime_sec * 10) + (pinfo[i].p_rtime_usec / 100000));
+    pt[i].cpu_percent = 0;
+    pt[i].mem_kbyte   = (unsigned long)(pinfo[i].p_vm_rssize * pagesize_kbyte);
+    if (pinfo[i].p_stat == SZOMB)
+      pt[i].status_flag |= PROCESS_ZOMBIE;
+    pt[i].time = get_float_time();
+    char **args;
+    if ((args = kvm_getargv2(kvm_handle, &pinfo[i], 0))) {
+      StringBuffer_T cmdline = StringBuffer_create(64);
+      for (int j = 0; args[j]; j++)
+        StringBuffer_append(cmdline, args[j + 1] ? "%s " : "%s", args[j]);
+      pt[i].cmdline = Str_dup(StringBuffer_toString(StringBuffer_trim(cmdline)));
+      StringBuffer_free(&cmdline);
+    }
+    if (! pt[i].cmdline || ! *pt[i].cmdline)
+      pt[i].cmdline = Str_dup(pinfo[i].p_comm);
+  }
+  FREE(pinfo);
+  kvm_close(kvm_handle);
+
+  *reference = pt;
+
+  return treesize;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  return getloadavg(loadv, nelem);
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  int            mib[2];
+  size_t         len;
+  struct vmtotal vm;
+  struct uvmexp  vmexp;
+
+  /* Memory */
+  mib[0] = CTL_VM;
+  mib[1] = VM_METER;
+  len    = sizeof(struct vmtotal);
+  if (sysctl(mib, 2, &vm, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get real memory usage: %s\n", STRERROR);
+    return FALSE;
+  }
+  si->total_mem_kbyte = (unsigned long)(vm.t_arm * pagesize_kbyte);
+
+  /* Swap */
+  mib[1] = VM_UVMEXP;
+  len = sizeof(vmexp);
+  if (sysctl(mib, 2, &vmexp, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get swap usage: %s\n", STRERROR);
+    si->swap_kbyte_max = 0;
+    return FALSE;
+  }
+  si->swap_kbyte_max   = (unsigned long)((double)vmexp.swpages   * ((double)vmexp.pagesize / 1024.));
+  si->total_swap_kbyte = (unsigned long)((double)vmexp.swpginuse * ((double)vmexp.pagesize / 1024.));
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int       i;
+  int       mib[] = {CTL_KERN, KERN_CP_TIME};
+  long long cp_time[CPUSTATES];
+  long      total_new = 0;
+  long      total;
+  size_t    len;
+
+  len = sizeof(cp_time);
+  if (sysctl(mib, 2, &cp_time, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get cpu time: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  for (i = 0; i < CPUSTATES; i++)
+    total_new += cp_time[i];
+  total     = total_new - total_old;
+  total_old = total_new;
+
+  si->total_cpu_user_percent = (total > 0)?(int)(1000 * (double)(cp_time[CP_USER] - cpu_user_old) / total):-10;
+  si->total_cpu_syst_percent = (total > 0)?(int)(1000 * (double)(cp_time[CP_SYS] - cpu_syst_old) / total):-10;
+  si->total_cpu_wait_percent = 0; /* there is no wait statistic available */
+
+  cpu_user_old = cp_time[CP_USER];
+  cpu_syst_old = cp_time[CP_SYS];
+
+  return TRUE;  
+}
+
diff --git a/monit-5.4/src/process/sysdep_OPENBSD.c b/monit-5.4/src/process/sysdep_OPENBSD.c
new file mode 100644
index 0000000..89343e5
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_OPENBSD.c
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_PROC_H
+#include <sys/proc.h>
+#endif
+
+#ifdef HAVE_KVM_H
+#include <kvm.h>
+#endif
+
+#ifdef HAVE_UVM_UVM_H
+#include <uvm/uvm.h>
+#endif
+
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HAVE_SYS_DKSTAT_H
+#include <sys/dkstat.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for OpenBSD.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static int      hz;
+static int      pagesize_kbyte;
+static long     total_old    = 0;
+static long     cpu_user_old = 0;
+static long     cpu_syst_old = 0;
+static unsigned maxslp;
+
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int init_process_info_sysdep(void) {
+  int              mib[2];
+  size_t           len;
+  int64_t          physmem;
+  struct clockinfo clock;
+
+  mib[0] = CTL_KERN;
+  mib[1] = KERN_CLOCKRATE;
+  len    = sizeof(clock);
+  if (sysctl(mib, 2, &clock, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get clock rate: %s\n", STRERROR);
+    return FALSE;
+  }
+  hz     = clock.hz;
+
+  mib[0] = CTL_HW;
+  mib[1] = HW_NCPU;
+  len    = sizeof(systeminfo.cpus);
+  if (sysctl(mib, 2, &systeminfo.cpus, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get cpu count: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  mib[1] = HW_PHYSMEM64;
+  len    = sizeof(physmem);
+  if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get real memory amount: %s\n", STRERROR);
+    return FALSE;
+  }
+  systeminfo.mem_kbyte_max = physmem / 1024;
+
+  mib[1] = HW_PAGESIZE;
+  len    = sizeof(pagesize_kbyte);
+  if (sysctl(mib, 2, &pagesize_kbyte, &len, NULL, 0) == -1) {
+    DEBUG("system statistic error -- cannot get memory page size: %s\n", STRERROR);
+    return FALSE;
+  }
+  pagesize_kbyte /= 1024;
+
+  return TRUE;
+}
+
+
+/**
+ * Read all processes to initialize the information tree.
+ * @param reference  reference of ProcessTree
+ * @return treesize > 0 if succeeded otherwise = 0.
+ */
+int initprocesstree_sysdep(ProcessTree_T **reference) {
+  int                        treesize;
+  char                       buf[_POSIX2_LINE_MAX];
+  size_t                     size = sizeof(maxslp);
+  int                        mib_proc2[6] = {CTL_KERN, KERN_PROC2, KERN_PROC_KTHREAD, 0, sizeof(struct kinfo_proc2), 0};
+  static int                 mib_maxslp[] = {CTL_VM, VM_MAXSLP};
+  ProcessTree_T             *pt;
+  kvm_t                     *kvm_handle;
+  static struct kinfo_proc2 *pinfo;
+
+  if (sysctl(mib_maxslp, 2, &maxslp, &size, NULL, 0) < 0) {
+    LogError("system statistic error -- vm.maxslp failed");
+    return FALSE;
+  }
+
+  if (sysctl(mib_proc2, 6, NULL, &size, NULL, 0) == -1) {
+    LogError("system statistic error -- kern.proc2 #1 failed");
+    return FALSE;
+  }
+
+  size *= 2; // Add reserve for new processes which were created between calls of sysctl
+  pinfo = CALLOC(1, size);
+  mib_proc2[5] = (int)(size / sizeof(struct kinfo_proc2));
+  if (sysctl(mib_proc2, 6, pinfo, &size, NULL, 0) == -1) {
+    FREE(pinfo);
+    LogError("system statistic error -- kern.proc2 #2 failed");
+    return FALSE;
+  }
+
+  treesize = (int)(size / sizeof(struct kinfo_proc2));
+
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  if (! (kvm_handle = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, buf))) {
+    LogError("system statistic error -- kvm_openfiles failed: %s", buf);
+    return FALSE;
+  }
+
+  for (int i = 0; i < treesize; i++) {
+    pt[i].pid         = pinfo[i].p_pid;
+    pt[i].ppid        = pinfo[i].p_ppid;
+    pt[i].starttime   = pinfo[i].p_ustart_sec;
+    pt[i].cputime     = (long)((pinfo[i].p_rtime_sec * 10) + (pinfo[i].p_rtime_usec / 100000));
+    pt[i].cpu_percent = 0;
+    pt[i].mem_kbyte   = (unsigned long)(pinfo[i].p_vm_rssize * pagesize_kbyte);
+    if (pinfo[i].p_stat == SZOMB)
+      pt[i].status_flag |= PROCESS_ZOMBIE; //FIXME: save system service flag too (kernel threads)
+    pt[i].time = get_float_time();
+    char **args;
+    if ((args = kvm_getargv2(kvm_handle, &pinfo[i], 0))) {
+      StringBuffer_T cmdline = StringBuffer_create(64);;
+      for (int j = 0; args[j]; j++)
+        StringBuffer_append(cmdline, args[j + 1] ? "%s " : "%s", args[j]);
+      pt[i].cmdline = Str_dup(StringBuffer_toString(StringBuffer_trim(cmdline)));
+      StringBuffer_free(&cmdline);
+    }
+    if (! pt[i].cmdline || ! *pt[i].cmdline)
+      pt[i].cmdline = Str_dup(pinfo[i].p_comm);
+  }
+  FREE(pinfo);
+  kvm_close(kvm_handle);
+
+  *reference = pt;
+
+  return treesize;
+}
+
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  return getloadavg(loadv, nelem);
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  int            mib[2];
+  size_t         len;
+  struct vmtotal vm;
+  struct uvmexp  vmexp;
+
+  /* Memory */
+  mib[0] = CTL_VM;
+  mib[1] = VM_METER;
+  len    = sizeof(struct vmtotal);
+  if (sysctl(mib, 2, &vm, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get real memory usage: %s\n", STRERROR);
+    return FALSE;
+  }
+  si->total_mem_kbyte = (unsigned long)(vm.t_arm * pagesize_kbyte);
+
+  /* Swap */
+  mib[1] = VM_UVMEXP;
+  len = sizeof(vmexp);
+  if (sysctl(mib, 2, &vmexp, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get swap usage: %s\n", STRERROR);
+    si->swap_kbyte_max = 0;
+    return FALSE;
+  }
+  si->swap_kbyte_max   = (unsigned long)((double)vmexp.swpages   * ((double)vmexp.pagesize / 1024.));
+  si->total_swap_kbyte = (unsigned long)((double)vmexp.swpginuse * ((double)vmexp.pagesize / 1024.));
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int    i;
+  int    mib[] = {CTL_KERN, KERN_CPTIME};
+  long   cp_time[CPUSTATES];
+  long   total_new = 0;
+  long   total;
+  size_t len;
+
+  len = sizeof(cp_time);
+  if (sysctl(mib, 2, &cp_time, &len, NULL, 0) == -1) {
+    LogError("system statistic error -- cannot get cpu time: %s\n", STRERROR);
+    return FALSE;
+  }
+
+  for (i = 0; i < CPUSTATES; i++)
+    total_new += cp_time[i];
+  total     = total_new - total_old;
+  total_old = total_new;
+
+  si->total_cpu_user_percent = (total > 0)?(int)(1000 * (double)(cp_time[CP_USER] - cpu_user_old) / total):-10;
+  si->total_cpu_syst_percent = (total > 0)?(int)(1000 * (double)(cp_time[CP_SYS] - cpu_syst_old) / total):-10;
+  si->total_cpu_wait_percent = 0; /* there is no wait statistic available */
+
+  cpu_user_old = cp_time[CP_USER];
+  cpu_syst_old = cp_time[CP_SYS];
+
+  return TRUE;  
+}
+
diff --git a/monit-5.4/src/process/sysdep_SOLARIS.c b/monit-5.4/src/process/sysdep_SOLARIS.c
new file mode 100644
index 0000000..77fc589
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_SOLARIS.c
@@ -0,0 +1,398 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#else
+#include <time.h>
+#endif
+
+#ifdef HAVE_SYS_LOADAVG_H
+#include <sys/loadavg.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_PROCFS_H
+#include <procfs.h>
+#endif
+
+#ifdef HAVE_GLOB_H
+#include <glob.h>
+#endif
+
+#ifdef HAVE_KSTAT_H
+#include <kstat.h>
+#endif
+
+#ifdef HAVE_SYS_SWAP_H
+#define _SYS_VNODE_H
+#include <sys/swap.h>
+#endif
+
+#ifdef HAVE_SYS_SYSINFO_H
+#include <sys/sysinfo.h>
+#endif
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+/**
+ *  System dependent resource gathering code for Solaris.
+ *
+ *  @file
+ */
+
+#define pagetok(size) ((size) << pageshift)
+
+static int    page_size;
+static int    pageshift=0;
+static long   old_cpu_user=0;
+static long   old_cpu_syst=0;
+static long   old_cpu_wait=0;
+static long   old_total=0;
+
+#define MAXSTRSIZE 80
+
+#ifndef LOG1024
+#define LOG1024         10
+#endif
+
+int init_process_info_sysdep(void) {
+  register int pagesize;
+
+  systeminfo.cpus = sysconf( _SC_NPROCESSORS_ONLN);
+
+  pagesize  = sysconf(_SC_PAGESIZE);
+  pageshift = 0;
+  while (pagesize > 1) {
+    pageshift++;
+    pagesize >>= 1;
+  }
+
+  /* we only need the amount of log(2)1024 for our conversion */
+  pageshift -= LOG1024;
+
+  systeminfo.mem_kbyte_max = pagetok(sysconf(_SC_PHYS_PAGES));
+  page_size = getpagesize();
+
+  return (TRUE);
+}
+
+double timestruc_to_tseconds(timestruc_t t) {
+  return  t.tv_sec * 10 + t.tv_nsec / 100000000.0;
+}
+
+
+/**
+ * Read all processes of the proc files system to initialize
+ * the process tree (sysdep version... but should work for
+ * all procfs based unices)
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+  int            i;
+  int            rv;
+  int            pid;
+  int            treesize;
+  char           buf[4096];
+  glob_t         globbuf;
+  pstatus_t      pstatus;
+  psinfo_t      *psinfo = (psinfo_t *)&buf;
+  ProcessTree_T *pt;
+
+  ASSERT(reference);
+
+  /* Find all processes in the /proc directory */
+  if ((rv = glob("/proc/[0-9]*", NULL, NULL, &globbuf)) != 0) {
+    LogError("system statistic error -- glob failed: %d (%s)\n", rv, STRERROR);
+    return 0;
+  }
+
+  treesize = globbuf.gl_pathc;
+
+  /* Allocate the tree */
+  pt = CALLOC(sizeof(ProcessTree_T), treesize);
+
+  /* Insert data from /proc directory */
+  for (i = 0; i < treesize; i++) {
+    pid = atoi(globbuf.gl_pathv[i] + strlen("/proc/"));
+    pt[i].pid = pid;
+
+    /* get the actual time */
+    pt[i].time = get_float_time();
+
+    if (! read_proc_file(buf, sizeof(buf), "psinfo", pt[i].pid, NULL)) {
+      pt[i].cputime     = 0;
+      pt[i].cpu_percent = 0;
+      pt[i].mem_kbyte   = 0;
+      continue;
+    } 
+
+    pt[i].ppid      = psinfo->pr_ppid;
+    pt[i].starttime = psinfo->pr_start.tv_sec;
+        
+    /* If we don't have any light-weight processes (LWP) then we are definitely a zombie */
+    if (psinfo->pr_nlwp == 0) {
+      pt[i].status_flag = PROCESS_ZOMBIE;
+      pt[i].cputime     = 0;
+      pt[i].cpu_percent = 0;
+      pt[i].mem_kbyte   = 0;
+      continue;
+    } 
+    
+    pt[i].mem_kbyte = psinfo->pr_rssize;
+
+    pt[i].cmdline  = Str_dup(psinfo->pr_psargs);
+    if (! pt[i].cmdline || ! *pt[i].cmdline)
+      pt[i].cmdline = Str_dup(psinfo->pr_fname);
+
+    if (! read_proc_file(buf, sizeof(buf), "status", pt[i].pid, NULL)) {
+      pt[i].cputime     = 0;
+      pt[i].cpu_percent = 0;
+    } else {
+      memcpy(&pstatus, buf, sizeof(pstatus_t));
+      pt[i].cputime     = (timestruc_to_tseconds(pstatus.pr_utime) + timestruc_to_tseconds(pstatus.pr_stime));
+      pt[i].cpu_percent = 0;
+    }
+  }
+  
+  *reference = pt;
+
+  /* Free globbing buffer */
+  globfree(&globbuf);
+
+  return treesize;
+}
+
+/**
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  return getloadavg(loadv, nelem);
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  int                 i, n, num;
+  kstat_ctl_t        *kctl;  
+  kstat_named_t      *knamed;
+  kstat_t            *kstat;
+  swaptbl_t          *s;
+  char               *strtab;
+  unsigned long long  total = 0ULL;
+  unsigned long long  used  = 0ULL;
+
+  /* Memory */
+  kctl  = kstat_open();
+  kstat = kstat_lookup(kctl, "unix", 0, "system_pages");
+  if (kstat_read(kctl, kstat, 0) == -1) {
+    LogError("system statistic error -- memory usage gathering failed\n");
+    kstat_close(kctl);
+    return FALSE;
+  }
+  knamed = kstat_data_lookup(kstat, "freemem");
+  if (knamed)
+    si->total_mem_kbyte = systeminfo.mem_kbyte_max-pagetok(knamed->value.ul);
+  kstat_close(kctl);
+
+ /* Swap */
+again:
+ if ((num = swapctl(SC_GETNSWP, 0)) == -1) {
+    LogError("system statistic error -- swap usage gathering failed: %s\n", STRERROR);
+    return FALSE;
+  }
+  if (num == 0) {
+    DEBUG("system statistic -- no swap configured\n");
+    si->swap_kbyte_max = 0;
+    return TRUE;
+  }
+  s = (swaptbl_t *)ALLOC(num * sizeof(swapent_t) + sizeof(struct swaptable));
+  strtab = (char *)ALLOC((num + 1) * MAXSTRSIZE);
+  for (i = 0; i < (num + 1); i++)
+    s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
+  s->swt_n = num + 1;
+  if ((n = swapctl(SC_LIST, s)) < 0) {
+    LogError("system statistic error -- swap usage gathering failed: %s\n", STRERROR);
+    si->swap_kbyte_max = 0;
+    FREE(s);
+    FREE(strtab);
+    return FALSE;
+  }
+  if (n > num) {
+    DEBUG("system statistic -- new swap added: deferring swap usage statistics to next cycle\n");
+    FREE(s);
+    FREE(strtab);
+    goto again;
+  }
+  for (i = 0; i < n; i++) {
+    if (!(s->swt_ent[i].ste_flags & ST_INDEL) && !(s->swt_ent[i].ste_flags & ST_DOINGDEL)) {
+      total += s->swt_ent[i].ste_pages;
+      used  += s->swt_ent[i].ste_pages - s->swt_ent[i].ste_free;
+    }
+  }
+  FREE(s);
+  FREE(strtab);
+  si->swap_kbyte_max   = (unsigned long)(double)(total * page_size) / 1024.;
+  si->total_swap_kbyte = (unsigned long)(double)(used  * page_size) / 1024.;
+
+  return TRUE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  int             i, ncpu = 0, ncpus;
+  long            cpu_user = 0, cpu_syst = 0, cpu_wait = 0, total = 0, diff_total;
+  kstat_ctl_t    *kctl;  
+  kstat_named_t  *knamed;
+  kstat_t        *kstat;
+  kstat_t       **cpu_ks;
+  cpu_stat_t     *cpu_stat;
+  
+  si->total_cpu_user_percent = si->total_cpu_syst_percent = si->total_cpu_wait_percent = 0;
+
+  kctl  = kstat_open();
+  kstat = kstat_lookup(kctl, "unix", 0, "system_misc");
+  if (kstat_read(kctl, kstat, 0) == -1) {
+    LogError("system statistic -- failed to lookup unix::system_misc kstat\n");
+    goto error;
+  }
+  
+  if (NULL == (knamed = kstat_data_lookup(kstat, "ncpus"))) {
+    LogError("system statistic -- ncpus kstat lookup failed\n");
+    goto error;
+  }
+  
+  if ((ncpus = knamed->value.ui32) == 0) {
+    LogError("system statistic -- ncpus is 0\n");
+    goto error;
+  }
+
+  cpu_ks   = (kstat_t **)ALLOC(ncpus * sizeof(kstat_t *));
+  cpu_stat = (cpu_stat_t *)ALLOC(ncpus * sizeof(cpu_stat_t));
+
+  for (kstat = kctl->kc_chain; kstat; kstat = kstat->ks_next) {
+    if (strncmp(kstat->ks_name, "cpu_stat", 8) == 0) {
+      if (-1 == kstat_read(kctl, kstat, NULL)) {
+        LogError("system statistic -- failed to read cpu_stat kstat\n");
+        goto error2;
+      }
+      cpu_ks[ncpu] = kstat;
+      if (++ncpu > ncpus) {
+        LogError("system statistic -- cpu count mismatch\n");
+        goto error2;
+      }
+    }
+  }
+  
+  for (i = 0; i < ncpu; i++) {
+    if (-1 == kstat_read(kctl, cpu_ks[i], &cpu_stat[i])) {
+      LogError("system statistic -- failed to read cpu_stat kstat for cpu %d\n", i);
+      goto error2;
+    }
+    cpu_user += cpu_stat[i].cpu_sysinfo.cpu[CPU_USER];
+    cpu_syst += cpu_stat[i].cpu_sysinfo.cpu[CPU_KERNEL];
+    cpu_wait += cpu_stat[i].cpu_sysinfo.cpu[CPU_WAIT];
+    total    += (cpu_stat[i].cpu_sysinfo.cpu[0] + cpu_stat[i].cpu_sysinfo.cpu[1] + cpu_stat[i].cpu_sysinfo.cpu[2] + cpu_stat[i].cpu_sysinfo.cpu[3]);
+  }
+
+  if (old_total == 0) {
+    si->total_cpu_user_percent = si->total_cpu_syst_percent = si->total_cpu_wait_percent = -10;
+  } else if ((diff_total = total - old_total) > 0) {
+    si->total_cpu_user_percent = (int)((1000 * (cpu_user - old_cpu_user)) / diff_total);
+    si->total_cpu_syst_percent = (int)((1000 * (cpu_syst - old_cpu_syst)) / diff_total);
+    si->total_cpu_wait_percent = (int)((1000 * (cpu_wait - old_cpu_wait)) / diff_total);
+  }
+
+  old_cpu_user = cpu_user;
+  old_cpu_syst = cpu_syst;
+  old_cpu_wait = cpu_wait;
+  old_total    = total;
+  
+  FREE(cpu_ks);
+  FREE(cpu_stat);
+  kstat_close(kctl);
+  return TRUE;
+ 
+  error2:
+  old_total = 0;
+  FREE(cpu_ks);
+  FREE(cpu_stat);
+
+  error:
+  kstat_close(kctl);
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/process/sysdep_UNKNOWN.c b/monit-5.4/src/process/sysdep_UNKNOWN.c
new file mode 100644
index 0000000..ad00502
--- /dev/null
+++ b/monit-5.4/src/process/sysdep_UNKNOWN.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#include "monit.h"
+#include "process.h"
+#include "process_sysdep.h"
+
+
+/**
+ *  System dependent resource gathering code for UNKNOWN systems
+ *
+ *  @file
+ */
+
+
+int init_process_info_sysdep(void) {
+  systeminfo.mem_kbyte_max = 0;
+
+  return FALSE;
+}
+
+
+/**
+ * THIS IS JUST A DUMMY!!!
+ *
+ * Read all processes of the proc files system to initialize
+ * the process tree (sysdep version... but should work for
+ * all procfs based unices) 
+ * @param reference  reference of ProcessTree
+ * @return treesize>0 if succeeded otherwise =0.
+ */
+int initprocesstree_sysdep(ProcessTree_T ** reference) {
+  return 0;
+}
+
+/**
+ * THIS IS JUST A DUMMY!!!
+ *
+ * This routine returns 'nelem' double precision floats containing
+ * the load averages in 'loadv'; at most 3 values will be returned.
+ * @param loadv destination of the load averages
+ * @param nelem number of averages
+ * @return: 0 if successful, -1 if failed (and all load averages are 0).
+ */
+int getloadavg_sysdep (double *loadv, int nelem) {
+  int i;
+  
+  for (i = 0; i < nelem; i++)
+    loadv[i] = 0.0;
+
+  return -1;
+}
+
+
+/**
+ * This routine returns kbyte of real memory in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_memory_sysdep(SystemInfo_T *si) {
+  return FALSE;
+}
+
+
+/**
+ * This routine returns system/user CPU time in use.
+ * @return: TRUE if successful, FALSE if failed (or not available)
+ */
+int used_system_cpu_sysdep(SystemInfo_T *si) {
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/protocols/apache_status.c b/monit-5.4/src/protocols/apache_status.c
new file mode 100644
index 0000000..569affb
--- /dev/null
+++ b/monit-5.4/src/protocols/apache_status.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#include "protocol.h"
+
+#undef   READ_SIZE
+#define  READ_SIZE  1024
+
+/* Private prototypes */
+static int check_apache_stat(Socket_T s);
+
+/**
+ * Check an Apache server to monitor its status.
+ * Do this using the server-status report from mod_status, which 
+ * will only be available if the server is responding to 
+ * some extent.
+ *
+ * Currently based on the Scoreboard response, which is available
+ * even with ExtendedStatus Off on Apache config file.
+ *
+ * @file
+ */
+int check_apache_status(Socket_T socket) {
+
+  char host[STRLEN];
+  const char *request= "/server-status?auto";
+
+  ASSERT(socket);
+
+  if(socket_print(socket, "GET %s HTTP/1.1\r\n"
+		  "Host: %s\r\n"
+		  "Accept: */*\r\n"
+		  "User-Agent: %s/%s\r\n"
+		  "Connection: close\r\n\r\n",
+		  request, Util_getHTTPHostHeader(socket, host, STRLEN), 
+		  prog, VERSION) < 0) {
+    socket_setError(socket, "HTTP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  return check_apache_stat(socket);  
+  
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Extract the Scoreboard line from the mod_status response.
+ * Count the active apache child processes, and those which are
+ * in other states. If each percentage exceeds the corresponding
+ * limit, then return FALSE.
+ * @param s A socket
+ * @param limit The maximum percentage of logging processes
+ * @return TRUE if logging is OK otherwise FALSE
+ */
+static int check_apache_stat(Socket_T socket) {
+  
+  int scored = 0;
+  int errors = 0;
+  char line[READ_SIZE];
+  char search_string[READ_SIZE + 1];
+
+  int loglimit= 0;
+  int closelimit= 0;
+  int dnslimit= 0;
+  int keepalivelimit= 0;
+  int replylimit= 0;
+  int requestlimit= 0;
+  int startlimit= 0;
+  int waitlimit= 0;
+  int gracefullimit= 0;
+  int cleanuplimit= 0;
+  
+  int no_logging = 0;
+  int no_close = 0;
+  int no_dns = 0;
+  int no_keepalive = 0;
+  int no_reply = 0;
+  int no_request = 0;
+  int no_start = 0;
+  int no_wait = 0;
+  int no_graceful = 0;
+  int no_cleanup = 0;
+  int active_servers = 0;
+  char *p;
+  Port_T myPort= (Port_T)socket_get_Port(socket);
+
+  ASSERT(myPort);
+
+  loglimit= myPort->ApacheStatus.loglimit;
+  closelimit= myPort->ApacheStatus.closelimit;
+  dnslimit= myPort->ApacheStatus.dnslimit;
+  keepalivelimit= myPort->ApacheStatus.keepalivelimit;
+  replylimit= myPort->ApacheStatus.replylimit;
+  requestlimit= myPort->ApacheStatus.requestlimit;
+  startlimit= myPort->ApacheStatus.startlimit;
+  waitlimit= myPort->ApacheStatus.waitlimit;
+  gracefullimit= myPort->ApacheStatus.gracefullimit;
+  cleanuplimit= myPort->ApacheStatus.cleanuplimit;
+
+
+  while(NULL != socket_readln(socket, line, READ_SIZE)) {
+    if(Str_startsWith(line, "Scoreboard")) {   
+      if(1 != sscanf(line, "%*s%*[: ]%1024s", search_string)) {
+       Str_chomp(line);
+       socket_setError(socket, "APACHE-STATUS error: parsing Apache status response '%s'\n",
+         line);
+       return FALSE;
+      } else {
+        scored = 1;
+      }
+    }
+  }
+  
+  DEBUG("Scoreboard: %s\n", search_string);
+  
+  /* Check that some scoreboard line was found, if not return an error */
+  if(!scored){
+    socket_setError(socket, "APACHE-STATUS error: no scoreboard line returned by Apache\n");
+    return FALSE;
+  }
+  
+  /* Total each of the status messages in the scoreboard */
+  for(p = search_string ; *p ; p++){
+    active_servers++;
+    switch(*p){
+    case 'S':
+      no_start++;
+      break;
+    case 'R':
+      no_request++;
+      break;
+    case 'W':
+      no_reply++;
+      break;
+    case 'K':
+      no_keepalive++;
+      break;
+    case 'D':
+      no_dns++;
+      break;
+    case 'C':
+      no_close++;
+      break;
+    case 'L':
+      no_logging++;
+      break;
+    case 'G':
+      no_graceful++;
+      break;
+    case 'I':
+      no_cleanup++;
+      break;
+    case '_':
+      no_wait++;
+      break;
+    case '.':
+      active_servers--;
+      break;
+    }
+  }
+
+  if(active_servers <= 0){
+    socket_setError(socket, "APACHE-STATUS warning: No idle server or threads found\n");
+    /* This is not really an error, only a very bussy server */
+    return TRUE;
+  }
+
+  /* 
+   * Conditions are only tested if the limit parameter is greater than zero. 
+   */
+  
+  if(loglimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.loglimitOP, 
+			    (100 * no_logging / active_servers), loglimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+          " %i percent of Apache processes are logging\n", loglimit);
+      errors++;
+    }
+  }
+
+  if(startlimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.startlimitOP, 
+			    (100 * no_start / active_servers), startlimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+          " %i percent of Apache processes are starting\n", startlimit);
+      errors++;
+    }
+  }
+
+  if(requestlimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.requestlimitOP, 
+		    (100 * no_request / active_servers), requestlimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+          " %i percent of Apache processes are reading requests\n", 
+	  requestlimit);
+      errors++;
+    }
+  }
+
+  if(replylimit > 0 ){
+    if(Util_evalQExpression(myPort->ApacheStatus.replylimitOP, 
+			    (100 * no_reply / active_servers), replylimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+          " %i percent of Apache processes are sending a reply\n", replylimit);
+      errors++;
+    }
+  }
+
+  if(keepalivelimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.keepalivelimitOP, 
+		    (100 * no_keepalive / active_servers), keepalivelimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are in keepalive\n", keepalivelimit);
+      errors++;
+    }
+  }
+
+  if(dnslimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.dnslimitOP, 
+			    (100 * no_dns / active_servers), dnslimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are waiting for DNS\n", dnslimit);
+      errors++;
+    }
+  }
+
+  if(closelimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.closelimitOP, 
+			    (100 * no_close / active_servers), closelimit)){
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are closing connections\n", 
+	  closelimit);
+      errors++;
+    }
+  }
+
+  if(gracefullimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.gracefullimitOP, 
+		     (100 * no_graceful / active_servers), gracefullimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are finishing gracefully\n", 
+	  gracefullimit);
+      errors++;
+    }
+  }
+
+  if(cleanuplimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.cleanuplimitOP, 
+		    (100 * no_cleanup / active_servers), cleanuplimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are in idle cleanup\n", 
+	  cleanuplimit);
+      errors++;
+    }
+  }
+
+  if(waitlimit > 0){
+    if(Util_evalQExpression(myPort->ApacheStatus.waitlimitOP, 
+			    (100 * no_wait / active_servers), waitlimit)) {
+      socket_setError(socket, "APACHE-STATUS error:"
+	  " %i percent of Apache processes are waiting for a connection\n", 
+	  waitlimit);
+      errors++;
+    }
+  }
+
+  return (errors==0);
+  
+}
diff --git a/monit-5.4/src/protocols/clamav.c b/monit-5.4/src/protocols/clamav.c
new file mode 100644
index 0000000..8c78dbd
--- /dev/null
+++ b/monit-5.4/src/protocols/clamav.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Send PING and check for PONG.
+ *  If alive return TRUE, else, return FALSE.
+ *
+ *  @file
+ */
+int check_clamav(Socket_T socket) {
+
+  char buf[STRLEN];
+  const char *ok= "PONG";
+
+  ASSERT(socket);
+  
+  if(socket_print(socket, "PING\r\n") < 0) {
+    socket_setError(socket, "CLAMAV: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "CLAMAV: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  if(strncasecmp(buf, ok, strlen(ok)) != 0) {
+    socket_setError(socket, "CLAMAV error: %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/default.c b/monit-5.4/src/protocols/default.c
new file mode 100644
index 0000000..3bfa7a1
--- /dev/null
+++ b/monit-5.4/src/protocols/default.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#include "protocol.h"
+
+/**
+ *  Default service test. Left empty.
+ *
+ *  @file
+ */
+int check_default(Socket_T socket) {
+
+  ASSERT(socket);
+  
+  return TRUE;
+    
+}
+
+ 
diff --git a/monit-5.4/src/protocols/dns.c b/monit-5.4/src/protocols/dns.c
new file mode 100644
index 0000000..07b0c44
--- /dev/null
+++ b/monit-5.4/src/protocols/dns.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Simple DNS test.
+ *
+ *  The nameserver is queried for NS record of DNS root.
+ *
+ *  @file
+ */
+int check_dns(Socket_T socket) {
+  int            offset_request  = 0;
+  int            offset_response = 0;
+  int            rc;
+  unsigned char  buf[STRLEN];
+  unsigned char *response = NULL; 
+  unsigned char  request[19] = {
+    0x00,          /** Request Length field for DNS via TCP */
+    0x11,
+
+    0x00,                                /** Transaction ID */
+    0x01,
+
+    0x01,                                         /** Flags */
+    0x00,
+
+    0x00,                                 /** Queries count */
+    0x01,
+
+    0x00,                 /** Answer resource records count */
+    0x00,
+
+    0x00,              /** Authority resource records count */
+    0x00,
+
+    0x00,             /** Additional resource records count */
+    0x00,
+
+                                                 /** Query: */
+
+    0x00,                 /** Name: DNS root (empty string) */
+
+    0x00,                                      /** Type: NS */
+    0x02,
+
+    0x00,                                     /** Class: IN */
+    0x01
+  };
+
+  ASSERT(socket);
+
+  switch (socket_get_type(socket)) {
+    case SOCK_DGRAM:
+      offset_request  = 2; /*  Skip Length field in request */
+      offset_response = 0;
+      break;
+    case SOCK_STREAM:
+      offset_request  = 0;
+      offset_response = 2; /*  Skip Length field in response */
+      break;
+    default:
+      socket_setError(socket, "DNS: unsupported socket type -- protocol test skipped\n");
+      return TRUE;
+  }
+
+  if (socket_write(socket, (unsigned char *)request + offset_request, sizeof(request) - offset_request) < 0) {
+    socket_setError(socket, "DNS: error sending query -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Response should have at least 14 bytes */
+  if (socket_read(socket, (unsigned char *)buf, 15) <= 14) {
+    socket_setError(socket, "DNS: error receiving response -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  response = buf + offset_response;
+
+  /* Compare transaction ID (it should be the same as in our request): */
+  if (response[0] != 0x00 && response[1] != 0x01) {
+    socket_setError(socket, "DNS: response transaction ID mismatch -- received 0x%x%x, expected 0x1\n", response[0], response[1]);
+    return FALSE;
+  }
+
+  /* Compare flags: */
+
+  /* Response type */
+  if ((response[2] & 0x80) != 0x80) {
+    socket_setError(socket, "DNS: invalid response type: 0x%x\n", response[2] & 0x80);
+    return FALSE;
+  }
+
+  /* Response code: accept request refusal as correct response as the server may disallow NS root query but the negative response means, it reacts to requests */
+  rc = response[3] & 0x0F;
+  if (rc != 0x0 && rc != 0x5) {
+    socket_setError(socket, "DNS: invalid response code: 0x%x\n", rc);
+    return FALSE;
+  }
+
+  /* Compare queries count (it should be one as in our request): */
+  if (response[4] != 0x00 && response[5] != 0x01) {
+    socket_setError(socket, "DNS: invalid query count in response -- received 0x%x%x, expected 1\n", response[4], response[5]);
+    return FALSE;
+  }
+
+  /* Compare answer and authority resource record counts (they shouldn't be both zero) */
+  if (rc == 0 && response[6] == 0x00 && response[7] == 0x00 && response[8] == 0x00 && response[9] == 0x00) {
+    socket_setError(socket, "DNS: no answer or authority records returned\n");
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/dwp.c b/monit-5.4/src/protocols/dwp.c
new file mode 100644
index 0000000..4db4cfb
--- /dev/null
+++ b/monit-5.4/src/protocols/dwp.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+
+#include "protocol.h"
+
+/**
+ *  A simple DWP (database wire protocol) test.
+ *
+ *  We send the following request to the server:
+ *  'HEAD / HTTP/1.1'
+ *  and check the server's status code.
+ *
+ *  If the status code is >= 400, an error has occurred.
+ *  Return TRUE if the status code is 200, otherwise FALSE.
+ *
+ *  @file
+ */
+int check_dwp(Socket_T socket) {
+
+#define REQ_LENGTH  1024
+
+  int n;
+  int status;
+  char buf[STRLEN];
+  char proto[STRLEN];
+
+  ASSERT(socket);
+
+  if(socket_print(socket, "HEAD / HTTP/1.1\r\n"
+		  "Connection: close\r\n\r\n") < 0) {
+    socket_setError(socket, "DWP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  if(! socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "DWP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+
+  n= sscanf(buf, "%255s %d", proto, &status);
+  if(n!=2 || (status >= 400)) {
+    socket_setError(socket, "DWP error: %s\n", buf);
+    return FALSE;
+  }
+  
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/ftp.c b/monit-5.4/src/protocols/ftp.c
new file mode 100644
index 0000000..5ebb4b2
--- /dev/null
+++ b/monit-5.4/src/protocols/ftp.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Check the server for greeting code 220 and then send a QUIT and
+ *  check for code 221. If alive return TRUE, else, return FALSE.
+ *
+ *  @file
+ */
+int check_ftp(Socket_T socket) {
+  int status;
+  char buf[STRLEN];
+
+  ASSERT(socket);
+
+  do {
+    if (! socket_readln(socket, buf, STRLEN)) {
+      socket_setError(socket, "FTP: error receiving data -- %s\n", STRERROR);
+      return FALSE;
+    }
+    Str_chomp(buf);
+  } while(buf[3] == '-'); // Discard multi-line response
+  if (sscanf(buf, "%d", &status) != 1 || status != 220) {
+    socket_setError(socket, "FTP greeting error: %s\n", buf);
+    return FALSE;
+  }
+
+  if (socket_print(socket, "QUIT\r\n") < 0) {
+    socket_setError(socket, "FTP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if (! socket_readln(socket, buf, STRLEN)) {
+    socket_setError(socket, "FTP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+  Str_chomp(buf);
+  if (sscanf(buf, "%d", &status) != 1 || status != 221) {
+    socket_setError(socket, "FTP quit error: %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/generic.c b/monit-5.4/src/protocols/generic.c
new file mode 100644
index 0000000..2d3e4e2
--- /dev/null
+++ b/monit-5.4/src/protocols/generic.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_PCRE
+#include <pcre.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Generic service test.
+ *
+ *  @file
+ */
+int check_generic(Socket_T socket) {
+  Generic_T g= NULL;
+  char *buf;
+#ifdef HAVE_REGEX_H
+  int regex_return;
+#endif
+  
+  ASSERT(socket);
+
+  if(socket_get_Port(socket))
+    g = ((Port_T)(socket_get_Port(socket)))->generic;
+    
+  buf = CALLOC(sizeof(char), Run.expectbuffer + 1);
+
+  while (g != NULL) {
+    
+    if (g->send != NULL) {
+      
+      /* Unescape any \0x00 escaped chars in g's send string 
+      to allow sending a string containing \0 bytes also */
+      char *X = Str_dup(g->send);
+      int l = Util_handle0Escapes(X);
+      
+      if(socket_write(socket, X, l) < 0) {
+        socket_setError(socket, "GENERIC: error sending data -- %s\n", STRERROR);
+        FREE(X);
+        FREE(buf);
+        return FALSE;
+      } else
+        DEBUG("GENERIC: successfully sent: '%s'\n", g->send); 
+
+      FREE(X);          
+
+    } else if (g->expect != NULL) {
+      int n; 
+
+      /* Need read, not readln here */
+      if((n= socket_read(socket, buf, Run.expectbuffer))<0) {
+        socket_setError(socket, "GENERIC: error receiving data -- %s\n", STRERROR);
+        FREE(buf);
+        return FALSE;
+      }
+      buf[n]= 0;
+      
+#ifdef HAVE_REGEX_H
+      regex_return= regexec(g->expect, buf, 0, NULL, 0);
+      if (regex_return != 0) {
+        char e[STRLEN];
+        regerror(regex_return, g->expect, e, STRLEN);
+        socket_setError(socket, "GENERIC: receiving unexpected data [%s] -- %s\n", Str_trunc(buf, STRLEN - 4), e);
+        FREE(buf);
+        return FALSE;
+      } else
+        DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); 
+      
+#else
+      /* w/o regex support */
+
+      if (strncmp(buf, g->expect, strlen(g->expect)) != 0) {
+        socket_setError(socket, "GENERIC: receiving unexpected data [%s]\n", Str_trunc(buf, STRLEN - 4));
+        FREE(buf);
+        return FALSE;
+      } else
+        DEBUG("GENERIC: successfully received: '%s'\n", Str_trunc(buf, STRLEN - 4)); 
+      
+#endif
+      
+    } else {
+      /* This should not happen */
+      socket_setError(socket, "GENERIC: unexpected strangeness\n");
+      FREE(buf);
+      return FALSE;
+    }
+    g= g->next;
+  }
+  
+  FREE(buf);
+  return TRUE;
+    
+}
+
diff --git a/monit-5.4/src/protocols/gps.c b/monit-5.4/src/protocols/gps.c
new file mode 100644
index 0000000..7c7f26d
--- /dev/null
+++ b/monit-5.4/src/protocols/gps.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+#include <string.h>
+
+#include "protocol.h"
+
+/**
+ *  Check gpsd status.
+ *  There is a project site for gpsd at <http://gpsd.berlios.de/>.
+ *
+ *  @file
+ */
+int check_gps(Socket_T socket) {
+	char buf[STRLEN];
+	const char *ok_gps_device="GPSD,G=GPS";
+	const char *ok_rtcm104_device="GPSD,G=RTCM104";
+	const char *ok_rtcm104v2_device="GPSD,G=RTCM104v2";
+
+	ASSERT(socket);
+
+	if(socket_print(socket, "G\r\n") < 0) {
+		socket_setError(socket, "GPS: error sending data -- %s\n", STRERROR);
+		return FALSE;
+	}
+
+	if(!socket_readln(socket, buf, sizeof(buf))) {
+		socket_setError(socket, "GPS: error receiving data -- %s\n", STRERROR);
+		return FALSE;
+	}
+
+	Str_chomp(buf);
+	if(strncasecmp(buf, ok_gps_device, strlen(ok_gps_device)) != 0) {
+		if(strncasecmp(buf, ok_rtcm104v2_device, strlen(ok_rtcm104v2_device)) != 0) {
+			if(strncasecmp(buf, ok_rtcm104_device, strlen(ok_rtcm104_device)) != 0) {
+				socket_setError(socket, "GPS error (no device): %s\n", buf);
+				return FALSE;
+			}
+		}
+	}
+	
+	return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/http.c b/monit-5.4/src/protocols/http.c
new file mode 100644
index 0000000..c916f61
--- /dev/null
+++ b/monit-5.4/src/protocols/http.c
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#include "md5.h"
+#include "sha1.h"
+#include "base64.h"
+#include "protocol.h"
+#include "httpstatus.h"
+#include "util/Str.h"
+
+
+/**
+ *  A HTTP test.
+ *
+ *  We send the following request to the server:
+ *  'GET / HTTP/1.1'             ... if request statement isn't defined
+ *  'GET /custom/page  HTTP/1.1' ... if request statement is defined
+ *  and check the server's status code.
+ *
+ *  If the statement defines hostname, it's used in the 'Host:' header
+ * otherwise a default (empty) Host header is set.
+ *
+ *  If the status code is >= 400, an error has occurred.
+ *  Return TRUE if the status code is OK, otherwise FALSE.
+ *  @file
+ */
+
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+#undef   READ_SIZE
+#define  READ_SIZE  8192
+#define  LINE_SIZE  512
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static int do_regex(Socket_T socket, int content_length, Request_T R) {
+        int n, size = 0, length = 0, rv = FALSE, regex_return;
+        char *buf = NULL;
+
+        if (content_length == 0) {
+                socket_setError(socket, "HTTP error: No content returned from server\n");
+                return FALSE;
+        } else if (content_length < 0) { /* Not defined in response */
+                content_length = HTTP_CONTENT_MAX;
+        } else if (content_length > HTTP_CONTENT_MAX) {
+                content_length = HTTP_CONTENT_MAX;
+        }
+
+        length = content_length;
+        buf = ALLOC(content_length + 1);
+
+        do {
+                n = socket_read(socket, &buf[size], length);
+                if (n <= 0)
+                        break;
+                size += n;
+                length -= n;
+        } while (length > 0);
+
+        if (size == 0) {
+                socket_setError(socket, "HTTP error: receiving data -- %s\n", STRERROR);
+                goto error;
+        }
+        buf[size] = 0;
+
+#ifdef HAVE_REGEX_H
+        regex_return = regexec(R->regex, buf, 0, NULL, 0);
+#else
+        regex_return = strstr(buf, R->regex) ? 0 : 1;
+#endif
+        switch (R->operator) {
+                case OPERATOR_EQUAL:
+                        if (regex_return == 0) {
+                                rv = TRUE;
+                                DEBUG("HTTP: Regular expression matches\n");
+                        } else {
+#ifdef HAVE_REGEX_H
+                                char errbuf[STRLEN];
+                                regerror(regex_return, NULL, errbuf, sizeof(errbuf));
+                                socket_setError(socket, "HTTP error: Regular expression doesn't match: %s\n", errbuf);
+#else
+                                socket_setError(socket, "HTTP error: Regular expression doesn't match\n");
+#endif
+                        }
+                        break;
+                case OPERATOR_NOTEQUAL:
+                        if (regex_return == 0) {
+                                socket_setError(socket, "HTTP error: Regular expression matches\n");
+                        } else {
+                                rv = TRUE;
+                                DEBUG("HTTP: Regular expression doesn't match\n");
+                        }
+                        break;
+                default:
+                        socket_setError(socket, "HTTP error: Invalid content operator\n");
+        }
+
+error:
+        FREE(buf);
+        return rv;
+}
+
+
+static int check_request_checksum(Socket_T socket, int content_length, char *checksum, int hashtype) {
+        int n, keylength = 0;
+        MD_T result, hash;
+        md5_context_t ctx_md5;
+        sha1_context_t ctx_sha1;
+        char buf[READ_SIZE];
+
+        if (content_length <= 0) {
+                DEBUG("HTTP warning: Response does not contain a valid Content-Length -- cannot compute checksum\n");
+                return TRUE;
+        }
+
+        switch (hashtype) {
+                case HASH_MD5:
+                        md5_init(&ctx_md5);
+                        for (n = 0; content_length > 0; content_length -= n) {
+                                if ((n = socket_read(socket, buf, content_length > sizeof(buf) ? sizeof(buf) : content_length)) < 0)
+                                        break;
+                                md5_append(&ctx_md5, (const md5_byte_t *)buf, n);
+                        }
+                        md5_finish(&ctx_md5, (md5_byte_t *)hash);
+                        keylength = 16; /* Raw key bytes not string chars! */
+                        break;
+                case HASH_SHA1:
+                        sha1_init(&ctx_sha1);
+                        for (n = 0; content_length > 0; content_length -= n) {
+                                if ((n = socket_read(socket, buf, content_length > sizeof(buf) ? sizeof(buf) : content_length)) < 0)
+                                        break;
+                                sha1_append(&ctx_sha1, (md5_byte_t *)buf, n);
+                        }
+                        sha1_finish(&ctx_sha1, (md5_byte_t *)hash);
+                        keylength = 20; /* Raw key bytes not string chars! */
+                        break;
+                default:
+                        socket_setError(socket, "HTTP checksum error: Unknown hash type\n");
+                        return FALSE;
+        }
+
+        if (strncasecmp(Util_digest2Bytes((unsigned char *)hash, keylength, result), checksum, keylength * 2) != 0) {
+                socket_setError(socket, "HTTP checksum error: Document checksum mismatch\n");
+                return FALSE;
+        } else {
+                DEBUG("HTTP: Succeeded testing document checksum\n");
+        }
+        return TRUE;
+}
+
+
+/**
+ * Check that the server returns a valid HTTP response as well as checksum
+ * or content regex if required
+ * @param s A socket
+ * @return TRUE if the response is valid otherwise FALSE
+ */
+static int check_request(Socket_T socket, Port_T P) {
+        int status, content_length = -1;
+        char buf[LINE_SIZE];
+        if (! socket_readln(socket, buf, LINE_SIZE)) {
+                socket_setError(socket, "HTTP: Error receiving data -- %s\n", STRERROR);
+                return FALSE;
+        }
+        Str_chomp(buf);
+        if (! sscanf(buf, "%*s %d", &status)) {
+                socket_setError(socket, "HTTP error: Cannot parse HTTP status in response: %s\n", buf);
+                return FALSE;
+        }
+        if (status >= 400) {
+                socket_setError(socket, "HTTP error: Server returned status %d\n", status);
+                return FALSE;
+        }
+        /* Get Content-Length header value */
+        while (socket_readln(socket, buf, LINE_SIZE)) {
+                if ((buf[0] == '\r' && buf[1] == '\n') || (buf[0] == '\n'))
+                        break;
+                Str_chomp(buf);
+                if (Str_startsWith(buf, "Content-Length")) {
+                        if (! sscanf(buf, "%*s%*[: ]%d", &content_length)) {
+                                socket_setError(socket, "HTTP error: Parsing Content-Length response header '%s'\n", buf);
+                                return FALSE;
+                        }
+                        if (content_length < 0) {
+                                socket_setError(socket, "HTTP error: Illegal Content-Length response header '%s'\n", buf);
+                                return FALSE;
+                        }
+                }
+        }
+        if (P->url_request && P->url_request->regex && ! do_regex(socket, content_length, P->url_request))
+                return FALSE;
+        if (P->request_checksum)
+                return check_request_checksum(socket, content_length, P->request_checksum, P->request_hashtype);
+        return TRUE;
+}
+
+
+static char *get_auth_header(Port_T P, char *auth, int l) {
+        char *b64;
+        char buf[STRLEN];
+        char *username = NULL;
+        char *password = NULL;
+
+        if (P->url_request) {
+                URL_T U = P->url_request->url;
+                if (U) {
+                        username = U->user;
+                        password = U->password;
+                }
+        }
+
+        if (! (username && password))
+                return auth;
+
+        snprintf(buf, STRLEN, "%s:%s", username, password);
+        if (! (b64 = encode_base64(strlen(buf), (unsigned char *)buf)) )
+                return auth;
+
+        snprintf(auth, l, "Authorization: Basic %s\r\n", b64);
+        FREE(b64);
+
+        return auth;
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int check_http(Socket_T socket) {
+        Port_T P;
+        char host[STRLEN];
+        char auth[STRLEN]= {0};
+        const char *request = NULL;
+        const char *hostheader = NULL;
+
+        ASSERT(socket);
+
+        P = socket_get_Port(socket);
+
+        ASSERT(P);
+
+        request = P->request ? P->request : "/";
+
+        Util_getHTTPHostHeader(socket, host, STRLEN);
+        hostheader = P->request_hostheader ? P->request_hostheader : host;
+
+        if (socket_print(socket,
+                         "GET %s HTTP/1.1\r\n"
+                         "Host: %s\r\n"
+                         "Accept: */*\r\n"
+                         "Connection: close\r\n"
+                         "User-Agent: %s/%s\r\n"
+                         "%s\r\n",
+                         request, hostheader, prog, VERSION,
+                         get_auth_header(P, auth, STRLEN)) < 0) {
+                socket_setError(socket, "HTTP: error sending data -- %s\n", STRERROR);
+                return FALSE;
+        }
+
+        return check_request(socket, P);
+}
+
diff --git a/monit-5.4/src/protocols/imap.c b/monit-5.4/src/protocols/imap.c
new file mode 100644
index 0000000..dcc830d
--- /dev/null
+++ b/monit-5.4/src/protocols/imap.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Check the server for greeting code '* OK' and then send LOGOUT and
+ *  check for code '* BYE'. If alive return TRUE, else, return FALSE.
+ *
+ *  @file
+ */
+int check_imap(Socket_T socket) {
+
+  char buf[STRLEN];
+  const char *ok= "* OK";
+  const char *bye= "* BYE";
+
+  
+  ASSERT(socket);
+  
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "IMAP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  if(strncasecmp(buf, ok, strlen(ok)) != 0) {
+    socket_setError(socket, "IMAP error: %s\n", buf);
+    return FALSE;
+  }
+  
+  if(socket_print(socket, "001 LOGOUT\r\n") < 0) {
+    socket_setError(socket, "IMAP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "IMAP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  if(strncasecmp(buf, bye, strlen(bye)) != 0) {
+    socket_setError(socket, "IMAP error: %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/ldap2.c b/monit-5.4/src/protocols/ldap2.c
new file mode 100644
index 0000000..6aef1de
--- /dev/null
+++ b/monit-5.4/src/protocols/ldap2.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Simple LDAPv2 protocol test.
+ *
+ *  Try anonymous bind to the server.
+ *
+ *  BindRequest based on RFC1777. Request and response are ASN.1
+ *  BER encoded strings. To make the test as simple as possible
+ *  we work with BER encoded data.
+ *
+ *  The test checks only if the bind was successfull - in the
+ *  case of failure it don't provide any erroneous message
+ *  analysis.
+ *
+ *  @file
+ */
+int check_ldap2(Socket_T socket) {
+
+  unsigned char buf[STRLEN];
+
+  unsigned char request[14] = {
+    0x30,	                 /** Universal Sequence TAG */
+    0x0c,	       /** Length of the packet's data part */
+
+    0x02,	                  /** Universal Integer TAG */
+    0x01,			   	 /** Integer length */
+    0x00,		   	              /** MessageID */
+
+    0x60,		    /** Application BindRequest TAG */
+    0x07,		        /** Length of the data part */
+
+    0x02,                         /** Universal Integer TAG */
+    0x01,			         /** Integer length */
+    0x02,			       /** Protocol version */	
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00,      			    /** Octet string length */
+    /* NULL */     	     	       /** Anonymous BindDN */
+
+    0x80,	        /** Context specific SimpleAuth TAG */
+    0x00     	       /** SimpleAuth (octet string) length */
+    /* NULL */     	     	  /** Anonymous Credentials */
+  };
+    
+  unsigned char response[14] = {
+    0x30,	                 /** Universal Sequence TAG */
+    0x0c,	       /** Length of the packet's data part */
+
+    0x02,	                  /** Universal Integer TAG */
+    0x01,			   	 /** Integer length */
+    0x00,		   	              /** MessageID */
+
+    0x61,		   /** Application BindResponse TAG */
+    0x07,		        /** Length of the data part */
+
+    0x0a,                      /** Universal Enumerated TAG */
+    0x01,			      /** Enumerated length */
+    0x00,			                /** Success */	
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00,      			    /** Octet string length */
+    /* NULL */     	     	              /** MatchedDN */
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00      			    /** Octet string length */
+    /* NULL */     	     	           /** ErrorMessage */
+  };
+
+  unsigned char unbind[7] = {
+    0x30,                        /** Universal Sequence TAG */
+    0x05,              /** Length of the packet's data part */
+
+    0x02,                         /** Universal Integer TAG */
+    0x01,                                /** Integer length */
+    0x01,                                     /** MessageID */
+
+    0x42,                 /** Application UnbindRequest TAG */
+    0x00                        /** Length of the data part */
+    /* NULL */
+
+  };
+
+  ASSERT(socket);
+
+
+  if(socket_write(socket, (unsigned char *)request, sizeof(request)) < 0) {
+    socket_setError(socket, "LDAP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(socket_read(socket, (unsigned char *)buf, sizeof(response)) <= 0) {
+    socket_setError(socket, "LDAP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(memcmp((unsigned char *)buf,
+	    (unsigned char *)response,
+	    sizeof(response))) {
+    socket_setError(socket, "LDAP: anonymous bind failed\n");
+    return FALSE;
+  }
+
+  if(socket_write(socket, (unsigned char *)unbind, sizeof(unbind)) < 0) {
+    socket_setError(socket, "LDAP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  return TRUE;
+    
+}
+
diff --git a/monit-5.4/src/protocols/ldap3.c b/monit-5.4/src/protocols/ldap3.c
new file mode 100644
index 0000000..afdcce8
--- /dev/null
+++ b/monit-5.4/src/protocols/ldap3.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Simple LDAPv3 protocol test.
+ *
+ *  Try anonymous bind to the server.
+ *
+ *  BindRequest based on RFC2251. Request and response are ASN.1
+ *  BER encoded strings. To make the test as simple as possible
+ *  we work with BER encoded data.
+ *
+ *  The test checks only if the bind was successfull - in the
+ *  case of failure it don't provide any erroneous message
+ *  analysis.
+ *
+ *  @file
+ */
+int check_ldap3(Socket_T socket) {
+
+  unsigned char buf[STRLEN];
+
+  unsigned char request[14] = {
+    0x30,	                 /** Universal Sequence TAG */
+    0x0c,	       /** Length of the packet's data part */
+
+    0x02,	                  /** Universal Integer TAG */
+    0x01,			   	 /** Integer length */
+    0x00,		   	              /** MessageID */
+
+    0x60,		    /** Application BindRequest TAG */
+    0x07,		        /** Length of the data part */
+
+    0x02,                         /** Universal Integer TAG */
+    0x01,			         /** Integer length */
+    0x03,			       /** Protocol version */	
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00,      			    /** Octet string length */
+    /* NULL */     	     	       /** Anonymous BindDN */
+
+    0x80,	        /** Context specific SimpleAuth TAG */
+    0x00     	       /** SimpleAuth (octet string) length */
+    /* NULL */     	     	  /** Anonymous Credentials */
+  };
+    
+  unsigned char response[14] = {
+    0x30,	                 /** Universal Sequence TAG */
+    0x0c,	       /** Length of the packet's data part */
+
+    0x02,	                  /** Universal Integer TAG */
+    0x01,			   	 /** Integer length */
+    0x00,		   	              /** MessageID */
+
+    0x61,		   /** Application BindResponse TAG */
+    0x07,		        /** Length of the data part */
+
+    0x0a,                      /** Universal Enumerated TAG */
+    0x01,			      /** Enumerated length */
+    0x00,			                /** Success */	
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00,      			    /** Octet string length */
+    /* NULL */     	     	              /** MatchedDN */
+
+    0x04,                    /** Universal Octet string TAG */
+    0x00      			    /** Octet string length */
+    /* NULL */     	     	           /** ErrorMessage */
+  };
+
+  unsigned char unbind[7] = {
+    0x30,	                 /** Universal Sequence TAG */
+    0x05,	       /** Length of the packet's data part */
+
+    0x02,	                  /** Universal Integer TAG */
+    0x01,			   	 /** Integer length */
+    0x01,		   	              /** MessageID */
+
+    0x42,	          /** Application UnbindRequest TAG */
+    0x00		        /** Length of the data part */
+    /* NULL */
+
+  };
+
+  ASSERT(socket);
+
+
+  if(socket_write(socket, (unsigned char *)request, sizeof(request)) < 0) {
+    socket_setError(socket, "LDAP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(socket_read(socket, (unsigned char *)buf, sizeof(response)) <= 0) {
+    socket_setError(socket, "LDAP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(memcmp((unsigned char *)buf,
+	    (unsigned char *)response,
+	    sizeof(response))) {
+    socket_setError(socket, "LDAP: anonymous bind failed\n");
+    return FALSE;
+  }
+
+  if(socket_write(socket, (unsigned char *)unbind, sizeof(unbind)) < 0) {
+    socket_setError(socket, "LDAP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  return TRUE;
+    
+}
+
diff --git a/monit-5.4/src/protocols/lmtp.c b/monit-5.4/src/protocols/lmtp.c
new file mode 100644
index 0000000..6e0cc84
--- /dev/null
+++ b/monit-5.4/src/protocols/lmtp.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+
+/* --------------------------------------------------------------- Private */
+
+
+static int do_send(Socket_T socket, char *msg) {
+        
+        if(socket_write(socket, msg, strlen(msg)) < 0) {
+                socket_setError(socket, "LMTP: error sending data -- %s\n", STRERROR);
+                return FALSE;
+        }
+        
+        return TRUE;
+        
+}
+
+
+static int expect(Socket_T socket, int expect, int log) {
+        
+        int status;
+        char buf[STRLEN];
+        
+        if(!socket_readln(socket, buf, STRLEN)) {
+                socket_setError(socket, "LMTP: error receiving data -- %s\n", STRERROR);
+                return FALSE;
+        }
+        
+        Str_chomp(buf);
+        
+        sscanf(buf, "%d%*s", &status);
+        if(status != expect) {
+                if(log) 
+                        socket_setError(socket, "LMTP error: %s\n", buf);
+                return FALSE;
+        }
+        
+        return TRUE;
+        
+}
+
+
+
+/**
+ * Check the server for greeting code 220 and send LHLO and test
+ * for return code 250 and finally send QUIT and check
+ * for return code 221. If alive return TRUE else return FALSE.
+ * See rfc2033
+ *
+ *  @file
+ */
+int check_lmtp(Socket_T socket) {
+    
+  ASSERT(socket);
+  
+  if(!expect(socket, 220, TRUE))
+    return FALSE;
+  
+  if (!(do_send(socket, "LHLO localhost\r\n") && expect(socket, 250, TRUE)))
+      return FALSE;
+
+  if(!(do_send(socket, "QUIT\r\n") && expect(socket, 221, TRUE)))
+    return FALSE;
+    
+  return TRUE;
+  
+}
+
+
diff --git a/monit-5.4/src/protocols/memcache.c b/monit-5.4/src/protocols/memcache.c
new file mode 100644
index 0000000..2bb7730
--- /dev/null
+++ b/monit-5.4/src/protocols/memcache.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+#define MEMCACHELEN 24
+
+/* Magic Byte */
+#define MAGIC_REQUEST      0x80
+#define MAGIC_RESPONSE     0x81
+
+/* Response Status */
+#define NO_ERROR           0x0000
+#define KEY_NOT_FOUND      0x0001
+#define KEY_EXISTS         0x0002
+#define VALUE_TOO_BIG      0x0003
+#define INVALID_ARGUMENTS  0x0004
+#define ITEM_NOT_STORED    0x0005
+#define UNKNOWN_COMMAND    0x0081
+#define OUT_OF_MEMORY      0x0082
+
+/**
+ *  Memcache binary protocol
+ *
+ *  Send No-op request
+ *
+ *  @file
+ */
+int check_memcache(Socket_T socket) {
+  unsigned int length;
+  unsigned char response[STRLEN];
+  unsigned int status;
+  
+  unsigned char request[MEMCACHELEN] = {
+    MAGIC_REQUEST,                    /** Magic */ 
+    0x0a,                             /** Opcode */
+    0x00, 0x00,                       /** Key length */
+    0x00,                             /** Extra length */
+    0x00,                             /** Data type */
+    0x00, 0x00,                       /** request Reserved / response Status */
+    0x00, 0x00, 0x00, 0x00,           /** Total body */
+    0x00, 0x00, 0x00, 0x00,           /** Opaque */
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00    /** CAS */
+  };
+
+  ASSERT(socket);
+
+  if(socket_write(socket, (unsigned char *)request, sizeof(request)) <= 0) {
+    socket_setError(socket, "MEMCACHE: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Response should have at least MEMCACHELEN bytes */
+  length = socket_read(socket, (unsigned char *)response, sizeof(response));
+  if (length != MEMCACHELEN) {
+    socket_setError(socket, "MEMCACHE: Received %d bytes from server, expected %d bytes\n", length, MEMCACHELEN);
+    return FALSE;
+  }
+
+  if(response[0] != MAGIC_RESPONSE) {
+    socket_setError(socket, "MEMCACHELEN: Invalid response code -- error occured\n");
+    return FALSE;
+  }
+
+  status = (response[6] << 8) | response[7];
+  switch( status ) {
+    case NO_ERROR:
+      return TRUE;
+    case OUT_OF_MEMORY:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Out of memory\n");
+      return FALSE;
+    case UNKNOWN_COMMAND:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Unknown command\n");
+      return FALSE;
+    case INVALID_ARGUMENTS:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Invalid arguments\n");
+      return FALSE;
+    case VALUE_TOO_BIG:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Value too big\n");
+      return FALSE;
+    case ITEM_NOT_STORED:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Item not stored\n");
+      return FALSE;
+    case KEY_NOT_FOUND:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Key not found\n");
+      return FALSE;
+    case KEY_EXISTS:
+      socket_setError(socket, "MEMCACHELEN: Invalid response code -- Key exists\n");
+      return FALSE;
+    default:
+      socket_setError(socket, "MEMCACHELEN: Unknow response code %u -- error occured\n", status);
+      return FALSE;
+  }
+}
+
+ 
diff --git a/monit-5.4/src/protocols/mysql.c b/monit-5.4/src/protocols/mysql.c
new file mode 100644
index 0000000..a38bf4d
--- /dev/null
+++ b/monit-5.4/src/protocols/mysql.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Simple MySQL test.
+ *
+ *  In the case that the anonymous login is possible,
+ *  we will perform MySQL ping. If authentication failed
+ *  we suppose the anonymous login is denied and we will
+ *  return success, because the server at least performed
+ *  authentication => it seems it works.
+ *
+ *  @file
+ */
+int check_mysql(Socket_T socket) {
+
+  unsigned char buf[STRLEN];
+
+  unsigned char requestLogin[10] = {
+    0x06,                                 /** Packet Length */
+    0x00,
+    0x00,
+
+    0x01,                                 /** Packet Number */
+
+    0x00,                                         /** Flags */
+
+    0x00,                                    /** Max Packet */
+    0x00,
+    0x00,
+
+    0x00,                                       /** Username*/
+
+    0x00                                        /** Password*/
+  };
+
+  unsigned char requestPing[5] = {
+    0x01,                                 /** Packet Length */
+    0x00,
+    0x00,
+
+    0x00,                                 /** Packet Number */
+
+    0x0E                                   /** Command Ping */
+  };
+
+  unsigned char responsePing[5] = {
+    0x03,                                 /** Packet Length */
+    0x00,
+    0x00,
+
+    0x01,                                 /** Packet Number */
+
+    0x00                               /** Response Code OK */
+
+                                        /** Padding Ignored */
+  };
+
+  unsigned char requestQuit[5] = {
+    0x01,                                 /** Packet Length */
+    0x00,
+    0x00,
+
+    0x00,                                 /** Packet Number */
+
+    0x01                                   /** Command Quit */
+  };
+
+  ASSERT(socket);
+
+  if(!socket_readln(socket, (char *)buf, sizeof(buf))) {
+    socket_setError(socket, "MYSQL: error receiving greeting -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(socket_write(socket, requestLogin, sizeof(requestLogin)) < 0) {
+    socket_setError(socket, "MYSQL: error sending login -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* read just first few bytes  which contains enough information */
+  errno = 0;
+  if(socket_read(socket, buf, 7) <= 6) {
+    socket_setError(socket, "MYSQL: error receiving login response\n");
+    return FALSE;
+  }
+
+  /* Compare Packet Number: */
+  if(buf[3] != 0x02) {
+    socket_setError(socket, "MYSQL: invalid response packet number\n");
+    return FALSE;
+  }
+
+  /* Compare Response Code: */
+  if(buf[4] == 0x00) {
+    /* If OK, we are loged in and will perform MySQL ping */
+    if(socket_write(socket, (unsigned char *)requestPing, sizeof(requestPing)) < 0) {
+      socket_setError(socket, "MYSQL: error sending ping -- %s\n", STRERROR);
+      return FALSE;
+    }
+
+    if(socket_read(socket, buf, sizeof(responsePing)) <= 0) {
+      socket_setError(socket, "MYSQL: error receiving ping response -- %s\n", STRERROR);
+      return FALSE;
+    }
+
+    if(memcmp((unsigned char *)buf,
+  	      (unsigned char *)responsePing, sizeof(responsePing))) {
+      socket_setError(socket, "MYSQL: ping failed\n");
+      return FALSE;
+    }
+
+    if(socket_write(socket, (unsigned char *)requestQuit, sizeof(requestQuit)) < 0) {
+      socket_setError(socket, "MYSQL: error sending quit -- %s\n", STRERROR);
+      return FALSE;
+    }
+
+    return TRUE;
+  } else if((buf[4] == 0xFF) && ((buf[5] == 0x15 && buf[6] == 0x04) || (buf[5] == 0xE3 && buf[6] == 0x04) || (buf[5] == 0x13 && buf[6] == 0x04))) {
+    /* If access denied (1045) or server requires newer authentication protocol (1251) or bad handshake (1043) return success immediately */
+    return TRUE;
+  }
+
+  socket_setError(socket, "MYSQL: login failed (error code %d)\n", buf[6] * 256 + buf[5]);
+
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/protocols/nntp.c b/monit-5.4/src/protocols/nntp.c
new file mode 100644
index 0000000..f09a460
--- /dev/null
+++ b/monit-5.4/src/protocols/nntp.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Check the server for greeting code 200 and then send a QUIT and
+ *  check for code 205. If alive return TRUE, else, return FALSE.
+ *
+ *  @file
+ */
+int check_nntp(Socket_T socket) {
+
+  int status= 0;
+  char buf[STRLEN];
+
+  ASSERT(socket);
+
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "NNTP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  sscanf(buf, "%d %*s", &status);
+  if(status != 200) {
+    socket_setError(socket, "NNTP error: %s\n", buf);
+    return FALSE;
+  }
+  
+  if(socket_print(socket, "QUIT\r\n") < 0) {
+    socket_setError(socket, "NNTP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "NNTP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+
+  sscanf(buf, "%d %*s", &status);
+  if(status != 205) {
+    socket_setError(socket, "NNTP error: %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/ntp3.c b/monit-5.4/src/protocols/ntp3.c
new file mode 100644
index 0000000..5060504
--- /dev/null
+++ b/monit-5.4/src/protocols/ntp3.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "protocol.h"
+
+
+/**
+ *  NTP (Network time procol) version 3 test
+ *
+ *  Synchronization request based on RFC1305.
+ *
+ *
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+#define NTPLEN           48
+#define NTP_LEAP_NOWARN   0 /** Leap Indicator: No warning             */
+#define NTP_LEAP_NOTSYNC  3 /** Leap Indicator: Clock not synchronized */
+#define NTP_VERSION       3 /** Version Number: 3                      */
+#define NTP_MODE_CLIENT   3 /** Mode:           Client                 */
+#define NTP_MODE_SERVER   4 /** Mode:           Server                 */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int check_ntp3(Socket_T socket) 
+{
+  int  br;
+  char ntpRequest[NTPLEN];
+  char ntpResponse[NTPLEN];
+
+  ASSERT(socket);
+
+  memset(ntpRequest, 0, NTPLEN);
+  memset(ntpResponse, 0, NTPLEN);
+
+  /*
+    Prepare NTP request. The first octet consists of:
+       bits 0-1 ... Leap Indicator
+       bits 2-4 ... Version Number
+       bits 5-7 ... Mode
+   */
+  ntpRequest[0]=
+    (NTP_LEAP_NOTSYNC << 6)
+    |
+    (NTP_VERSION << 3)
+    |
+    (NTP_MODE_CLIENT);
+
+  /* Send request to NTP server */
+  if(socket_write(socket, ntpRequest, NTPLEN) <= 0 ) {
+    socket_setError(socket, "NTP: error sending NTP request -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Receive and validate response */
+  if( (br= socket_read(socket, ntpResponse, NTPLEN)) <= 0) {
+    socket_setError(socket, "NTP: did not receive answer from server -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if( br != NTPLEN ) {
+    socket_setError(socket, "NTP: Received %d bytes from server, expected %d bytes\n",
+      br, NTPLEN);
+    return FALSE;
+  }
+
+  /*
+    Compare NTP response. The first octet consists of:
+       bits 0-1 ... Leap Indicator
+       bits 2-4 ... Version Number
+       bits 5-7 ... Mode
+   */
+  if( (ntpResponse[0] & 0x07) != NTP_MODE_SERVER )
+  {
+    socket_setError(socket, "NTP: Server mode error\n");
+    return FALSE;
+  }
+  if( (ntpResponse[0] & 0x38) != NTP_VERSION<<3 )
+  {
+    socket_setError(socket, "NTP: Server protocol version error\n");
+    return FALSE;
+  }
+  if( (ntpResponse[0] & 0xc0) == NTP_LEAP_NOTSYNC<<6 )
+  {
+    socket_setError(socket, "NTP: Server not synchronized\n");
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/pgsql.c b/monit-5.4/src/protocols/pgsql.c
new file mode 100644
index 0000000..ad9849d
--- /dev/null
+++ b/monit-5.4/src/protocols/pgsql.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  PostgreSQL test.
+ *
+ *  @file
+ */
+int check_pgsql(Socket_T socket) {
+
+  unsigned char buf[STRLEN];
+
+  unsigned char requestLogin[33] = {
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x21,
+
+    0x00,                              /** ProtoVer 3.0 */
+    0x03,
+    0x00,
+    0x00,
+
+    0x75, 0x73, 0x65, 0x72, 0x00,      /** user */
+    0x72, 0x6f, 0x6f, 0x74, 0x00,      /** root */
+
+    0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x00,  /** database */
+    0x72, 0x6f, 0x6f, 0x74, 0x00,                          /** root */
+
+    0x00
+  };
+
+  /** Doing this is too suspicious maybe.
+   * Type Q, Length 19 and QUERY select 1 as a; */
+  /**
+  unsigned char requestQuery[20] = {
+    0x51,
+
+    0x00,
+    0x00,
+    0x00,
+    0x13,
+
+    0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20,
+    0x31, 0x20, 0x61, 0x73, 0x20, 0x61, 0x3b,
+
+    0x00
+  };
+  */
+
+  unsigned char requestTerm[5] = {
+    0x58,                              /** Type X */
+
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x04
+  };
+
+  unsigned char responseAuthOk[9] = {
+    0x52,                              /** Type R */
+
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x08,
+
+    0x00,                              /** OK code 0 */
+    0x00,
+    0x00,
+    0x00
+  };
+
+  ASSERT(socket);
+
+  if(socket_write(socket, (unsigned char *)requestLogin, sizeof(requestLogin)) <= 0) {
+    socket_setError(socket, "PGSQL: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /** Nine-byte is enough to hold Auth-Ok */
+  if(socket_read(socket, buf, 9) <= 0) {
+    socket_setError(socket, "PGSQL: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /** If server insists on auth error it is working anyway */
+  if(*buf=='E') {
+    return TRUE;
+  }
+
+  /** Successful connection */
+  if(!memcmp((unsigned char *)buf, (unsigned char *)responseAuthOk, 9)) {
+    /** This is where suspicious people can do SELECT query that I dont */
+    socket_write(socket, (unsigned char *)requestTerm, sizeof(requestTerm));
+    return TRUE;
+  }
+
+  /** The last possibility must be that server is demanding password */
+  if(*buf=='R') {
+    return TRUE;
+  }
+
+  socket_setError(socket, "PGSQL: unknown error\n");
+  
+  return FALSE;
+}
+
diff --git a/monit-5.4/src/protocols/pop.c b/monit-5.4/src/protocols/pop.c
new file mode 100644
index 0000000..93dec99
--- /dev/null
+++ b/monit-5.4/src/protocols/pop.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Check the server for greeting code +OK, then send QUIT and check
+ *  for code +OK. If alive return TRUE, else, return FALSE.
+ *
+ *  @file
+ */
+int check_pop(Socket_T socket) {
+
+  char buf[STRLEN];
+  const char *ok= "+OK";
+
+  ASSERT(socket);
+  
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "POP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  if(strncasecmp(buf, ok, strlen(ok)) != 0) {
+    socket_setError(socket, "POP error: %s\n", buf);
+    return FALSE;
+  }
+  
+  if(socket_print(socket, "QUIT\r\n") < 0) {
+    socket_setError(socket, "POP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "POP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+  
+  if(strncasecmp(buf, ok, strlen(ok)) != 0) {
+    socket_setError(socket, "POP error: %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/postfix_policy.c b/monit-5.4/src/protocols/postfix_policy.c
new file mode 100644
index 0000000..ed0a887
--- /dev/null
+++ b/monit-5.4/src/protocols/postfix_policy.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+
+#include "protocol.h"
+
+/**
+ *  A simple Postfix SMTP access policy delegation protocol test
+ *
+ *  To not affect real traffic, we send the following request with
+ *  fixed virtual triplet values to the server:
+ *   request=smtpd_access_policy
+ *   protocol_state=RCPT
+ *   protocol_name=SMTP
+ *   sender=monit@foo.tld
+ *   recipient=monit@foo.tld
+ *   client_address=1.2.3.4
+ *   client_name=mx.foo.tld
+ *  and check that the server replies with some action.
+ *
+ *  @file
+ */
+int check_postfix_policy(Socket_T socket) {
+
+  char buf[STRLEN];
+
+  ASSERT(socket);
+
+  if(socket_print(socket,
+    "request=smtpd_access_policy\n"
+    "protocol_state=RCPT\n"
+    "protocol_name=SMTP\n"
+    "sender=monit@foo.tld\n"
+    "recipient=monit@foo.tld\n"
+    "client_address=1.2.3.4\n"
+    "client_name=mx.foo.tld\n"
+    "\n") < 0) {
+    socket_setError(socket, "POSTFIX-POLICY: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  if(! socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "POSTFIX-POLICY: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+
+  if( (strlen(buf) <= 7) || strncasecmp(buf, "action=", 7) ) {
+    socket_setError(socket, "POSTFIX-POLICY error: %s\n",
+      *buf?buf:"no action returned");
+    return FALSE;
+  }
+  
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/protocol.c b/monit-5.4/src/protocols/protocol.c
new file mode 100644
index 0000000..817accd
--- /dev/null
+++ b/monit-5.4/src/protocols/protocol.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+static Protocol_T protocols[] = {
+        &(struct Protocol_T){"DEFAULT",         check_default},
+        &(struct Protocol_T){"HTTP",            check_http},
+        &(struct Protocol_T){"FTP",             check_ftp},
+        &(struct Protocol_T){"SMTP",            check_smtp},
+        &(struct Protocol_T){"POP",             check_pop},
+        &(struct Protocol_T){"IMAP",            check_imap},
+        &(struct Protocol_T){"NNTP",            check_nntp},
+        &(struct Protocol_T){"SSH",             check_ssh},
+        &(struct Protocol_T){"DWP",             check_dwp},
+        &(struct Protocol_T){"LDAP2",           check_ldap2},
+        &(struct Protocol_T){"LDAP3",           check_ldap3},
+        &(struct Protocol_T){"RDATE",           check_rdate},
+        &(struct Protocol_T){"RSYNC",           check_rsync},
+        &(struct Protocol_T){"generic",         check_generic},
+        &(struct Protocol_T){"APACHESTATUS",    check_apache_status},
+        &(struct Protocol_T){"NTP3",            check_ntp3},
+        &(struct Protocol_T){"MYSQL",           check_mysql},
+        &(struct Protocol_T){"DNS",             check_dns},
+        &(struct Protocol_T){"POSTFIX-POLICY",  check_postfix_policy},
+        &(struct Protocol_T){"TNS",             check_tns},
+        &(struct Protocol_T){"PGSQL",           check_pgsql},
+        &(struct Protocol_T){"CLAMAV",          check_clamav},
+        &(struct Protocol_T){"SIP",             check_sip},
+        &(struct Protocol_T){"LMTP",            check_lmtp},
+        &(struct Protocol_T){"GPS",             check_gps},
+        &(struct Protocol_T){"RADIUS",          check_radius},
+        &(struct Protocol_T){"MEMCACHE",        check_memcache}
+};
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+Protocol_T Protocol_get(Protocol_Type type) {
+        if (type >= sizeof(protocols)/sizeof(protocols[0]))
+                return protocols[0];
+        return protocols[type];
+}
+
+
diff --git a/monit-5.4/src/protocols/protocol.h b/monit-5.4/src/protocols/protocol.h
new file mode 100644
index 0000000..9677d92
--- /dev/null
+++ b/monit-5.4/src/protocols/protocol.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_PROTOCOL_H
+#define MONIT_PROTOCOL_H
+
+#include "config.h"
+
+#include "monit.h"
+#include "socket.h"
+
+
+/* Protocols supported */
+typedef enum {
+        Protocol_DEFAULT = 0,
+        Protocol_HTTP,
+        Protocol_FTP,
+        Protocol_SMTP,
+        Protocol_POP,
+        Protocol_IMAP,
+        Protocol_NNTP,
+        Protocol_SSH,
+        Protocol_DWP,
+        Protocol_LDAP2,
+        Protocol_LDAP3,
+        Protocol_RDATE,
+        Protocol_RSYNC,
+        Protocol_GENERIC,
+        Protocol_APACHESTATUS,
+        Protocol_NTP3,
+        Protocol_MYSQL,
+        Protocol_DNS,
+        Protocol_POSTFIXPOLICY,
+        Protocol_TNS,
+        Protocol_PGSQL,
+        Protocol_CLAMAV,
+        Protocol_SIP,
+        Protocol_LMTP,
+        Protocol_GPS,
+        Protocol_RADIUS,
+        Protocol_MEMCACHE       
+} Protocol_Type;
+
+
+int check_apache_status(Socket_T);
+int check_default(Socket_T);
+int check_dns(Socket_T);
+int check_dwp(Socket_T);
+int check_ftp(Socket_T);
+int check_generic(Socket_T);
+int check_http(Socket_T);
+int check_imap(Socket_T);
+int check_clamav(Socket_T);
+int check_ldap2(Socket_T);
+int check_ldap3(Socket_T);
+int check_mysql(Socket_T);
+int check_nntp(Socket_T);
+int check_ntp3(Socket_T);
+int check_postfix_policy(Socket_T);
+int check_pop(Socket_T);
+int check_smtp(Socket_T);
+int check_ssh(Socket_T);
+int check_rdate(Socket_T);
+int check_rsync(Socket_T);
+int check_tns(Socket_T);
+int check_pgsql(Socket_T);
+int check_sip(Socket_T);
+int check_lmtp(Socket_T);
+int check_gps(Socket_T);
+int check_radius(Socket_T);
+int check_memcache(Socket_T);
+
+
+/*
+ * Returns a protocol object for the given protocol type
+ */
+Protocol_T Protocol_get(Protocol_Type type);
+
+
+#endif
diff --git a/monit-5.4/src/protocols/radius.c b/monit-5.4/src/protocols/radius.c
new file mode 100644
index 0000000..a812979
--- /dev/null
+++ b/monit-5.4/src/protocols/radius.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ * Copyright (C) 2009 Alan DeKok <aland@freeradius.org> All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "md5.h"
+#include "protocol.h"
+
+
+/**
+ *  Simple RADIUS test.
+ *
+ *  We send a Status-Server packet, and expect an Access-Accept or Accounting-Response packet.
+ *
+ *
+ */
+int check_radius(Socket_T socket) {
+        int i, length, left;
+        int secret_len;
+        Port_T P;
+        md5_context_t ctx;
+        char *secret;
+        unsigned char *attr;
+        unsigned char  digest[16];
+        unsigned char  response[STRLEN];
+        unsigned char  request[38] = {
+                /* Status-Server */
+                0x0c,
+
+                /* Code, we always use zero */
+                0x00,
+
+                /* Packet length */
+                0x00,
+                0x26,
+
+                /* Request Authenticator */
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+
+                /* Message-Authenticator */
+                0x50,
+
+                /* Length */
+                0x12,
+
+                /* Contents of Message-Authenticator */
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00,
+                0x00
+        };
+
+        ASSERT(socket);
+
+        if (socket_get_type(socket) != SOCK_DGRAM) {
+                socket_setError(socket, "RADIUS: unsupported socket type -- protocol test skipped\n");
+                return TRUE;
+        }
+
+        P = socket_get_Port(socket);
+        ASSERT(P);
+  
+        secret = P->request ? P->request : "testing123";
+        secret_len = (int)strlen(secret);
+
+        /* get 16 bytes of random data */
+        for (i = 0; i < 16; i++)
+                request[i + 4] = ((unsigned int)random()) & 0xff;
+
+        /* sign the packet */
+        Util_hmacMD5(request, sizeof(request), (unsigned char *)secret, secret_len, request + 22);
+
+        if (socket_write(socket, (unsigned char *)request, sizeof(request)) < 0) {
+                socket_setError(socket, "RADIUS: error sending query -- %s\n", STRERROR);
+                return FALSE;
+        }
+
+        /* the response should have at least 20 bytes */
+        if ((length = socket_read(socket, (unsigned char *)response, sizeof(response))) < 20) {
+                socket_setError(socket, "RADIUS: error receiving response -- %s\n", STRERROR);
+                return FALSE;
+        }
+
+        /* compare the response code (should be Access-Accept or Accounting-Response) */
+        if ((response[0] != 2) && (response[0] != 5)) {
+                socket_setError(socket, "RADIUS: Invalid reply code -- error occured\n");
+                return FALSE;
+        }
+
+        /* compare the packet ID (it should be the same as in our request) */
+        if (response[1] != 0x00) {
+                socket_setError(socket, "RADIUS: ID mismatch\n");
+                return FALSE;
+        }
+
+        /* check the length */
+        if (response[2] != 0) {
+                socket_setError(socket, "RADIUS: message is too long\n");
+                return FALSE;
+        }
+
+        /* check length against packet data */
+        if (response[3] != length) {
+                socket_setError(socket, "RADIUS: message has invalid length\n");
+                return FALSE;
+        }
+
+        /* validate that it is a well-formed packet */
+        attr = response + 20;
+        left = length - 20;
+        while (left > 0) {
+                if (left < 2) {
+                        socket_setError(socket, "RADIUS: message is malformed\n");
+                        return FALSE;
+                }
+
+                if (attr[1] < 2) {
+                        socket_setError(socket, "RADIUS: message has invalid attribute length\n");
+                        return FALSE;
+                }
+
+                if (attr[1] > left) {
+                        socket_setError(socket, "RADIUS: message has attribute that is too long\n");
+                        return FALSE;
+                }
+
+                /* validate Message-Authenticator, if found */
+                if (attr[0] == 0x50) {
+                        /* FIXME: validate it */
+                }
+                left -= attr[1];
+        }
+
+        /* save the reply authenticator, and copy the request authenticator over */
+        memcpy(digest, response + 4, 16);
+        memcpy(response + 4, request + 4, 16);
+
+        md5_init(&ctx);
+        md5_append(&ctx, (const md5_byte_t *)response, length);
+        md5_append(&ctx, (const md5_byte_t *)secret, secret_len);
+        md5_finish(&ctx, response + 4);
+
+        if (memcmp(digest, response + 4, 16) != 0)
+                socket_setError(socket, "RADIUS: message fails authentication\n");
+
+        return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/rdate.c b/monit-5.4/src/protocols/rdate.c
new file mode 100644
index 0000000..6b150ec
--- /dev/null
+++ b/monit-5.4/src/protocols/rdate.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <netinet/in.h>
+#include <time.h>
+
+#include "protocol.h"
+
+/**
+ *  Check the server response, check the time it returns and accept a 
+ *  TIME_TOLERANCE sec delta with the current system time.
+ *
+ *  This test is based on RFC868. Rdate returns number of seconds since
+ *  00:00:00 UTC, January 1, 1900.
+ *
+ *  @file
+ */
+int check_rdate(Socket_T socket) {
+ 
+/* Offset of 00:00:00 UTC, January 1, 1970 from 00:00:00 UTC, January 1, 1900 */
+#define  TIME_OFFSET    2208988800UL
+#define  TIME_TOLERANCE (time_t)3
+
+  time_t delta;
+  time_t rdatet;
+  time_t systemt;
+	  
+  ASSERT(socket);
+  
+  if(socket_read(socket,(char*) &rdatet, sizeof(time_t)) <= 0) {
+    socket_setError(socket, "RDATE: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  /* Get remote time and substract offset to allow unix time comparision */
+  rdatet = ntohl(rdatet) - TIME_OFFSET;
+  
+  if((systemt = time(NULL)) == -1) {
+    socket_setError(socket, "RDATE error: cannot get system time -- %s\n", STRERROR);
+    return FALSE;
+  }
+   
+  if(rdatet >= systemt)
+    delta = (rdatet-systemt);
+  else
+    delta= (systemt-rdatet);
+ 
+  if(delta > TIME_TOLERANCE) {
+    socket_setError(socket, "RDATE error: time does not match system time -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  return TRUE;
+  
+}
+
diff --git a/monit-5.4/src/protocols/rsync.c b/monit-5.4/src/protocols/rsync.c
new file mode 100644
index 0000000..1d4a8bb
--- /dev/null
+++ b/monit-5.4/src/protocols/rsync.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+#include <ctype.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Check the server for greeting "@RSYNCD: XX, then send this greeting back
+ *  to server, send command '#list' to get a listing of modules.
+ *
+ *  @file
+ */
+int check_rsync(Socket_T socket) {
+  char  buf[64];
+  char  header[10];
+  int   rc, version_major, version_minor;
+  char  *rsyncd = "@RSYNCD:";
+  char  *rsyncd_exit = "@RSYNCD: EXIT";
+
+  ASSERT(socket);
+
+  /* Read and check the greeting */
+  if (!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "RSYNC: did not see server greeting  -- %s\n", STRERROR);
+    return FALSE;
+  }
+  Str_chomp(buf);
+  rc = sscanf(buf, "%10s %d.%d", header, &version_major, &version_minor);
+  if ((rc == EOF) || (rc != 3)) {
+    socket_setError(socket, "RSYNC: server greeting parse error %s\n", buf);
+    return FALSE;
+  }
+  if (strncasecmp(header, rsyncd, strlen(rsyncd)) != 0) {
+    socket_setError(socket, "RSYNC: server sent unexpected greeting -- %s\n", buf);
+    return FALSE;
+  }
+
+  /* Send back the greeting */
+  if (socket_print(socket, "%s\n", buf) <= 0) {
+    socket_setError(socket, "RSYNC: identification string send failed -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Send #list command */
+  if (socket_print(socket, "#list\n") < 0) {
+    socket_setError(socket, "RSYNC: #list command failed -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Read response: discard list output and check that we've received successful exit */
+  do {
+    if (! socket_readln(socket, buf, sizeof(buf))) {
+      socket_setError(socket, "RSYNC: error receiving data -- %s\n", STRERROR);
+      return FALSE;
+    }
+    Str_chomp(buf);
+  } while (strncasecmp(buf, rsyncd, strlen(rsyncd)));
+  if (strncasecmp(buf, rsyncd_exit, strlen(rsyncd_exit)) != 0) {
+    socket_setError(socket, "RSYNC: server sent unexpected response -- %s\n", buf);
+    return FALSE;
+  }
+
+  return TRUE;
+
+}
+
diff --git a/monit-5.4/src/protocols/sip.c b/monit-5.4/src/protocols/sip.c
new file mode 100644
index 0000000..0120b9b
--- /dev/null
+++ b/monit-5.4/src/protocols/sip.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2011-2012 Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif 
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif 
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#include "protocol.h"
+
+
+/**
+ *
+ *  A SIP test. 
+ *
+ *  This test has been created in order to construct valid SIP message, 
+ *  even with a low poll cycle. (In case of low poll cycle, chance are 
+ *  high for a  misinterpretation of the generic test by the SIP AS. It 
+ *  will considered it for  a retransmission, not for a new message)
+ *
+ *  The test sends an OPTIONS request and check the server's status code.
+ *
+ *  The status code must be between 200 and 300
+ *  Return TRUE if the status code is OK, otherwise FALSE
+ * 
+ *  In this current version, redirection is not supported. This code is 
+ * a rewrite of a patch we recieved from Pierrick Grasland and Bret McDanel
+ * to check the SIP protocol.
+ *
+ *  @file
+ */
+
+
+ /* -------------------------------------------------------------- Public*/ 
+
+int check_sip(Socket_T socket) {
+  int status;
+  char buf[STRLEN];
+  int port;
+  char *transport;
+  Port_T P;
+  const char *request;
+  const char *myip;
+  char *rport= "";
+  char *proto;
+
+  ASSERT(socket);
+
+  P= socket_get_Port(socket);
+  ASSERT(P);
+  request= P->request?P->request:"monit@foo.bar";
+
+  port = socket_get_local_port(socket);
+  proto = socket_is_secure(socket) ? "sips" : "sip";  
+
+  switch(socket_get_type(socket)) {
+    case SOCK_DGRAM:
+    {
+      transport="UDP";
+      rport=";rport";
+      break;
+    }
+    case SOCK_STREAM:
+    {
+      transport="TCP";
+      break;
+    }
+    default:
+    {
+      socket_setError(socket, "Unsupported socket type, only TCP and UDP are supported\n");
+      return TRUE;
+    }
+  }
+
+  myip= socket_get_local_host(socket);
+
+  if(socket_print(socket,
+    "OPTIONS %s:%s SIP/2.0\r\n"
+    "Via: SIP/2.0/%s %s:%d;branch=z9hG4bKh%u%s\r\n"
+    "Max-Forwards: %d\r\n"
+    "To: <%s:%s>\r\n"
+    "From: monit <%s:monit@%s>;tag=%d\r\n"
+    "Call-ID: %u\r\n"
+    "CSeq: 63104 OPTIONS\r\n"
+    "Contact: <%s:%s:%d>\r\n"
+    "Accept: application/sdp\r\n"
+    "Content-Length: 0\r\n"
+    "User-Agent: %s/%s\r\n\r\n",
+    proto,            // protocol
+    request,          // to
+    transport,        // via transport udp|tcp
+    myip,             // who its from
+    port,             // our port
+    random(),         // branch
+    rport,            // rport option
+    P->maxforward,    // maximum forwards
+    proto,            // protocol
+    request,          // to
+    proto,            // protocol
+    myip,             // from host
+    random(),         // tag
+    random(),         // call id
+    proto,            // protocol
+    myip,             // contact host
+    port,             // contact port
+    prog, VERSION     // user agent
+    ) < 0) {
+    socket_setError(socket, "SIP: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  if(! socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "SIP: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  Str_chomp(buf);
+
+  DEBUG("Response from SIP server: %s\n", buf);
+
+  if(! sscanf(buf, "%*s %d", &status)) { 
+    socket_setError(socket, "SIP error: cannot parse SIP status in response: %s\n", buf);
+    return FALSE;
+  }
+
+  if(status >= 400) {
+    socket_setError(socket, "SIP error: Server returned status %d\n", status);
+    return FALSE;
+  }
+
+  if(status >= 300 && status < 400) {
+    socket_setError(socket, "SIP info: Server redirection. Returned status %d\n", status); 
+    return FALSE;
+  }
+
+  if(status > 100 && status < 200) {
+    socket_setError(socket, "SIP error: Provisional response . Returned status %d\n", status);
+    return FALSE;
+  }
+
+  return TRUE;
+
+}
diff --git a/monit-5.4/src/protocols/smtp.c b/monit-5.4/src/protocols/smtp.c
new file mode 100644
index 0000000..a33538a
--- /dev/null
+++ b/monit-5.4/src/protocols/smtp.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+
+/* Private prototypes */
+static int say(Socket_T s, char *msg);
+static int expect(Socket_T s, int expect, int log);
+
+
+/**
+ * Check the server for greeting code 220 and send EHLO. If that failed
+ * try HELO and test for return code 250 and finally send QUIT and check
+ * for return code 221. If alive return TRUE else return FALSE.
+ *
+ *  @file
+ */
+int check_smtp(Socket_T socket) {
+        ASSERT(socket);
+        
+        /* Try HELO also before giving up as of rfc2821 4.1.1.1 */
+        if (expect(socket, 220, TRUE) 
+            && ((say(socket, "EHLO localhost\r\n") && expect(socket, 250, FALSE)) || (say(socket, "HELO localhost\r\n") && expect(socket, 250, TRUE))) 
+            && (say(socket, "QUIT\r\n") && expect(socket, 221, TRUE)))
+                return TRUE;
+        
+        return FALSE;
+}
+
+
+/* --------------------------------------------------------------- Private */
+
+
+static int say(Socket_T socket, char *msg) {
+        if (socket_write(socket, msg, strlen(msg)) < 0) {
+                socket_setError(socket, "SMTP: error sending data -- %s\n", STRERROR);
+                return FALSE;
+        }
+        return TRUE;
+}
+
+
+static int expect(Socket_T socket, int expect, int log) {
+        int status;
+        char buf[STRLEN];
+        
+        do {
+                if (! socket_readln(socket, buf, STRLEN)) {
+                        socket_setError(socket, "SMTP: error receiving data -- %s\n", STRERROR);
+                        return FALSE;
+                }
+                Str_chomp(buf);
+        } while (buf[3] == '-'); // Discard multi-line response
+        if (sscanf(buf, "%d", &status) != 1) {
+                if(log) 
+                        socket_setError(socket, "SMTP error: %s\n", buf);
+                return FALSE;
+        }
+        return TRUE;
+}
+
diff --git a/monit-5.4/src/protocols/ssh.c b/monit-5.4/src/protocols/ssh.c
new file mode 100644
index 0000000..a271b96
--- /dev/null
+++ b/monit-5.4/src/protocols/ssh.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#include <ctype.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  A simple 'SSH protocol version exchange' implemetation based on
+ *  RFC (http://www.openssh.com/txt/draft-ietf-secsh-transport-14.txt)
+ * 
+ *  @file
+ */
+int check_ssh(Socket_T socket) {
+
+  char  buf[STRLEN];
+
+  ASSERT(socket);
+    
+  if(!socket_readln(socket, buf, sizeof(buf))) {
+    socket_setError(socket, "SSH: error receiving identification string -- %s\n", STRERROR);
+    return FALSE;
+  }
+  
+  if(! Str_startsWith(buf, "SSH-")) {
+    socket_setError(socket, "SSH: protocol error %s\n", buf);
+    return FALSE;
+  }
+
+  /* send identification string back to server */
+  if(socket_write(socket, buf, strlen(buf)) <= 0) {
+    socket_setError(socket, "SSH: error sending identification string -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* Read one extra line to prevent the "Read from socket failed" warning */
+  socket_readln(socket, buf, sizeof(buf));
+   
+  return TRUE;
+  
+}
diff --git a/monit-5.4/src/protocols/tns.c b/monit-5.4/src/protocols/tns.c
new file mode 100644
index 0000000..f6ecc0a
--- /dev/null
+++ b/monit-5.4/src/protocols/tns.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  Simple Oracle Transparent Network Substrate protocol ping test.
+ *
+ *  @file
+ */
+
+#define TNS_TYPE_REFUSED 4
+
+int check_tns(Socket_T socket) {
+
+  unsigned char  buf[STRLEN];
+
+  unsigned char requestPing[] = {
+    0x00, 0x57,                           /** Packet Length */
+    0x00, 0x00,                           /** Packet Checksum */
+    0x01,                                 /** Packet Type: CONNECT */
+    0x00,                                 /** Reserved */
+    0x00, 0x00,                           /** Header Checksum */
+    0x01, 0x36,                           /** Version */
+    0x01, 0x2c,                           /** Compatible */
+    0x00, 0x00,                           /** Service Options */
+    0x08, 0x00,                           /** Session Data Unit Size */
+    0x7f, 0xff,                           /** Maximum Transmission Data Unit Size */
+    0xa3, 0x0a,                           /** NT Protocol Characteristics */
+    0x00, 0x00,                           /** Line Turnaround Value */
+    0x01, 0x00,                           /** Value of 1 in Hardware */
+    0x00, 0x1d,                           /** Length of Connect Data */
+    0x00, 0x3a,                           /** Offset of Connect Data */
+    0x00, 0x00, 0x00, 0x00,               /** Maximum Receivable Connect Data */
+    0x00,                                 /** Connect flags 0 */
+    0x00,                                 /** Connect flags 1 */
+    0x00, 0x00, 0x00, 0x00,               /** Trace Cross Facility Item 1 */
+    0x00, 0x00, 0x00, 0x00,               /** Trace Cross Facility Item 2 */
+    0x00, 0x00, 0x0b, 0x1c,               /** Trace Unique Connection ID */
+    0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00,
+    0x28, 0x43, 0x4f, 0x4e,               /** Connect Data */
+    0x4e, 0x45, 0x43, 0x54,               /** (CONNECT_DATA=(COMMAND=ping)) */
+    0x5f, 0x44, 0x41, 0x54,
+    0x41, 0x3d, 0x28, 0x43,
+    0x4f, 0x4d, 0x4d, 0x41,
+    0x4e, 0x44, 0x3d, 0x70,
+    0x69, 0x6e, 0x67, 0x29,
+    0x29
+  };
+
+  ASSERT(socket);
+
+  if(socket_write(socket, (unsigned char *)requestPing, sizeof(requestPing)) < 0) {
+    socket_setError(socket, "TNS: error sending ping -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* read just first few bytes which contains enough information */
+  if(socket_read(socket, (unsigned char *)buf, 5) < 5) {
+    socket_setError(socket, "TNS: error receiving ping response -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /* compare packet type */
+  if(buf[4] != TNS_TYPE_REFUSED)
+  {
+    socket_setError(socket, "TNS: invalid ping response\n");
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
diff --git a/monit-5.4/src/sendmail.c b/monit-5.4/src/sendmail.c
new file mode 100644
index 0000000..d2ca599
--- /dev/null
+++ b/monit-5.4/src/sendmail.c
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif 
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "monit.h"
+#include "net.h"
+#include "socket.h"
+#include "base64.h"
+
+// libmonit
+#include "system/Time.h"
+
+
+/**
+ *  Connect to a SMTP server and send mail.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+typedef struct {
+  Socket_T socket;
+  sigjmp_buf error;
+  const char *server;
+  int port;
+  const char *username;
+  const char *password;
+  Ssl_T ssl;
+  char localhost[STRLEN];
+} SendMail_T;
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void do_status(SendMail_T *S);
+static void open_server(SendMail_T *S);
+static void do_send(SendMail_T *S, const char *, ...);
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Send mail messages via SMTP
+ * @param mail A Mail object
+ * @return FALSE if failed, TRUE if succeeded
+ */
+int sendmail(Mail_T mail) {
+
+  int i;
+  int rv;
+  Mail_T m;
+  SendMail_T S;
+  char *b64 = NULL;
+  char now[STRLEN];
+  
+  ASSERT(mail);
+  
+  S.socket = NULL;
+  if(sigsetjmp(S.error, TRUE)) {
+    rv = FALSE;
+    goto exit;
+  } else {
+    rv = TRUE;
+  }
+  
+  open_server(&S);
+  
+  Time_gmtstring(Time_now(), now);
+  
+  snprintf(S.localhost, sizeof(S.localhost), "%s", Run.mail_hostname ? Run.mail_hostname : Run.localhostname);
+  
+  do_status(&S);
+
+  /* Use EHLO if TLS or Authentication is requested */
+  if((S.ssl.use_ssl && S.ssl.version == SSL_VERSION_TLS) || S.username) {
+    do_send(&S, "EHLO %s\r\n", S.localhost);
+  } else {
+    do_send(&S, "HELO %s\r\n", S.localhost);
+  }
+  do_status(&S);
+
+  /* Switch to TLS now if configured */
+  if(S.ssl.use_ssl && S.ssl.version == SSL_VERSION_TLS) {
+    do_send(&S, "STARTTLS\r\n"); 
+    do_status(&S);
+    if(!socket_switch2ssl(S.socket, S.ssl)) {
+      rv = FALSE;
+      goto exit;
+    }
+    /* After starttls, send ehlo again: RFC 3207: 4.2 Result of the STARTTLS Command */
+    do_send(&S, "EHLO %s\r\n", S.localhost);
+    do_status(&S);
+  }
+
+  /* Authenticate if possible */
+  if(S.username) {
+    unsigned char buffer[STRLEN];
+    int len;
+
+    len = snprintf((char *)buffer, STRLEN, "%c%s%c%s", '\0', S.username, '\0', S.password?S.password:"");
+    b64 = encode_base64(len, buffer);
+    do_send(&S, "AUTH PLAIN %s\r\n", b64); 
+    do_status(&S);
+  }
+  
+  for(i = 0, m= mail; m; m= m->next, i++) { 
+    do_send(&S, "MAIL FROM: <%s>\r\n", m->from);
+    do_status(&S);
+    do_send(&S, "RCPT TO: <%s>\r\n", m->to);
+    do_status(&S);
+    do_send(&S, "DATA\r\n");
+    do_status(&S);
+    do_send(&S, "From: %s\r\n", m->from);
+    if (m->replyto)
+      do_send(&S, "Reply-To: %s\r\n", m->replyto);
+    do_send(&S, "To: %s\r\n", m->to);
+    do_send(&S, "Subject: %s\r\n", m->subject);
+    do_send(&S, "Date: %s\r\n", now);
+    do_send(&S, "X-Mailer: %s %s\r\n", prog, VERSION);
+    do_send(&S, "Mime-Version: 1.0\r\n");
+    do_send(&S, "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n");
+    do_send(&S, "Content-Transfer-Encoding: 8bit\r\n");
+    do_send(&S, "Message-id: <%ld.%lu@%s>\r\n", time(NULL), random(), S.localhost);
+    do_send(&S, "\r\n");
+    do_send(&S, "%s\r\n", m->message);
+    do_send(&S, ".\r\n");
+    do_status(&S);
+  }
+  do_send(&S, "QUIT\r\n");
+  do_status(&S);
+  
+exit:
+  if(S.socket)
+    socket_free(&S.socket);
+  
+  FREE(b64);
+
+  return rv;
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+void do_send(SendMail_T *S, const char *s, ...) {
+  va_list ap;
+  char *msg= NULL;
+  
+  va_start(ap,s);
+  msg= Str_vcat(s, ap);
+  va_end(ap);
+  
+  if (socket_write(S->socket, msg, strlen(msg)) <= 0) {
+    FREE(msg);
+    LogError("Sendmail: error sending data to the server '%s' -- %s\n",
+	S->server, STRERROR);
+    siglongjmp(S->error, TRUE);
+  }
+  
+  FREE(msg);
+  
+}
+
+
+static void do_status(SendMail_T *S) {
+  
+  int  status;
+  char buf[STRLEN];
+  
+  if(!socket_readln(S->socket, buf, sizeof(buf))) {
+    LogError("Sendmail: error receiving data from the mailserver '%s' -- %s\n",
+	S->server, STRERROR);
+    siglongjmp(S->error, TRUE);
+  }
+  
+  Str_chomp(buf);
+  
+  sscanf(buf, "%d", &status);
+  
+  if(status >= 400) {
+    LogError("Sendmail error: %s\n", buf);
+    siglongjmp(S->error, TRUE);
+  }
+  
+}
+
+
+static void open_server(SendMail_T *S) {
+
+  MailServer_T mta= Run.mailservers;
+
+  if(mta) {
+    S->server      = mta->host;
+    S->port        = mta->port;
+    S->username    = mta->username;
+    S->password    = mta->password;
+    S->ssl         = mta->ssl;
+  } else {
+    LogError("No mail servers are defined -- see manual for 'set mailserver' statement\n");
+    siglongjmp(S->error, TRUE);
+  }
+  
+  do {
+
+    /* wait with ssl-connect if SSL_VERSION_TLS is set (rfc2487) */
+    if(!S->ssl.use_ssl || S->ssl.version == SSL_VERSION_TLS) {
+      S->socket= socket_new(S->server, S->port, SOCKET_TCP, FALSE,
+                   Run.mailserver_timeout);
+    } else {
+      S->socket= socket_create_t(S->server, S->port, SOCKET_TCP,
+                   S->ssl, Run.mailserver_timeout);
+    }
+    if(S->socket)
+      break;
+      
+    LogError("Cannot open a connection to the mailserver '%s:%i' -- %s\n",
+	S->server, S->port, STRERROR);
+
+    if(mta && (mta= mta->next)) {
+      S->server   = mta->host;
+      S->port     = mta->port;
+      S->username = mta->username;
+      S->password = mta->password;
+      S->ssl      = mta->ssl;
+      LogInfo("Trying the next mail server '%s:%i'\n", S->server, S->port);
+      continue;
+    } else {
+      LogError("No mail servers are available\n");
+      siglongjmp(S->error, TRUE);
+    }
+  } while(TRUE);
+  
+}
+
diff --git a/monit-5.4/src/sha1.c b/monit-5.4/src/sha1.c
new file mode 100644
index 0000000..fcdb93f
--- /dev/null
+++ b/monit-5.4/src/sha1.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+/*
+ * Based on 100% Public Domain SHA-1 in C By Steve Reid <sreid@sea-to-sky.net>
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include "sha1.h"
+
+#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
+
+/* blk0() and blk() perform the initial expand. */
+#ifdef WORDS_BIGENDIAN
+#define blk0(i) block->l[i]
+#else
+#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) | (rol(block->l[i],8)&0x00FF00FF))
+#endif
+#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] ^block->l[(i+2)&15]^block->l[i&15],1))
+
+/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
+#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
+#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
+#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
+#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+
+
+/* Hash a single 512-bit block. This is the core of the algorithm. */
+static void sha1_transform(unsigned int state[5], const unsigned char buffer[64]) {
+        unsigned int a, b, c, d, e;
+        typedef union {
+                unsigned char c[64];
+                unsigned int l[16];
+        } CHAR64LONG16;
+        CHAR64LONG16* block;
+
+        block = (CHAR64LONG16*)buffer;
+
+        /* Copy context->state[] to working vars */
+        a = state[0];
+        b = state[1];
+        c = state[2];
+        d = state[3];
+        e = state[4];
+
+        /* 4 rounds of 20 operations each. Loop unrolled. */
+        R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
+        R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
+        R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
+        R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
+        R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
+        R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
+        R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
+        R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
+        R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
+        R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
+        R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
+        R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
+        R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
+        R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
+        R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
+        R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
+        R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
+        R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
+        R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
+        R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
+
+        /* Add the working vars back into context.state[] */
+        state[0] += a;
+        state[1] += b;
+        state[2] += c;
+        state[3] += d;
+        state[4] += e;
+
+        /* Wipe variables */
+        a = b = c = d = e = 0;
+}
+
+
+/* Initialize new context */
+void sha1_init(sha1_context_t *context) {
+        /* SHA1 initialization constants */
+        context->state[0] = 0x67452301;
+        context->state[1] = 0xEFCDAB89;
+        context->state[2] = 0x98BADCFE;
+        context->state[3] = 0x10325476;
+        context->state[4] = 0xC3D2E1F0;
+        context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+void sha1_append(sha1_context_t *context, const unsigned char * data, const size_t len) {
+        size_t i, j;
+
+        j = (context->count[0] >> 3) & 63;
+        if ((context->count[0] += len << 3) < (len << 3))
+                context->count[1]++;
+        context->count[1] += (len >> 29);
+        if ((j + len) > 63) {
+                memcpy(&context->buffer[j], data, (i = 64-j));
+                sha1_transform(context->state, context->buffer);
+                for ( ; i + 63 < len; i += 64)
+                        sha1_transform(context->state, data + i);
+                j = 0;
+        } else {
+                i = 0;
+        }
+        memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+void sha1_finish(sha1_context_t *context, unsigned char digest[SHA1_DIGEST_SIZE]) {
+        unsigned int i;
+        unsigned char  finalcount[8];
+
+        for (i = 0; i < 8; i++)
+                finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
+        sha1_append(context, (unsigned char *)"\200", 1);
+        while ((context->count[0] & 504) != 448)
+                sha1_append(context, (unsigned char *)"\0", 1);
+        sha1_append(context, finalcount, 8);  /* Should cause a sha1_transform() */
+        for (i = 0; i < SHA1_DIGEST_SIZE; i++)
+                digest[i] = (unsigned char)((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
+
+        /* Wipe variables */
+        i = 0;
+        memset(context->buffer, 0, 64);
+        memset(context->state, 0, 20);
+        memset(context->count, 0, 8);
+        memset(finalcount, 0, 8);
+}
+
diff --git a/monit-5.4/src/sha1.h b/monit-5.4/src/sha1.h
new file mode 100644
index 0000000..404df5f
--- /dev/null
+++ b/monit-5.4/src/sha1.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef SHA1_H
+#define SHA1_H
+
+
+#define SHA1_DIGEST_SIZE 20
+
+typedef struct {
+    unsigned int state[5];
+    unsigned int count[2];
+    unsigned char buffer[64];
+} sha1_context_t;
+
+void sha1_init(sha1_context_t *context);
+void sha1_append(sha1_context_t *context, const unsigned char *data, const size_t len);
+void sha1_finish(sha1_context_t *context, unsigned char digest[SHA1_DIGEST_SIZE]);
+
+
+#endif
diff --git a/monit-5.4/src/signal.c b/monit-5.4/src/signal.c
new file mode 100644
index 0000000..005320b
--- /dev/null
+++ b/monit-5.4/src/signal.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#include "monit.h"
+
+/**
+ *  Signal handeling routines.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Replace the standard signal() function, with a more reliable
+ * using sigaction. From W. Richard Stevens' "Advanced Programming
+ * in the UNIX Environment"
+ */
+Sigfunc *signal(int signo, Sigfunc *func) {
+  
+  struct sigaction act, oact;
+
+  act.sa_handler = func;
+  sigemptyset(&act.sa_mask);
+  act.sa_flags = 0;
+  if (signo == SIGALRM) {
+#ifdef  SA_INTERRUPT
+    act.sa_flags |= SA_INTERRUPT;   /* SunOS */
+#endif
+  } else {
+#ifdef  SA_RESTART
+    act.sa_flags |= SA_RESTART;             /* SVR4, 44BSD */
+#endif
+  }
+  if (sigaction(signo, &act, &oact) < 0)
+      return(SIG_ERR);
+  
+  return(oact.sa_handler);
+  
+}
+
+
+/**
+ * Set a collective thread signal block for signals honored by monit
+ * @param new The signal mask to use for the block
+ * @param old The signal mask used to save the previous mask
+ */
+void set_signal_block(sigset_t *new, sigset_t *old) {
+
+  sigemptyset(new);
+  sigaddset(new, SIGHUP);
+  sigaddset(new, SIGINT);
+  sigaddset(new, SIGUSR1);
+  sigaddset(new, SIGTERM);
+  pthread_sigmask(SIG_BLOCK, new, old);
+
+}
+
+
+/**
+ * Set the thread signal mask back to the old mask
+ * @param old The signal mask to restore
+ */
+void unset_signal_block(sigset_t *old) {
+
+  pthread_sigmask(SIG_SETMASK, old, NULL);
+  
+}
diff --git a/monit-5.4/src/socket.c b/monit-5.4/src/socket.c
new file mode 100644
index 0000000..9e14ccb
--- /dev/null
+++ b/monit-5.4/src/socket.c
@@ -0,0 +1,553 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif 
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+
+#include "net.h"
+#include "ssl.h"
+#include "monit.h"
+#include "socket.h"
+
+// libmonit
+#include "exceptions/assert.h"
+#include "util/Str.h"
+
+
+
+/**
+ * Implementation of the socket interface.
+ * 
+ * @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+#define TYPE_LOCAL   0
+#define TYPE_ACCEPT  1
+#define RBUFFER_SIZE 1024
+
+struct Socket_T {
+        int port;
+        int type;
+        int socket;
+        char *host;
+        Port_T Port;
+        int timeout;
+        int connection_type;
+        ssl_connection *ssl;
+        ssl_server_connection *sslserver;
+        int length;
+        int offset;
+        unsigned char buffer[RBUFFER_SIZE+1];
+};
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/*
+ * Fill the internal buffer. If an error occurs or if the read
+ * operation timed out -1 is returned.
+ * @param S A Socket object
+ * @param timeout The number of seconds to wait for data to be read
+ * @return TRUE (the length of data read) or -1 if an error occured
+ */
+static int fill(Socket_T S, int timeout) {
+        
+        int n;
+        
+        S->offset = 0;
+        S->length = 0;
+        /* Optimizing, assuming a request/response pattern and that a udp_write
+         was issued before we are called, we don't have to wait for data */
+        if(S->type == SOCK_DGRAM) timeout = 0; 
+        
+        /* Read as much as we can, but only block on the first read */
+        while(RBUFFER_SIZE > S->length) {
+                
+                if(S->ssl) {
+                        n = recv_ssl_socket(S->ssl, S->buffer + S->length, RBUFFER_SIZE-S->length, timeout);
+                } else {
+                        n = (int)sock_read(S->socket, S->buffer + S->length,  RBUFFER_SIZE-S->length, timeout);
+                }
+                
+                timeout = 0;
+                
+                if(n > 0) {
+                        S->length += n;
+                        continue;
+                }  else if(n < 0) {
+                        if(errno == EAGAIN || errno == EWOULDBLOCK || S->type == SOCK_DGRAM) break;
+                        return -1;
+                } else
+                        break;
+                
+        }
+        
+        return S->length;
+        
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+Socket_T socket_new(const char *host, int port, int type, int use_ssl, int timeout) {
+        Ssl_T ssl = {.use_ssl = use_ssl, .version = SSL_VERSION_AUTO};
+        return socket_create_t(host, port, type, ssl, timeout);
+}
+
+
+Socket_T socket_create(void *port) {
+        
+        int s;
+        Port_T p = port;
+        
+        ASSERT(port);
+        
+        if((s = create_generic_socket(p)) != -1) {
+                
+                Socket_T S = NULL;
+                
+                NEW(S);
+                S->socket = s;
+                S->length = 0;
+                S->offset = 0;
+                S->type = p->type;
+                S->port = p->port;
+                S->timeout = p->timeout;
+                S->connection_type = TYPE_LOCAL;
+                
+                if(p->family == AF_UNIX) {
+                        S->host = Str_dup(LOCALHOST);
+                } else {
+                        S->host = Str_dup(p->hostname);
+                }
+                
+                if(p->SSL.use_ssl && !socket_switch2ssl(S, p->SSL)) {
+                        socket_free(&S);
+                        return NULL;
+                }
+                
+                S->Port = port;
+                return S;
+        }
+        
+        return NULL;
+}
+
+
+Socket_T socket_create_t(const char *host, int port, int type, Ssl_T ssl, int timeout) {
+        
+        int s;
+        int proto = type == SOCKET_UDP ? SOCK_DGRAM : SOCK_STREAM;
+        
+        ASSERT(host);
+        ASSERT((type == SOCKET_UDP)||(type == SOCKET_TCP));
+        if(ssl.use_ssl) {
+                ASSERT(type == SOCKET_TCP);
+        }
+        ASSERT(timeout>0);
+        
+        if((s = create_socket(host, port, proto, timeout)) != -1) {
+                
+                Socket_T S = NULL;
+                
+                NEW(S);
+                S->socket = s;
+                S->port = port;
+                S->type = proto;
+                S->timeout = timeout;
+                S->host = Str_dup(host);
+                S->connection_type = TYPE_LOCAL;
+                
+                if(ssl.use_ssl && !socket_switch2ssl(S, ssl)) {
+                        socket_free(&S);
+                        return NULL;
+                }
+                
+                return S;
+        }
+        
+        return NULL;
+}
+
+
+Socket_T socket_create_a(int socket, const char *remote_host, int port, void *sslserver) {
+        
+        Socket_T S;
+        
+        ASSERT(socket>=0);
+        ASSERT(remote_host);
+        
+        NEW(S);
+        S->port = port;
+        S->socket = socket;
+        S->type = SOCK_STREAM;
+        S->timeout = NET_TIMEOUT;
+        S->host = Str_dup(remote_host);
+        S->connection_type = TYPE_ACCEPT;
+        
+        if(sslserver) {
+                S->sslserver = sslserver;
+                if(! (S->ssl = insert_accepted_ssl_socket(S->sslserver))) {
+                        goto ssl_error;
+                }
+                if(! embed_accepted_ssl_socket(S->ssl, S->socket)) {
+                        goto ssl_error;
+                }
+        }
+        
+        return S;
+        
+ssl_error:
+        socket_free(&S);
+        return NULL;
+        
+}
+
+
+void socket_free(Socket_T *S) {
+        
+        ASSERT(S && *S);
+        
+#ifdef HAVE_OPENSSL
+        if((*S)->ssl && (*S)->ssl->handler) {
+                if((*S)->connection_type == TYPE_LOCAL) {
+                        close_ssl_socket((*S)->ssl);
+                        delete_ssl_socket((*S)->ssl);
+                } else if((*S)->connection_type == TYPE_ACCEPT && (*S)->sslserver) {
+                        close_accepted_ssl_socket((*S)->sslserver, (*S)->ssl);
+                }
+        } else
+#endif
+                
+                close_socket((*S)->socket);
+        FREE((*S)->host);
+        FREE(*S);
+        
+}
+
+
+/* ------------------------------------------------------------ Properties */
+
+
+int socket_is_ready(Socket_T S) {
+        
+        ASSERT(S);
+        
+        switch(S->type) {
+                        
+                case SOCK_STREAM:
+                        return check_socket(S->socket);
+                        
+                case SOCK_DGRAM:
+                        return check_udp_socket(S->socket);
+                        
+                default:
+                        break;
+        }
+        
+        return FALSE;
+        
+}
+
+
+int socket_is_secure(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return (S->ssl != NULL);
+        
+}
+
+
+int socket_get_socket(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return S->socket;
+        
+}
+
+
+int socket_get_type(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return S->type;
+        
+}
+
+
+void *socket_get_Port(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return S->Port;
+        
+}
+
+
+int socket_get_remote_port(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return S->port;
+        
+}
+
+
+const char *socket_get_remote_host(Socket_T S) {
+        
+        ASSERT(S);
+        
+        return S->host;
+        
+}
+
+
+int socket_get_local_port(Socket_T S) {
+        struct sockaddr sock;
+        socklen_t len = sizeof(sock);
+        
+        ASSERT(S);
+        
+        if(getsockname (S->socket, &sock, &len ) == 0)
+                return ntohs (((struct sockaddr_in *)&sock)->sin_port);
+        return -1;
+        
+}
+
+
+const char *socket_get_local_host(Socket_T S) {
+        struct sockaddr sock;
+        socklen_t len = sizeof(sock);
+        
+        ASSERT(S);
+        
+        if(getsockname(S->socket, &sock, &len) == 0) 
+                return inet_ntoa(((struct sockaddr_in *)&sock)->sin_addr);
+        return NULL;
+        
+}
+
+
+void socket_setError(Socket_T S, const char *error, ...) {
+        assert(S);
+        assert(error);
+        va_list ap;
+        va_start(ap, error);
+        vsnprintf((char*)S->buffer, RBUFFER_SIZE, error, ap);
+        va_end(ap);
+}
+
+
+const char *socket_getError(Socket_T S) {
+        assert(S);
+        return (const char *)S->buffer;
+}
+
+
+/* ---------------------------------------------------------------- Public */
+
+
+int socket_switch2ssl(Socket_T S, Ssl_T ssl)  {
+        
+        if(! (S->ssl = new_ssl_connection(ssl.clientpemfile, ssl.version)))
+                return FALSE;
+        
+        if(! embed_ssl_socket(S->ssl, S->socket))
+                return FALSE;
+        
+        if(ssl.certmd5 && !check_ssl_md5sum(S->ssl, ssl.certmd5)) {
+                LogError("md5sum of certificate does not match!");
+                return FALSE;
+        }
+        
+        return TRUE;
+}
+
+
+int socket_print(Socket_T S, const char *m, ...) {
+        int n;
+        va_list ap;
+        char *buf = NULL;
+        
+        ASSERT(S);
+        ASSERT(m);
+        
+        va_start(ap, m);
+        buf = Str_vcat(m, ap);
+        va_end(ap);
+        
+        n = socket_write(S, buf, strlen(buf));
+        FREE(buf);
+        
+        return n;
+        
+}
+
+
+int socket_write(Socket_T S, void *b, size_t size) {
+        
+        ssize_t n = 0;
+        void *p = b;
+        
+        ASSERT(S);
+        
+        /* Clear any extra data read from the server */
+        socket_reset(S);
+        
+        while(size > 0) {
+                
+                if(S->ssl) {
+                        n = send_ssl_socket(S->ssl, p, size, S->timeout);
+                } else {
+                        if(S->type == SOCK_DGRAM)
+                                n = udp_write(S->socket,  p, size, S->timeout);
+                        else
+                                n = sock_write(S->socket,  p, size, S->timeout);
+                }
+                
+                if(n <= 0) break;
+                p += n;
+                size -= n;
+                
+        }
+        
+        if(n < 0) {
+                /* No write or a partial write is an error */
+                return -1;
+        }
+        
+        return  (int)(p - b);
+        
+}
+
+
+int socket_read_byte(Socket_T S) {
+        
+        ASSERT(S);
+        
+        if(S->offset >= S->length) {
+                if(fill(S, S->timeout) <= 0)
+                        return -1;
+        }
+        
+        return S->buffer[S->offset++];
+        
+}
+
+
+int socket_read(Socket_T S, void *b, int size) {
+        
+        int c;
+        unsigned char *p = b;
+        
+        ASSERT(S);
+        
+        while((size-- > 0) && ((c = socket_read_byte(S)) >= 0)) { 
+                *p++ = c;
+        }
+        
+        return  (int)((long)p - (long)b);
+        
+}
+
+
+char *socket_readln(Socket_T S, char *s, int size) {
+        
+        int c;
+        unsigned char *p = (unsigned char *)s;
+        
+        ASSERT(S);
+        
+        while(--size && ((c = socket_read_byte(S)) > 0)) { // Stop when \0 is read
+                *p++ = c;
+                if(c == '\n')
+                        break;
+        }
+        
+        *p = 0;
+        
+        if(*s)
+                return s;
+        
+        return NULL;
+        
+}
+
+
+void socket_reset(Socket_T S) {
+        
+        ASSERT(S);
+        
+        /* Throw away any pending incomming data */
+        while(fill(S, 0) > 0);
+        S->offset = 0;
+        S->length = 0;
+        
+}
+
+
+int socket_shutdown_write(Socket_T S) {
+        ASSERT(S);
+        return (shutdown(S->socket, 1) == 0);
+}
diff --git a/monit-5.4/src/socket.h b/monit-5.4/src/socket.h
new file mode 100644
index 0000000..86ea107
--- /dev/null
+++ b/monit-5.4/src/socket.h
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_SOCKET_H
+#define MONIT_SOCKET_H
+
+#define SOCKET_TCP  1
+#define SOCKET_UDP  2
+
+
+/**
+ * This class implements a <b>Socket</b>. A socket is an endpoint for
+ * communication between two machines. 
+ * 
+ * @file
+ */
+
+
+typedef struct Socket_T *Socket_T;
+
+
+/**
+ * Create a new Socket opened against host:port. The returned Socket
+ * is a connected socket. This method can be used to create either TCP
+ * or UDP sockets and the type parameter is used to select the socket
+ * type. If the use_ssl parameter is TRUE the socket is created using
+ * SSL. Only TCP sockets may use SSL.
+ * @param host The remote host to open the Socket against. The host
+ * may be a hostname found in the DNS or an IP address string.
+ * @param port The port number to connect to
+ * @param type The socket type to use (SOCKET_TCP or SOCKET_UPD)
+ * @param use_ssl if TRUE the socket is created supporting SSL
+ * @param timeout The timeout value in seconds
+ * @return The connected Socket or NULL if an error occurred
+ */
+Socket_T socket_new(const char *host, int port, int type, int use_ssl, int timeout);
+
+
+/**
+ * Factory method for creating a new Socket from a monit Port object
+ * @param port The port object to create a socket from
+ * @return The connected Socket or NULL if an error occurred
+ */
+Socket_T socket_create(void *port);
+
+
+/**
+ * Create a new Socket opened against host:port with an explicit
+ * ssl value for connect and read. Otherwise, same as socket_new()
+ * @param host The remote host to open the Socket against. The host
+ * may be a hostname found in the DNS or an IP address string.
+ * @param port The port number to connect to
+ * @param type The socket type to use (SOCKET_TCP or SOCKET_UPD)
+ * @param ssl Options for SSL
+ * @param timeout The timeout value in seconds
+ * @return The connected Socket or NULL if an error occurred
+ */
+Socket_T socket_create_t(const char *host, int port, int type, Ssl_T ssl, int timeout);
+
+
+/**
+ * Factory method for creating a Socket object from an accepted
+ * socket. The given socket must be a socket created from accept(2).
+ * If the sslserver context is non-null the socket will support
+ * ssl. This method does only support TCP sockets.
+ * @param socket The accepted socket
+ * @param remote_host The remote host from where the socket connection
+ * originated
+ * @param port The localhost port number from where the connection
+ * arrived.
+ * @param sslserver A ssl server connection context, may be NULL
+ * @return A Socket or NULL if an error occurred
+ */
+Socket_T socket_create_a(int socket, const char *remote_host, int port, void *sslserver);
+
+
+/**
+ * Destroy a Socket object. Close the socket and release allocated
+ * resources. 
+ * @param S A Socket object reference
+ */
+void socket_free(Socket_T *S);
+
+
+/**
+ * Returns TRUE if the socket is ready for i|o
+ * @param S A Socket object
+ * @return TRUE if the socket is ready otherwise FALSE 
+ */
+int socket_is_ready(Socket_T S);
+
+
+/**
+ * Return TRUE if the connection is encrypted with SSL
+ * @param S A Socket object
+ * @return TRUE if SSL is used otherwise FALSE
+ */
+int socket_is_secure(Socket_T S);
+
+
+/**
+ * Get the underlying socket descriptor
+ * @param S A Socket object
+ * @return The socket descriptor
+ */
+int socket_get_socket(Socket_T S);
+
+
+/**
+ * Get the type of this socket.
+ * @param S A Socket object
+ * @return The socket type
+ */
+int socket_get_type(Socket_T S);
+
+
+/**
+ * Get the Port object used to create this socket. If no Port object
+ * was used this method returns NULL.
+ * @param S A Socket object
+ * @return The Port object or NULL
+ */
+void *socket_get_Port(Socket_T S);
+
+
+/**
+ * Get the remote port number the socket is connected to
+ * @param S A Socket object
+ * @return The remote host's port number
+ */
+int socket_get_remote_port(Socket_T S);
+
+
+/**
+ * Get the remote host this socket is connected to. The host is either
+ * a host name in DNS or an IP address string.
+ * @param S A Socket object
+ * @return The remote host
+ */
+const char *socket_get_remote_host(Socket_T S);
+
+
+/**
+ * Get the local (ephemeral) port number this socket is using.
+ * @param S A Socket object
+ * @return The port number on success otherwise -1
+ */
+int socket_get_local_port(Socket_T S);
+
+
+/**
+ * Get the local interface IP address
+ * @param S A Socket object
+ * @return The local host interface address or NULL if an error occurred
+ */
+const char *socket_get_local_host(Socket_T S);
+
+
+/**
+ * Writes the given error message into the Socket's internal input buffer. 
+ * This method is used to report errors and when no more reads will be 
+ * attempted. Clients should use socket_getError() to retrieve the error message.
+ * @param S A Socket_T object
+ * @param error An error string to write to the socket's internal
+ * buffer
+ */
+void socket_setError(Socket_T S, const char *error, ...);
+
+
+/**
+ * Returns an error message set via socket_setError().
+ * @param S A Socket_T object
+ * @return An error message set on the socket
+ */
+const char *socket_getError(Socket_T S);
+
+
+/**
+ * Switches a connected socket to ssl.
+ * @param S The already connected socket
+ * @param ssl Options for ssl
+ * @return TRUE if ssl is ready otherwise FALSE
+ */
+int socket_switch2ssl(Socket_T S, Ssl_T ssl);
+
+
+/**
+ * Writes a character string. Use this function to send text based
+ * messages to a client.
+ * @param S A Socket_T object
+ * @param m A String to send to the client
+ * @return The bytes sent or -1 if an error occured
+ */
+int socket_print(Socket_T S, const char *m, ...);
+
+
+/**
+ * Write size bytes from the buffer b.
+ * @param S A Socket_T object
+ * @param b The data to be written
+ * @param size The size of the data in b
+ * @return The bytes sent or -1 if an error occured
+ */
+int socket_write(Socket_T S, void *b, size_t size);
+
+
+/**
+ * Read a single byte. The byte is returned as an int in the range 0
+ * to 255.
+ * @param S A Socket_T object
+ * @return The byte read, or -1 if the end of the stream has been reached
+ */
+int socket_read_byte(Socket_T S);
+
+
+/**
+ * Reads size bytes and stores them into the byte buffer pointed to by b.
+ * @param S A Socket_T object
+ * @param b A Byte buffer
+ * @param size The size of the buffer b
+ * @return The bytes read or -1 if an error occured
+ */
+int socket_read(Socket_T S, void *b, int size);
+
+
+/**
+ * Reads in at most one less than size <code>characters</code> and
+ * stores them into the buffer pointed to by s. Reading stops after
+ * an EOF or a newline.  If a newline is read, it is stored into the
+ * buffer.  A '\0' is stored after the last character in the buffer.
+ * @param S A Socket_T object
+ * @param s A character buffer to store the string in
+ * @param size The size of the string buffer, s
+ * @return s on success, and NULL on error or when end of file occurs
+ * while no characters have been read.
+ */
+char *socket_readln(Socket_T S, char *s, int size);
+
+
+/**
+ * Clears any data that exists in the input buffer
+ * @param S A Socket_T object
+ */
+void socket_reset(Socket_T S);
+
+
+/**
+ * Shut down the writing side of the socket
+ * @param S A Socket object
+ * @return TRUE if the write side was shutdown otherwise FALSE 
+ */
+int socket_shutdown_write(Socket_T S);
+
+
+#endif
diff --git a/monit-5.4/src/spawn.c b/monit-5.4/src/spawn.c
new file mode 100644
index 0000000..acc078d
--- /dev/null
+++ b/monit-5.4/src/spawn.c
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif 
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <sys/reboot.h>
+
+#include "event.h"
+#include "alert.h"
+#include "monit.h"
+#include "engine.h"
+
+// libmonit
+#include "util/Str.h"
+#include "system/Time.h"
+
+
+/**
+ *  Function for spawning of a process. This function fork's twice to
+ *  avoid creating any zombie processes. Inspired by code from
+ *  W. Richard Stevens book, APUE.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+/* Do not exceed 8 bits here */
+enum ExitStatus_E {
+        setgid_ERROR   = 0x1,
+        setuid_ERROR   = 0x2,
+        redirect_ERROR = 0x4,
+        fork_ERROR     = 0x8
+};
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/*
+ * Setup the environment with special MONIT_xxx variables. The program
+ * executed may use such variable for various purposes.
+ */
+static void set_monit_environment(Service_T S, command_t C, Event_T E) {
+        char date[42];
+        Time_string(Time_now(), date);
+        setenv("MONIT_DATE", Str_dup(date), 1);
+        setenv("MONIT_SERVICE", S->name, 1);
+        setenv("MONIT_HOST", Run.localhostname, 1);
+        setenv("MONIT_EVENT", E ? Event_get_description(E) : C == S->start ? "Started" : C == S->stop ? "Stopped" : "No Event", 1);
+        setenv("MONIT_DESCRIPTION", E ? Event_get_message(E) : C == S->start ? "Started" : C == S->stop ? "Stopped" : "No Event", 1);
+        if (S->type == TYPE_PROCESS) {
+                putenv(Str_cat("MONIT_PROCESS_PID=%d", Util_isProcessRunning(S, FALSE)));
+                putenv(Str_cat("MONIT_PROCESS_MEMORY=%ld", S->inf->priv.process.mem_kbyte));
+                putenv(Str_cat("MONIT_PROCESS_CHILDREN=%d", S->inf->priv.process.children));
+                putenv(Str_cat("MONIT_PROCESS_CPU_PERCENT=%d", S->inf->priv.process.cpu_percent));
+        }
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Execute the given command. If the execution fails, the wait_start()
+ * thread in control.c should notice this and send an alert message.
+ * @param P A Service object
+ * @param C A Command object
+ * @param E An optional event object. May be NULL.
+ */
+void spawn(Service_T S, command_t C, Event_T E) {
+        pid_t pid;
+        sigset_t mask;
+        sigset_t save;
+        int stat_loc= 0;
+        int exit_status;
+        
+        ASSERT(S);
+        ASSERT(C);
+        
+        if(access(C->arg[0], X_OK) != 0) {
+                LogError("Error: Could not execute %s\n", C->arg[0]);
+                return;
+        }
+        
+        /*
+         * Block SIGCHLD
+         */
+        sigemptyset(&mask);
+        sigaddset(&mask, SIGCHLD);
+        pthread_sigmask(SIG_BLOCK, &mask, &save);
+        
+        pid= fork();
+        if(pid < 0) {
+            LogError("Cannot fork a new process, rebooting: %s\n", strerror(errno));
+            sync();
+            reboot(RB_AUTOBOOT);
+        }
+        
+        if(pid == 0) {
+                
+                /*
+                 * Reset to the original umask so programs will inherit the
+                 * same file creation mask monit was started with
+                 */
+                umask(Run.umask);
+                
+                /*
+                 * Switch uid/gid if requested
+                 */
+                if(C->has_gid) {
+                        if(0 != setgid(C->gid)) {
+                                stat_loc |= setgid_ERROR;
+                        }
+                }
+                if(C->has_uid) {
+                        if(0 != setuid(C->uid)) {
+                                stat_loc |= setuid_ERROR;
+                        }
+                }
+                
+                set_monit_environment(S, C, E);
+                
+                if(! Run.isdaemon) {
+                        for(int i = 0; i < 3; i++)
+                                if(close(i) == -1 || open("/dev/null", O_RDWR) != i)
+                                        stat_loc |= redirect_ERROR;
+                }
+                
+                Util_closeFds();
+                
+                setsid();
+                
+                pid = fork();
+                if(pid < 0) {
+                        stat_loc |= fork_ERROR;
+                        _exit(stat_loc);
+                }
+                
+                if(pid == 0) {
+                        /*
+                         * Reset all signals, so the spawned process is *not* created
+                         * with any inherited SIG_BLOCKs
+                         */
+                        sigemptyset(&mask);
+                        pthread_sigmask(SIG_SETMASK, &mask, NULL);
+                        signal(SIGINT, SIG_DFL);
+                        signal(SIGHUP, SIG_DFL);
+                        signal(SIGTERM, SIG_DFL);
+                        signal(SIGUSR1, SIG_DFL);
+                        signal(SIGPIPE, SIG_DFL);
+                        
+                        (void) execv(C->arg[0], C->arg);
+                        _exit(errno);
+                }
+                
+                /* Exit first child and return errors to parent */
+                _exit(stat_loc);
+        }
+        
+        /* Wait for first child - aka second parent, to exit */
+        if(waitpid(pid, &stat_loc, 0) != pid) {
+                LogError("Waitpid error\n");
+        }
+        
+        exit_status= WEXITSTATUS(stat_loc);
+        if (exit_status & setgid_ERROR)
+                LogError("Failed to change gid to '%d' for '%s'\n", C->gid, C->arg[0]);
+        if (exit_status & setuid_ERROR)
+                LogError("Failed to change uid to '%d' for '%s'\n", C->uid, C->arg[0]);
+        if (exit_status & fork_ERROR)
+                LogError("Cannot fork a new process for '%s'\n", C->arg[0]);
+        if (exit_status & redirect_ERROR)
+                LogError("Cannot redirect IO to /dev/null for '%s'\n", C->arg[0]);
+        
+        /*
+         * Restore the signal mask
+         */
+        pthread_sigmask(SIG_SETMASK, &save, NULL);
+        
+        /*
+         * We do not need to wait for the second child since we forked twice,
+         * the init system-process will wait for it. So we just return
+         */
+        
+} 
diff --git a/monit-5.4/src/ssl.c b/monit-5.4/src/ssl.c
new file mode 100644
index 0000000..ae258b5
--- /dev/null
+++ b/monit-5.4/src/ssl.c
@@ -0,0 +1,1006 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+
+#ifdef HAVE_OPENSSL
+
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_MEMORY_H
+#include <memory.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+
+#include <openssl/crypto.h>
+#include <openssl/x509.h>
+#include <openssl/x509_vfy.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+#include <openssl/bio.h>
+
+#include "monit.h"
+#include "net.h"
+#include "ssl.h"
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+#define SSLERROR ERR_error_string(ERR_get_error(),NULL)
+
+static int unsigned long ssl_thread_id();
+static void ssl_mutex_lock(int, int n, const char *, int );
+static int verify_init(ssl_server_connection *);
+static int verify_callback(int, X509_STORE_CTX *);
+static int check_preverify(X509_STORE_CTX *);
+static void cleanup_ssl_socket(ssl_connection *);
+static void cleanup_ssl_server_socket(ssl_server_connection *);
+static int handle_error(int, ssl_connection *);
+static int update_ssl_cert_data(ssl_connection *);
+static ssl_server_connection *new_ssl_server_connection(char *, char *);
+static int start_ssl();
+
+static int              ssl_initialized          = FALSE;
+static pthread_mutex_t  ssl_mutex                = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t *ssl_mutex_table;
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+/**
+ * Number of random bytes to obtain
+ */
+#define RANDOM_BYTES 1024
+
+/**
+ * The PRIMARY random device selected for seeding the PRNG. We use a
+ * non-blocking pseudo random device, to generate pseudo entropy.
+ */
+#define URANDOM_DEVICE "/dev/urandom"
+
+/**
+ * If a non-blocking device is not found on the system a blocking
+ * entropy producer is tried instead.
+ */
+#define RANDOM_DEVICE "/dev/random"
+
+
+/* The list of all ciphers suites in order of strength except those containing
+ anonymous DH ciphers, low  bit-size ciphers, export-crippled ciphers or the
+ MD5 hash algorithm */
+#define CIPHER_LIST "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"
+
+
+/**
+ *  SSL Socket methods.
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Embeds a socket in a ssl connection.
+ * @param socket the socket to be used.
+ * @return The ssl connection or NULL if an error occured.
+ */
+int embed_ssl_socket(ssl_connection *ssl, int socket) {
+        int ssl_error;
+        time_t ssl_time;
+        
+        if (!ssl)
+                return FALSE;
+        
+        if (!ssl_initialized)
+                start_ssl();
+        
+        if (socket >= 0) {
+                ssl->socket = socket;
+        } else {
+                LogError("%s: Socket error!\n", prog);
+                goto sslerror;
+        }
+        
+        if ((ssl->handler = SSL_new (ssl->ctx)) == NULL) {
+                LogError("%s: Cannot initialize the SSL handler -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (SSL_CTX_set_cipher_list(ssl->ctx, CIPHER_LIST) != 1) {
+                LogError("%s: Error setting cipher list '" CIPHER_LIST "' (no valid ciphers)", prog);
+                goto sslerror;
+        }
+        
+        set_noblock(ssl->socket);
+        
+        if ((ssl->socket_bio = BIO_new_socket(ssl->socket, BIO_NOCLOSE)) == NULL) {
+                LogError("%s: Cannot generate IO buffer -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);
+        ssl_time = time(NULL);
+        
+        while ((ssl_error = SSL_connect (ssl->handler)) < 0) {
+                if ((time(NULL) - ssl_time) > SSL_TIMEOUT) {
+                        LogError("%s: SSL service timeout!\n", prog);
+                        goto sslerror;
+                }
+                
+                if (!handle_error(ssl_error, ssl))
+                        goto sslerror;
+                
+                if (!BIO_should_retry(ssl->socket_bio))
+                        goto sslerror;
+        }
+        
+        ssl->cipher = (char *) SSL_get_cipher(ssl->handler);
+        
+        if (! update_ssl_cert_data(ssl)) {
+                LogError("%s: Cannot get the SSL server certificate!\n", prog);
+                goto sslerror;
+        }
+        
+        return TRUE;
+        
+sslerror:
+        cleanup_ssl_socket(ssl);
+        return FALSE;
+} 
+
+
+/**
+ * Compare certificate with given md5 sum
+ * @param ssl reference to ssl connection 
+ * @param md5sum string of the md5sum to test against
+ * @return TRUE, if sums do not match FALSE 
+ */
+int check_ssl_md5sum(ssl_connection *ssl, char *md5sum) {
+        unsigned int i = 0;
+        
+        ASSERT(md5sum);
+        
+        while ((i < ssl->cert_md5_len) && (md5sum[2*i] != '\0') && (md5sum[2*i+1] != '\0')) {
+                unsigned char c = (md5sum[2*i] > 57 ? md5sum[2*i] - 87 : md5sum[2*i] - 48) * 0x10+ (md5sum[2*i+1] > 57 ? md5sum[2*i+1] - 87 : md5sum[2*i+1] - 48);
+                if (c != ssl->cert_md5[i])
+                        return FALSE;
+                i++;
+        }
+        return TRUE;
+}
+
+
+/**
+ * Closes a ssl connection (ssl socket + net socket)
+ * @param ssl ssl connection
+ * @return TRUE, or FALSE if an error has occured.
+ */
+int close_ssl_socket(ssl_connection *ssl) {
+        int rv;
+        
+        if (!ssl)
+                return FALSE;
+        
+        if (! (rv = SSL_shutdown(ssl->handler))) {
+                shutdown(ssl->socket, 1);
+                rv = SSL_shutdown(ssl->handler);
+        }
+        
+        close_socket(ssl->socket);
+        cleanup_ssl_socket(ssl);
+        
+        return (rv > 0) ? TRUE : FALSE;
+}
+
+
+/**
+ * Garbage collection for non-reusable parts a ssl connection
+ * @param ssl ssl connection
+ */
+void delete_ssl_socket(ssl_connection *ssl) {
+        if (!ssl)
+                return;
+        
+        cleanup_ssl_socket(ssl);
+        
+        if (ssl->ctx && !ssl->accepted)
+                SSL_CTX_free(ssl->ctx);
+        
+        ssl->ctx = NULL;
+        
+        FREE(ssl);
+}
+
+
+/**
+ * Initializes a ssl connection for server use.
+ * @param pemfilename Filename for the key/cert file
+ * @return An ssl connection, or NULL if an error occured.
+ */
+ssl_server_connection *init_ssl_server(char *pemfile, char *clientpemfile) {
+        SSL_METHOD *server_method = NULL;
+        ssl_server_connection *ssl_server;
+        
+        ASSERT(pemfile);
+        
+        if (!ssl_initialized)
+                start_ssl();
+        
+        ssl_server = new_ssl_server_connection(pemfile, clientpemfile);
+#ifdef OPENSSL_FIPS
+        if (FIPS_mode())
+                server_method = TLSv1_server_method();
+        else
+#endif
+                server_method = SSLv23_server_method();
+        if (!(ssl_server->method = server_method)) {
+                LogError("%s: Cannot initialize the SSL method -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (!(ssl_server->ctx = SSL_CTX_new(ssl_server->method))) {
+                LogError("%s: Cannot initialize SSL server certificate handler -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (SSL_CTX_use_certificate_chain_file(ssl_server->ctx, pemfile) != 1) {
+                LogError("%s: Cannot initialize SSL server certificate -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (SSL_CTX_use_PrivateKey_file(ssl_server->ctx, pemfile, SSL_FILETYPE_PEM) != 1) {
+                LogError("%s: Cannot initialize SSL server private key -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (SSL_CTX_check_private_key(ssl_server->ctx) != 1) {
+                LogError("%s: The private key doesn't match the certificate public key -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        /* Disable session cache */
+        SSL_CTX_set_session_cache_mode(ssl_server->ctx, SSL_SESS_CACHE_OFF);
+        
+        /*
+         * We need this to force transmission of client certs
+         */
+        if (!verify_init(ssl_server)) {
+                LogError("%s: Verification engine was not properly initialized -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (ssl_server->clientpemfile) {
+                STACK_OF(X509_NAME) *stack = SSL_CTX_get_client_CA_list(ssl_server->ctx);
+                LogInfo("%s: Found %d client certificates\n", prog, sk_X509_NAME_num(stack));
+        }
+        
+        return ssl_server;
+        
+sslerror:
+        delete_ssl_server_socket(ssl_server);
+        return NULL;
+}
+
+
+/**
+ * Deletes a SSL server connection. 
+ * @param ssl_server data for ssl server connection
+ */
+void delete_ssl_server_socket(ssl_server_connection *ssl_server) {
+        if (!ssl_server)
+                return;
+        
+        cleanup_ssl_server_socket(ssl_server);
+        
+        if (ssl_server->ctx)
+                SSL_CTX_free(ssl_server->ctx);
+        
+        FREE(ssl_server);
+}
+
+
+/**
+ * Inserts an SSL connection in the connection list of a server.
+ * @param ssl_server data for ssl server connection
+ * @return new SSL connection for the connection, or NULL if failed
+ */
+ssl_connection *insert_accepted_ssl_socket(ssl_server_connection *ssl_server) {
+        ssl_connection *ssl;
+        
+        ASSERT(ssl_server);
+        
+        if (!ssl_initialized)
+                start_ssl();
+        
+        NEW(ssl);
+        ssl->method = NULL;
+        ssl->handler = NULL;
+        ssl->cert = NULL;
+        ssl->cipher = NULL;
+        ssl->socket = 0;
+        ssl->next = NULL;
+        ssl->accepted = FALSE;
+        ssl->cert_md5= NULL;
+        ssl->cert_md5_len = 0;
+        ssl->clientpemfile = NULL;
+        
+        if (ssl_server->clientpemfile != NULL)
+                ssl->clientpemfile = Str_dup(ssl_server->clientpemfile);
+        
+        LOCK(ssl_mutex);
+        
+        ssl->prev = NULL;
+        ssl->next = ssl_server->ssl_conn_list;
+        
+        if ( ssl->next != NULL )
+                ssl->next->prev = ssl;
+        
+        END_LOCK;
+        
+        ssl_server->ssl_conn_list = ssl;
+        ssl->ctx = ssl_server->ctx;
+        ssl->accepted = TRUE;
+        
+        return ssl;
+}
+
+
+/**
+ * Closes an accepted SSL server connection and deletes it form the 
+ * connection list. 
+ * @param ssl_server data for ssl server connection
+ * @param ssl data the connection to be deleted
+ */
+void close_accepted_ssl_socket(ssl_server_connection *ssl_server, ssl_connection *ssl) {
+        if (!ssl || !ssl_server)
+                return;
+        
+        close_socket(ssl->socket);
+        
+        LOCK(ssl_mutex);
+        
+        if (ssl->prev == NULL)
+                ssl_server->ssl_conn_list = ssl->next;
+        else
+                ssl->prev->next = ssl->next;
+        
+        END_LOCK;  
+        
+        delete_ssl_socket(ssl);
+}
+
+
+/**
+ * Embeds an accepted server socket in an existing ssl connection.
+ * @param ssl ssl connection
+ * @param socket the socket to be used.
+ * @return TRUE, or FALSE if an error has occured.
+ */
+int embed_accepted_ssl_socket(ssl_connection *ssl, int socket) {
+        int ssl_error;
+        time_t ssl_time;
+        
+        ASSERT(ssl);
+        
+        ssl->socket = socket;
+        
+        if (!ssl_initialized)
+                start_ssl();
+        
+        if (!(ssl->handler = SSL_new(ssl->ctx))) { 
+                LogError("%s: Cannot initialize the SSL handler -- %s\n", prog, SSLERROR);
+                return FALSE;
+        } 
+        
+        if (socket < 0) {
+                LogError("%s: Socket error!\n", prog);
+                return FALSE;
+        }
+        
+        set_noblock(ssl->socket);
+        
+        if (!(ssl->socket_bio = BIO_new_socket(ssl->socket, BIO_NOCLOSE))) {
+                LogError("%s: Cannot generate IO buffer -- %s\n", prog, SSLERROR);
+                return FALSE;
+        }
+        
+        SSL_set_bio(ssl->handler, ssl->socket_bio, ssl->socket_bio);
+        
+        ssl_time = time(NULL);
+        
+        while ((ssl_error = SSL_accept(ssl->handler)) < 0) {
+                
+                if ((time(NULL) - ssl_time) > SSL_TIMEOUT) {
+                        LogError("%s: SSL service timeout!\n", prog);
+                        return FALSE;
+                }
+                
+                if (!handle_error(ssl_error, ssl))
+                        return FALSE;
+                
+                if (!BIO_should_retry(ssl->socket_bio))
+                        return FALSE;
+                
+        }
+        
+        ssl->cipher = (char *)SSL_get_cipher(ssl->handler);
+        
+        if (!update_ssl_cert_data(ssl) && ssl->clientpemfile) {
+                LogError("%s: The client did not supply a required client certificate!\n",
+                         prog);
+                return FALSE;
+        }
+        
+        if (SSL_get_verify_result(ssl->handler) > 0) {
+                LogError("%s: Verification of the certificate has failed!\n", prog);
+                return FALSE;
+        }
+        
+        return TRUE;
+}
+
+
+/**
+ * Send data package though the ssl connection 
+ * @param ssl ssl connection
+ * @param buffer array containg the data
+ * @param len size of the data container
+ * @param timeout Seconds to wait for data to be written
+ * @return number of bytes transmitted, -1 in case of an error
+ */
+int send_ssl_socket(ssl_connection *ssl, void *buffer, size_t len, int timeout) {
+        int n = 0;
+        
+        ASSERT(ssl);
+        
+        do {
+                n = SSL_write(ssl->handler, buffer, (int)len);
+        } while (n <= 0 && BIO_should_retry(ssl->socket_bio) && can_write(ssl->socket, timeout));
+        
+        return (n > 0) ? n : -1;
+}
+
+
+/**
+ * Receive data package though the ssl connection 
+ * @param ssl ssl connection
+ * @param buffer array to hold the data
+ * @param len size of the data container
+ * @param timeout Seconds to wait for data to be available
+ * @return number of bytes transmitted, -1 in case of an error
+ */
+int recv_ssl_socket(ssl_connection *ssl, void *buffer, int len, int timeout) {
+        int n = 0;
+        
+        ASSERT(ssl);
+        
+        do {
+                n = SSL_read(ssl->handler, buffer, len);
+        } while (n < 0 && BIO_should_retry(ssl->socket_bio) && can_read(ssl->socket, timeout));
+        
+        return (n >= 0) ? n : -1;
+}
+
+
+/**
+ * Stop SSL support library
+ * @return TRUE, or FALSE if an error has occured.
+ */
+void stop_ssl() {
+        if (ssl_initialized) {
+                int i;
+                ssl_initialized = FALSE;
+                ERR_free_strings();
+                CRYPTO_set_id_callback(NULL);
+                CRYPTO_set_locking_callback(NULL);
+                for (i = 0; i < CRYPTO_num_locks(); i++)
+                        assert(pthread_mutex_destroy(&ssl_mutex_table[i]) == 0);
+                FREE(ssl_mutex_table);
+                RAND_cleanup();
+        }
+}
+
+
+/**
+ * Generate a new ssl connection
+ * @return ssl connection container
+ */
+ssl_connection *new_ssl_connection(char *clientpemfile, int sslversion) {
+        ssl_connection *ssl;
+        
+        if (!ssl_initialized)
+                start_ssl();
+        
+        NEW(ssl);
+        ssl->socket_bio = NULL; 
+        ssl->handler = NULL;
+        ssl->cert = NULL;
+        ssl->cipher = NULL;
+        ssl->socket = 0;
+        ssl->next = NULL;
+        ssl->accepted = FALSE;
+        ssl->cert_md5 = NULL;
+        ssl->cert_md5_len = 0;
+        ssl->clientpemfile = clientpemfile ? Str_dup(clientpemfile) : NULL;
+        
+        switch (sslversion) {
+                        
+                case SSL_VERSION_AUTO:
+#ifdef OPENSSL_FIPS
+                        if (FIPS_mode()) {
+                                ssl->method = TLSv1_client_method();
+                        } else
+#endif
+                                ssl->method = SSLv23_client_method();
+                        break;
+                        
+                case SSL_VERSION_SSLV2:
+#ifdef OPENSSL_NO_SSL2
+                        LogError("SSLv2 is not allowed - use either SSLv3 or TLSv1");
+                        goto sslerror;
+#else
+#ifdef OPENSSL_FIPS
+                        if (FIPS_mode()) {
+                                LogError("SSLv2 is not allowed in FIPS mode - use TLSv1");
+                                goto sslerror;
+                        } else
+#endif
+                                ssl->method = SSLv2_client_method();
+#endif
+                        break;
+                        
+                case SSL_VERSION_SSLV3:
+#ifdef OPENSSL_FIPS
+                        if (FIPS_mode()) {
+                                LogError("SSLv3 is not allowed in FIPS mode - use TLSv1");
+                                goto sslerror;
+                        } else
+#endif
+                                ssl->method = SSLv3_client_method();
+                        break;
+                        
+                case SSL_VERSION_TLS:
+                        /* fall through */
+                default:
+                        ssl->method = TLSv1_client_method();
+                        break;
+                        
+        }
+        
+        if (!ssl->method) {
+                LogError("%s: Cannot initialize SSL method -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        } 
+        
+        if (!(ssl->ctx = SSL_CTX_new(ssl->method))) {
+                LogError("%s: Cannot initialize SSL server certificate handler -- %s\n", prog, SSLERROR);
+                goto sslerror;
+        }
+        
+        if (ssl->clientpemfile) {
+                
+                if (SSL_CTX_use_certificate_chain_file(ssl->ctx, ssl->clientpemfile) <= 0) {
+                        LogError("%s: Cannot initialize SSL server certificate -- %s\n", prog, SSLERROR);
+                        goto sslerror;
+                }
+                
+                if (SSL_CTX_use_PrivateKey_file(ssl->ctx, ssl->clientpemfile, SSL_FILETYPE_PEM) <= 0) {
+                        LogError("%s: Cannot initialize SSL server private key -- %s\n", prog, SSLERROR);
+                        goto sslerror;
+                }
+                
+                if (!SSL_CTX_check_private_key(ssl->ctx)) {
+                        LogError("%s: Private key does not match the certificate public key -- %s\n", prog, SSLERROR);
+                        goto sslerror;
+                }
+                
+        }
+        
+        return ssl;
+        
+sslerror:
+        delete_ssl_socket(ssl);
+        return NULL;
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Init verification of transmitted client certs
+ */
+static int verify_init(ssl_server_connection *ssl_server) {
+        struct stat stat_buf;
+        
+        if (!ssl_server->clientpemfile) {
+                SSL_CTX_set_verify(ssl_server->ctx, SSL_VERIFY_NONE, NULL);
+                return TRUE;
+        }
+        
+        if (stat(ssl_server->clientpemfile, &stat_buf) == -1) {
+                LogError("%s: Cannot stat the SSL pem path '%s' -- %s\n", prog, Run.httpsslclientpem, STRERROR);
+                return FALSE;
+        }
+        
+        if (S_ISDIR(stat_buf.st_mode)) {
+                
+                if (!SSL_CTX_load_verify_locations(ssl_server->ctx, NULL , ssl_server->clientpemfile)) {
+                        LogError("%s: Error setting verify directory to %s -- %s\n", prog, Run.httpsslclientpem, SSLERROR);
+                        return FALSE;
+                }
+                
+                LogInfo("%s: Loaded SSL client pem directory '%s'\n", prog, ssl_server->clientpemfile);
+                
+                /* Monit's server cert for cli support */
+                
+                if (!SSL_CTX_load_verify_locations(ssl_server->ctx, ssl_server->pemfile, NULL)) {
+                        LogError("%s: Error loading verify certificates from %s -- %s\n", prog, ssl_server->pemfile, SSLERROR);
+                        return FALSE;
+                }
+                
+                LogInfo("%s: Loaded monit's SSL pem server file '%s'\n", prog, ssl_server->pemfile);
+                
+        } else if (S_ISREG(stat_buf.st_mode)) {
+                
+                if (!SSL_CTX_load_verify_locations(ssl_server->ctx, ssl_server->clientpemfile, NULL)) {
+                        LogError("%s: Error loading verify certificates from %s -- %s\n", prog, Run.httpsslclientpem, SSLERROR);
+                        return FALSE;
+                }
+                
+                LogInfo("%s: Loaded SSL pem client file '%s'\n", prog, ssl_server->clientpemfile);
+                
+                /* Monits server cert for cli support ! */
+                
+                if (!SSL_CTX_load_verify_locations(ssl_server->ctx, ssl_server->pemfile, NULL)) {
+                        LogError("%s: Error loading verify certificates from %s -- %s\n", prog, ssl_server->pemfile, SSLERROR);
+                        return FALSE;
+                }
+                
+                LogInfo("%s: Loaded monit's SSL pem server file '%s'\n", prog, ssl_server->pemfile);
+                
+                SSL_CTX_set_client_CA_list(ssl_server->ctx, SSL_load_client_CA_file(ssl_server->clientpemfile));
+                
+        } else {
+                LogError("%s: SSL client pem path is no file or directory %s\n", prog, ssl_server->clientpemfile);
+                return FALSE;
+        }
+        
+        SSL_CTX_set_verify(ssl_server->ctx, SSL_VERIFY_PEER, verify_callback);
+        
+        return TRUE;
+}
+
+
+/**
+ * Check the transmitted client certs and a compare with client cert database
+ */
+static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) {
+        char subject[STRLEN];
+        X509_OBJECT found_cert;
+        
+        X509_NAME_oneline(X509_get_subject_name(ctx->current_cert), subject, STRLEN-1);
+        
+        if (!preverify_ok && !check_preverify(ctx))
+                return 0;
+        
+        if (ctx->error_depth == 0 && X509_STORE_get_by_subject(ctx, X509_LU_X509, X509_get_subject_name(ctx->current_cert), &found_cert) != 1) {
+                LogError("%s: SSL connection rejected. No matching certificate found -- %s\n", prog, SSLERROR);
+                return 0;
+        }
+        
+        return 1; 
+}
+
+
+/**
+ * Analyse errors found before actual verification
+ * @return TRUE if successful
+ */
+static int check_preverify(X509_STORE_CTX *ctx) {
+        if ((ctx->error != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) && (ctx->error != X509_V_ERR_INVALID_PURPOSE)) {
+                /* Remote site specified a certificate, but it's not correct */
+                LogError("%s: SSL connection rejected because certificate verification has failed -- error %i\n", prog, ctx->error);
+                /* Reject connection */
+                return FALSE;
+        } 
+        
+        if (Run.allowselfcert && (ctx->error == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT)) {
+                /* Let's accept self signed certs for the moment! */
+                LogInfo("%s: SSL connection accepted with self signed certificate!\n", prog);
+                ctx->error = 0;
+                return TRUE;
+        } 
+        
+        /* Reject connection */
+        LogError("%s: SSL connection rejected because certificate verification has failed -- error %i!\n", prog, ctx->error);
+        return FALSE;
+}
+
+
+/**
+ * Helper function for the SSL threadding support
+ * @return current thread number
+ */
+static int unsigned long ssl_thread_id() {
+        return ((unsigned long) pthread_self());
+}
+
+
+/**
+ * Helper function for the SSL threadding support
+ */
+static void ssl_mutex_lock(int mode, int n, const char *file, int line) {
+        if (mode & CRYPTO_LOCK)
+                assert(pthread_mutex_lock( & ssl_mutex_table[n]) == 0);
+        else
+                assert(pthread_mutex_unlock( & ssl_mutex_table[n]) == 0);
+}
+
+
+/**
+ * Handle errors during read, write, connect and accept
+ * @return TRUE if non fatal, FALSE if non fatal and retry
+ */
+static int handle_error(int code, ssl_connection *ssl) {
+        int ssl_error = SSL_get_error(ssl->handler, code);
+        
+        switch (ssl_error) {
+                        
+                case SSL_ERROR_WANT_READ:
+                        if (can_read(ssl->socket, SSL_TIMEOUT))
+                                return TRUE;
+                        LogError("%s: Openssl read timeout error!\n", prog);
+                        break;
+                        
+                case SSL_ERROR_WANT_WRITE:
+                        if (can_read(ssl->socket, SSL_TIMEOUT))
+                                return TRUE;
+                        LogError("%s: Openssl write timeout error!\n", prog);
+                        break;
+                        
+                case SSL_ERROR_SYSCALL:
+                        LogError("%s: Openssl syscall error: %s!\n", prog, STRERROR);
+                        break;
+                        
+                case SSL_ERROR_SSL:
+                        LogError("%s: Openssl engine error: %s\n", prog, SSLERROR);
+                        break;
+                        
+                default:
+                        LogError("%s: Openssl error!\n", prog);
+                        break;
+                        
+        }
+        
+        return FALSE;
+}
+
+
+/**
+ * Garbage collection for non reusable parts of the ssl connection
+ * @param ssl ssl connection
+ */
+static void cleanup_ssl_socket(ssl_connection *ssl) {
+        if (!ssl)
+                return;
+        
+        if (ssl->cert) {
+                X509_free(ssl->cert);
+                ssl->cert = NULL;
+        }
+        
+        if (ssl->handler) {
+                SSL_free(ssl->handler);
+                ssl->handler = NULL;
+        }
+        
+        if (ssl->socket_bio) {
+                /* no BIO_free(ssl->socket_bio); necessary, because BIO is freed by ssl->handler */
+                ssl->socket_bio = NULL;
+        }
+        
+        FREE(ssl->cert_issuer);
+        FREE(ssl->cert_subject);
+        FREE(ssl->cert_md5);
+        FREE(ssl->clientpemfile);
+}
+
+
+/**
+ * Garbage collection for a SSL server connection. 
+ * @param ssl_server data for ssl server connection
+ */
+static void cleanup_ssl_server_socket(ssl_server_connection *ssl_server) {
+        if (!ssl_server)
+                return;
+        
+        FREE(ssl_server->pemfile);
+        FREE(ssl_server->clientpemfile);
+        
+        while (ssl_server->ssl_conn_list) {
+                ssl_connection *ssl = ssl_server->ssl_conn_list;
+                ssl_server->ssl_conn_list = ssl_server->ssl_conn_list->next;
+                close_accepted_ssl_socket(ssl_server, ssl);
+        }
+}
+
+
+/**
+ * Updates some data in the ssl connection
+ * @param ssl reference to ssl connection 
+ * @return TRUE, if not successful FALSE 
+ */
+static int update_ssl_cert_data(ssl_connection *ssl) {
+        unsigned char md5[EVP_MAX_MD_SIZE];
+        
+        ASSERT(ssl);
+        
+        if (!(ssl->cert = SSL_get_peer_certificate(ssl->handler)))
+                return FALSE;
+        
+#ifdef OPENSSL_FIPS
+        if (!FIPS_mode()) {
+                /* In FIPS-140 mode, MD5 is unavailable. */
+#endif
+                ssl->cert_issuer = X509_NAME_oneline (X509_get_issuer_name(ssl->cert), 0, 0);
+                ssl->cert_subject = X509_NAME_oneline (X509_get_subject_name(ssl->cert), 0, 0);
+                X509_digest(ssl->cert, EVP_md5(), md5, &ssl->cert_md5_len);
+                ssl->cert_md5= (unsigned char *)Str_dup((char *)md5);
+#ifdef OPENSSL_FIPS
+        }
+#endif
+        return TRUE;
+}
+
+
+/**
+ * Generate a new ssl server connection
+ * @return ssl server connection container
+ */
+static ssl_server_connection *new_ssl_server_connection(char * pemfile, char * clientpemfile) {
+        ssl_server_connection *ssl_server;
+        
+        ASSERT(pemfile);
+        
+        NEW(ssl_server);
+        ssl_server->ctx = NULL;
+        ssl_server->method = NULL;
+        ssl_server->server_socket = 0;
+        ssl_server->ssl_conn_list = NULL;
+        ssl_server->pemfile = Str_dup(pemfile);
+        ssl_server->clientpemfile = clientpemfile ? Str_dup(clientpemfile) : NULL;
+        
+        return ssl_server;
+}
+
+#ifdef OPENSSL_FIPS
+/**
+ * Enable FIPS mode, if it isn't enabled yet.
+ */
+void enable_fips_mode() {
+        if (!FIPS_mode()) {
+                ASSERT(FIPS_mode_set(1));
+                LogInfo("FIPS-140 mode is enabled\n");
+        }
+}
+#endif
+
+/**
+ * Start SSL support library. It has to be run before the SSL support
+ * can be used.
+ * @return TRUE, or FALSE if an error has occured.
+ */
+static int start_ssl() {
+        if (! ssl_initialized) {
+                int i;
+                int locks = CRYPTO_num_locks();
+                
+#ifdef OPENSSL_FIPS
+                if (Run.fipsEnabled)
+                        enable_fips_mode();
+#endif
+                
+                ssl_initialized = TRUE;
+                ERR_load_crypto_strings();
+                ssl_mutex_table = CALLOC(locks, sizeof(pthread_mutex_t));
+                for (i = 0; i < locks; i++)
+                        pthread_mutex_init(&ssl_mutex_table[i], NULL);
+                CRYPTO_set_id_callback(ssl_thread_id);
+                CRYPTO_set_locking_callback(ssl_mutex_lock);
+                SSL_library_init();
+                if (file_exist(URANDOM_DEVICE)) {
+                        return(RAND_load_file(URANDOM_DEVICE, RANDOM_BYTES)==RANDOM_BYTES);
+                } else if (file_exist(RANDOM_DEVICE)) {
+                        DEBUG("Gathering entropy from the random device\n");
+                        return(RAND_load_file(RANDOM_DEVICE, RANDOM_BYTES)==RANDOM_BYTES);
+                }
+                return FALSE;
+        }
+        
+        return TRUE;
+}
+
+
+#endif
+
+
diff --git a/monit-5.4/src/ssl.h b/monit-5.4/src/ssl.h
new file mode 100644
index 0000000..9f621b8
--- /dev/null
+++ b/monit-5.4/src/ssl.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#ifndef SSL_H
+#define SSL_H
+
+#include "config.h"
+
+#ifdef HAVE_OPENSSL
+#include <openssl/crypto.h>
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#ifdef OPENSSL_FIPS
+#include <openssl/fips.h>
+#endif
+#endif
+
+#define SSL_VERSION_AUTO       0
+#define SSL_VERSION_SSLV2      1
+#define SSL_VERSION_SSLV3      2
+#define SSL_VERSION_TLS        3
+#define SSL_VERSION_NONE       4
+
+/** Defines an SSL object */
+typedef struct myssl {
+        int   use_ssl;                 /**< TRUE if SSL is required for connection */
+        int   version;                  /**< The SSL version to use for connection */
+        char *certmd5;       /**< The expected md5 sum of the server's certificate */
+        char *clientpemfile;                      /**< Optional client certificate */
+} Ssl_T;
+
+
+#ifdef HAVE_OPENSSL
+
+
+typedef struct my_ssl_connection {
+        int               socket;
+        int               accepted;
+        SSL              *handler;
+        SSL_CTX          *ctx;
+        X509             *cert;
+        SSL_METHOD       *method;
+        BIO              *socket_bio;
+        const char       *cipher;
+        char             *cert_subject;
+        char             *cert_issuer;
+        unsigned char    *cert_md5;
+        unsigned int      cert_md5_len;
+        char             *clientpemfile;
+        
+        struct my_ssl_connection *prev;
+        struct my_ssl_connection *next;
+} ssl_connection;
+
+
+typedef struct my_ssl_server_connection {
+        int               server_socket;
+        SSL_METHOD       *method;
+        SSL_CTX          *ctx;
+        char             *pemfile;
+        char             *clientpemfile;
+        ssl_connection   *ssl_conn_list;
+} ssl_server_connection;
+
+
+#define                have_ssl() 1
+void                   stop_ssl();
+int                    embed_ssl_socket(ssl_connection *, int);
+int                    embed_accepted_ssl_socket(ssl_connection *, int);
+int                    close_ssl_socket(ssl_connection *);
+void                   close_accepted_ssl_socket(ssl_server_connection *, ssl_connection *);
+void                   delete_ssl_socket(ssl_connection *);
+void                   delete_ssl_server_socket(ssl_server_connection *);
+int                    check_ssl_md5sum(ssl_connection *, char *);
+int                    send_ssl_socket(ssl_connection *, void *, size_t, int);
+int                    recv_ssl_socket(ssl_connection *, void *, int, int);
+ssl_connection        *new_ssl_connection(char *, int);
+ssl_connection        *insert_accepted_ssl_socket(ssl_server_connection *);
+ssl_server_connection *init_ssl_server(char *, char *);
+#ifdef OPENSSL_FIPS
+void                   enable_fips_mode();
+#endif
+
+
+#else
+
+
+typedef void ssl_connection;
+typedef void ssl_server_connection;
+
+
+/* dummy ssl functions */
+#define have_ssl()                      0
+#define stop_ssl()
+#define embed_ssl_socket(x, y)          0
+#define embed_accepted_ssl_socket(x, y) 0
+#define close_ssl_socket(x)             0
+#define close_accepted_ssl_socket(x, y)
+#define delete_ssl_socket(x)
+#define delete_ssl_server_socket(x)
+#define check_ssl_md5sum(x, y)          0
+#define send_ssl_socket(a, b, c, d)     0
+#define recv_ssl_socket(a, b, c, d)     0
+#define new_ssl_connection(x, y)        NULL
+#define insert_accepted_ssl_socket(x)   NULL
+#define init_ssl_server(x, y)           NULL
+
+
+#endif
+
+
+#endif
diff --git a/monit-5.4/src/state.c b/monit-5.4/src/state.c
new file mode 100644
index 0000000..a9521bd
--- /dev/null
+++ b/monit-5.4/src/state.c
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+
+
+#include "monit.h"
+#include "state.h"
+
+// libmonit
+#include "exceptions/IOException.h"
+
+
+/**
+ * The list of persistent properties:
+ *
+ *    1.) service name + service type
+ *        Monit configuration may change, so the state restore needs to ignore
+ *        the removed services or services which type doesn't match (the
+ *        service name was reused for different check). The current service
+ *        runtime is thus paired with the saved service state by name and type.
+ *
+ *    2.) monitoring state
+ *        Keep the monitoring enabled or disabled on Monit restart. Useful for
+ *        example when Monit is running in active/passive cluster, so the
+ *        service monitoring mode doesn't reset when Monit needs to be reloaded
+ *        and the service won't enter unwanted passive/passive or active/active
+ *        state on multiple hosts. Another example is service which timed out
+ *        due to excessive errors or the monitoring was intentionally disabled
+ *        by admin for maintenance - do not re-enable monitoring on Monit reload.
+ *
+ *    3.) service restart counters
+ *
+ *    4.) inode number and read position for the file check
+ *        Allows to skip the content match test for the content which was checked
+ *        already to suppress duplicate events.
+ *
+ * The data are stored in binary form in the statefile using the following format:
+ *    <MAGIC><VERSION>{<SERVICE_STATE>}+
+ *
+ * When the persistent field needs to be added, update the State_Version along
+ * with State_update() and State_save(). The version allows to recognize the
+ * service state structure and file format.
+ *
+ * The backward compatibility of monitoring state restore is very important if
+ * Monit runs in cluster => keep previous formats compatibility.
+ *
+ * @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+/* Extended format version */
+typedef enum {
+        StateVersion0 = 0,
+        StateVersion1
+} State_Version;
+
+
+/* Format version 0 (Monit <= 5.3) */
+typedef struct mystate0 {
+        char               name[STRLEN];
+        int                mode;                // obsolete since Monit 5.1
+        int                nstart;
+        int                ncycle;
+        int                monitor;
+        unsigned long long error;               // obsolete since Monit 5.0
+} State0_T;
+
+
+/* Extended format version 1 */
+typedef struct mystate1 {
+        char               name[STRLEN];
+        int                type;
+        int                monitor;
+        int                nstart;
+        int                ncycle;
+        union {
+                struct {
+                        unsigned long long st_ino;
+                        unsigned long long readpos;
+                } file;
+        } priv;
+} State1_T;
+
+
+static int file = -1;
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+static void update_v0(int services) {
+        for (int i = 0; i < services; i++) {
+                State0_T state;
+                if (read(file, &state, sizeof(state)) != sizeof(state))
+                        THROW(IOException, "Unable to read service state");
+                Service_T service;
+                if ((service = Util_getService(state.name))) {
+                        service->nstart = state.nstart;
+                        service->ncycle = state.ncycle;
+                        if (state.monitor == MONITOR_NOT)
+                                service->monitor = state.monitor;
+                        else if (service->monitor == MONITOR_NOT)
+                                service->monitor = MONITOR_INIT;
+                }
+        }
+}
+
+
+static void update_v1() {
+        State1_T state;
+        while (read(file, &state, sizeof(state)) == sizeof(state)) {
+                Service_T service;
+                if ((service = Util_getService(state.name)) && service->type == state.type) {
+                        service->nstart = state.nstart;
+                        service->ncycle = state.ncycle;
+                        if (state.monitor == MONITOR_NOT)
+                                service->monitor = state.monitor;
+                        else if (service->monitor == MONITOR_NOT)
+                                service->monitor = MONITOR_INIT;
+                        if (service->type == TYPE_FILE) {
+                                service->inf->priv.file.st_ino = state.priv.file.st_ino;
+                                service->inf->priv.file.readpos = state.priv.file.readpos;
+                        }
+                }
+        }
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+int State_open() {
+        State_close();
+        if ((file = open(Run.statefile, O_RDWR | O_CREAT, 0600)) == -1) {
+                LogError("Cannot open for write -- %s\n", STRERROR);
+                return FALSE;
+        }
+        atexit(State_close);
+        return TRUE;
+}
+
+
+void State_close() {
+        if (file != -1) {
+                if (close(file) == -1)
+                        LogError("State file '%s': close error -- %s\n", Run.statefile, STRERROR);
+                else
+                        file = -1;
+        }
+}
+
+
+void State_save() {
+        TRY
+        {
+                if (ftruncate(file, 0L) == -1)
+                        THROW(IOException, "Unable to truncate");
+                if (lseek(file, 0L, SEEK_SET) == -1)
+                        THROW(IOException, "Unable to seek");
+                int magic = 0;
+                if (write(file, &magic, sizeof(magic)) != sizeof(magic))
+                        THROW(IOException, "Unable to write magic");
+                // Save always using the latest format version
+                int version = StateVersion1;
+                if (write(file, &version, sizeof(version)) != sizeof(version))
+                        THROW(IOException, "Unable to write format version");
+                for (Service_T service = servicelist; service; service = service->next) {
+                        State1_T state;
+                        memset(&state, 0, sizeof(state));
+                        snprintf(state.name, sizeof(state.name), "%s", service->name);
+                        state.type = service->type;
+                        state.monitor = service->monitor & ~MONITOR_WAITING;
+                        state.nstart = service->nstart;
+                        state.ncycle = service->ncycle;
+                        if (service->type == TYPE_FILE) {
+                                state.priv.file.st_ino = service->inf->priv.file.st_ino;
+                                state.priv.file.readpos = service->inf->priv.file.readpos;
+                        }
+                        if (write(file, &state, sizeof(state)) != sizeof(state))
+                                THROW(IOException, "Unable to write service state");
+                }
+        }
+        ELSE
+        {
+                LogError("State file '%s': %s\n", Run.statefile, Exception_frame.message);
+        }
+        END_TRY;
+}
+
+
+void State_update() {
+        TRY
+        {
+                if (lseek(file, 0L, SEEK_SET) == -1)
+                        THROW(IOException, "Unable to seek");
+                int magic;
+                if (read(file, &magic, sizeof(magic)) != sizeof(magic))
+                        THROW(IOException, "Unable to read magic");
+                if (magic > 0) {
+                        // The statefile format of Monit <= 5.3, the magic is number of services, followed by State0_T structures
+                        update_v0(magic);
+                } else {
+                        // The extended statefile format (Monit >= 5.4)
+                        int version;
+                        if (read(file, &version, sizeof(version)) != sizeof(version))
+                                THROW(IOException, "Unable to read version");
+                        // Currently the extended format has only one version, additional versions can be added here
+                        if (version == StateVersion1)
+                                update_v1();
+                        else
+                                LogWarning("State file '%s': incompatible version %d\n", Run.statefile, version);
+                }
+        }
+        ELSE
+        {
+                LogError("State file '%s': %s\n", Run.statefile, Exception_frame.message);
+        }
+        END_TRY;
+}
+
diff --git a/monit-5.4/src/state.h b/monit-5.4/src/state.h
new file mode 100644
index 0000000..980f8e1
--- /dev/null
+++ b/monit-5.4/src/state.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_STATE_H
+#define MONIT_STATE_H
+
+
+/**
+ * Management of the persistent service properties.
+ *
+ * If Monit runs in daemon mode, it saves the persistent properties of every
+ * service to the state file at the end of every poll cycle. When Monit is
+ * restarted or reloaded, it restores the state of the services from this file.
+ *
+ * The location of the state file defaults to ~/.monit.state and can be
+ * overriden on the command line or using the "set statefile" statement in the
+ * configuration file.
+ *
+ *  @file
+ */
+
+
+/**
+ * Open the state file
+ * @return TRUE if succeeded, otherwise FALSE
+ */
+int State_open();
+
+
+/**
+ * Close the state file
+ */
+void State_close();
+
+
+/**
+ * Save service state information to the state file
+ */
+void State_save();
+
+
+/**
+ * Update the current service list with data from the state file. We
+ * do change only services found in *both* the monitrc file and in
+ * the state file. The algorithm:
+ *
+ * Assume the control file was changed and a new service (B) was added
+ * so the monitrc file now contains the services: A B and C. The
+ * running monit daemon only knows the services A and C. Upon restart
+ * after a crash the monit daemon first read the monitrc file and
+ * creates the service list structure with A B and C. We then read the
+ * state file and update the service A and C since they are found in
+ * the state file, B is not found in this file and therefore not
+ * changed.
+ *
+ * The same strategy is used if a service was removed, e.g. if the
+ * service A was removed from monitrc; when reading the state file,
+ * service A is not found in the current service list (the list is
+ * always generated from monitrc) and therefore A is simply discarded.
+ */
+void State_update();
+
+
+#endif
diff --git a/monit-5.4/src/status.c b/monit-5.4/src/status.c
new file mode 100644
index 0000000..781d834
--- /dev/null
+++ b/monit-5.4/src/status.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "ssl.h"
+#include "net.h"
+#include "socket.h"
+#include "monit.h"
+#include "process.h"
+#include "device.h"
+
+
+/**
+ *  Obtain status from the monit daemon
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Show all services in the service list.
+ */
+int status(char *level) {
+        
+#define LINE 1024
+        
+        int status = FALSE;
+        Socket_T S = NULL;
+        char buf[LINE];
+        char *auth = NULL;
+        
+        if(!exist_daemon()) {
+                LogError("%s: Status not available -- the monit daemon is not running\n", prog);
+                return status;
+        }
+        S = socket_create_t(Run.bind_addr ? Run.bind_addr : "localhost", Run.httpdport, SOCKET_TCP, 
+                            (Ssl_T){.use_ssl = Run.httpdssl, .clientpemfile = Run.httpsslclientpem}, NET_TIMEOUT);
+        if (! S) {
+                LogError("%s: error connecting to the monit daemon\n", prog);
+                return status;
+        }
+        
+        auth = Util_getBasicAuthHeaderMonit();
+        socket_print(S,
+                     "GET /_status?format=text&level=%s HTTP/1.0\r\n%s\r\n",
+                     level, auth?auth:"");
+        FREE(auth);
+        
+        /* Read past HTTP headers and check status */
+        while(socket_readln(S, buf, LINE)) {
+                if(*buf == '\n' || *buf == '\r')
+                        break;
+                if(Str_startsWith(buf, "HTTP/1.0 200"))
+                        status= TRUE;
+        }
+        
+        if(!status) {
+                LogError("%s: cannot read status from the monit daemon\n", prog);
+        } else {
+                while(socket_readln(S, buf, LINE)) {
+                        printf("%s", buf);
+                }
+        }
+        socket_free(&S);
+        
+        return status;
+}
diff --git a/monit-5.4/src/tokens.h b/monit-5.4/src/tokens.h
new file mode 100644
index 0000000..38e9f31
--- /dev/null
+++ b/monit-5.4/src/tokens.h
@@ -0,0 +1,471 @@
+
+/* A Bison parser, made by GNU Bison 2.4.1.  */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program 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 General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     IF = 258,
+     ELSE = 259,
+     THEN = 260,
+     OR = 261,
+     FAILED = 262,
+     SET = 263,
+     LOGFILE = 264,
+     FACILITY = 265,
+     DAEMON = 266,
+     SYSLOG = 267,
+     MAILSERVER = 268,
+     HTTPD = 269,
+     ALLOW = 270,
+     ADDRESS = 271,
+     INIT = 272,
+     READONLY = 273,
+     CLEARTEXT = 274,
+     MD5HASH = 275,
+     SHA1HASH = 276,
+     CRYPT = 277,
+     DELAY = 278,
+     PEMFILE = 279,
+     ENABLE = 280,
+     DISABLE = 281,
+     HTTPDSSL = 282,
+     CLIENTPEMFILE = 283,
+     ALLOWSELFCERTIFICATION = 284,
+     IDFILE = 285,
+     STATEFILE = 286,
+     SEND = 287,
+     EXPECT = 288,
+     EXPECTBUFFER = 289,
+     CYCLE = 290,
+     COUNT = 291,
+     REMINDER = 292,
+     PIDFILE = 293,
+     START = 294,
+     STOP = 295,
+     PATHTOK = 296,
+     HOST = 297,
+     HOSTNAME = 298,
+     PORT = 299,
+     TYPE = 300,
+     UDP = 301,
+     TCP = 302,
+     TCPSSL = 303,
+     PROTOCOL = 304,
+     CONNECTION = 305,
+     ALERT = 306,
+     NOALERT = 307,
+     MAILFORMAT = 308,
+     UNIXSOCKET = 309,
+     SIGNATURE = 310,
+     TIMEOUT = 311,
+     RETRY = 312,
+     RESTART = 313,
+     CHECKSUM = 314,
+     EVERY = 315,
+     NOTEVERY = 316,
+     DEFAULT = 317,
+     HTTP = 318,
+     APACHESTATUS = 319,
+     FTP = 320,
+     SMTP = 321,
+     POP = 322,
+     IMAP = 323,
+     CLAMAV = 324,
+     NNTP = 325,
+     NTP3 = 326,
+     MYSQL = 327,
+     DNS = 328,
+     SSH = 329,
+     DWP = 330,
+     LDAP2 = 331,
+     LDAP3 = 332,
+     RDATE = 333,
+     RSYNC = 334,
+     TNS = 335,
+     PGSQL = 336,
+     POSTFIXPOLICY = 337,
+     SIP = 338,
+     LMTP = 339,
+     GPS = 340,
+     RADIUS = 341,
+     MEMCACHE = 342,
+     STRING = 343,
+     PATH = 344,
+     MAILADDR = 345,
+     MAILFROM = 346,
+     MAILREPLYTO = 347,
+     MAILSUBJECT = 348,
+     MAILBODY = 349,
+     SERVICENAME = 350,
+     STRINGNAME = 351,
+     NUMBER = 352,
+     PERCENT = 353,
+     LOGLIMIT = 354,
+     CLOSELIMIT = 355,
+     DNSLIMIT = 356,
+     KEEPALIVELIMIT = 357,
+     REPLYLIMIT = 358,
+     REQUESTLIMIT = 359,
+     STARTLIMIT = 360,
+     WAITLIMIT = 361,
+     GRACEFULLIMIT = 362,
+     CLEANUPLIMIT = 363,
+     REAL = 364,
+     CHECKPROC = 365,
+     CHECKFILESYS = 366,
+     CHECKFILE = 367,
+     CHECKDIR = 368,
+     CHECKHOST = 369,
+     CHECKSYSTEM = 370,
+     CHECKFIFO = 371,
+     CHECKPROGRAM = 372,
+     CHILDREN = 373,
+     SYSTEM = 374,
+     STATUS = 375,
+     RESOURCE = 376,
+     MEMORY = 377,
+     TOTALMEMORY = 378,
+     LOADAVG1 = 379,
+     LOADAVG5 = 380,
+     LOADAVG15 = 381,
+     SWAP = 382,
+     MODE = 383,
+     ACTIVE = 384,
+     PASSIVE = 385,
+     MANUAL = 386,
+     CPU = 387,
+     TOTALCPU = 388,
+     CPUUSER = 389,
+     CPUSYSTEM = 390,
+     CPUWAIT = 391,
+     GROUP = 392,
+     REQUEST = 393,
+     DEPENDS = 394,
+     BASEDIR = 395,
+     SLOT = 396,
+     EVENTQUEUE = 397,
+     SECRET = 398,
+     HOSTHEADER = 399,
+     UID = 400,
+     GID = 401,
+     MMONIT = 402,
+     INSTANCE = 403,
+     USERNAME = 404,
+     PASSWORD = 405,
+     TIMESTAMP = 406,
+     CHANGED = 407,
+     SECOND = 408,
+     MINUTE = 409,
+     HOUR = 410,
+     DAY = 411,
+     SSLAUTO = 412,
+     SSLV2 = 413,
+     SSLV3 = 414,
+     TLSV1 = 415,
+     CERTMD5 = 416,
+     BYTE = 417,
+     KILOBYTE = 418,
+     MEGABYTE = 419,
+     GIGABYTE = 420,
+     INODE = 421,
+     SPACE = 422,
+     PERMISSION = 423,
+     SIZE = 424,
+     MATCH = 425,
+     NOT = 426,
+     IGNORE = 427,
+     ACTION = 428,
+     UPTIME = 429,
+     EXEC = 430,
+     UNMONITOR = 431,
+     ICMP = 432,
+     ICMPECHO = 433,
+     NONEXIST = 434,
+     EXIST = 435,
+     INVALID = 436,
+     DATA = 437,
+     RECOVERED = 438,
+     PASSED = 439,
+     SUCCEEDED = 440,
+     URL = 441,
+     CONTENT = 442,
+     PID = 443,
+     PPID = 444,
+     FSFLAG = 445,
+     REGISTER = 446,
+     CREDENTIALS = 447,
+     URLOBJECT = 448,
+     TARGET = 449,
+     TIMESPEC = 450,
+     MAXFORWARD = 451,
+     FIPS = 452,
+     NOTEQUAL = 453,
+     EQUAL = 454,
+     LESS = 455,
+     GREATER = 456
+   };
+#endif
+/* Tokens.  */
+#define IF 258
+#define ELSE 259
+#define THEN 260
+#define OR 261
+#define FAILED 262
+#define SET 263
+#define LOGFILE 264
+#define FACILITY 265
+#define DAEMON 266
+#define SYSLOG 267
+#define MAILSERVER 268
+#define HTTPD 269
+#define ALLOW 270
+#define ADDRESS 271
+#define INIT 272
+#define READONLY 273
+#define CLEARTEXT 274
+#define MD5HASH 275
+#define SHA1HASH 276
+#define CRYPT 277
+#define DELAY 278
+#define PEMFILE 279
+#define ENABLE 280
+#define DISABLE 281
+#define HTTPDSSL 282
+#define CLIENTPEMFILE 283
+#define ALLOWSELFCERTIFICATION 284
+#define IDFILE 285
+#define STATEFILE 286
+#define SEND 287
+#define EXPECT 288
+#define EXPECTBUFFER 289
+#define CYCLE 290
+#define COUNT 291
+#define REMINDER 292
+#define PIDFILE 293
+#define START 294
+#define STOP 295
+#define PATHTOK 296
+#define HOST 297
+#define HOSTNAME 298
+#define PORT 299
+#define TYPE 300
+#define UDP 301
+#define TCP 302
+#define TCPSSL 303
+#define PROTOCOL 304
+#define CONNECTION 305
+#define ALERT 306
+#define NOALERT 307
+#define MAILFORMAT 308
+#define UNIXSOCKET 309
+#define SIGNATURE 310
+#define TIMEOUT 311
+#define RETRY 312
+#define RESTART 313
+#define CHECKSUM 314
+#define EVERY 315
+#define NOTEVERY 316
+#define DEFAULT 317
+#define HTTP 318
+#define APACHESTATUS 319
+#define FTP 320
+#define SMTP 321
+#define POP 322
+#define IMAP 323
+#define CLAMAV 324
+#define NNTP 325
+#define NTP3 326
+#define MYSQL 327
+#define DNS 328
+#define SSH 329
+#define DWP 330
+#define LDAP2 331
+#define LDAP3 332
+#define RDATE 333
+#define RSYNC 334
+#define TNS 335
+#define PGSQL 336
+#define POSTFIXPOLICY 337
+#define SIP 338
+#define LMTP 339
+#define GPS 340
+#define RADIUS 341
+#define MEMCACHE 342
+#define STRING 343
+#define PATH 344
+#define MAILADDR 345
+#define MAILFROM 346
+#define MAILREPLYTO 347
+#define MAILSUBJECT 348
+#define MAILBODY 349
+#define SERVICENAME 350
+#define STRINGNAME 351
+#define NUMBER 352
+#define PERCENT 353
+#define LOGLIMIT 354
+#define CLOSELIMIT 355
+#define DNSLIMIT 356
+#define KEEPALIVELIMIT 357
+#define REPLYLIMIT 358
+#define REQUESTLIMIT 359
+#define STARTLIMIT 360
+#define WAITLIMIT 361
+#define GRACEFULLIMIT 362
+#define CLEANUPLIMIT 363
+#define REAL 364
+#define CHECKPROC 365
+#define CHECKFILESYS 366
+#define CHECKFILE 367
+#define CHECKDIR 368
+#define CHECKHOST 369
+#define CHECKSYSTEM 370
+#define CHECKFIFO 371
+#define CHECKPROGRAM 372
+#define CHILDREN 373
+#define SYSTEM 374
+#define STATUS 375
+#define RESOURCE 376
+#define MEMORY 377
+#define TOTALMEMORY 378
+#define LOADAVG1 379
+#define LOADAVG5 380
+#define LOADAVG15 381
+#define SWAP 382
+#define MODE 383
+#define ACTIVE 384
+#define PASSIVE 385
+#define MANUAL 386
+#define CPU 387
+#define TOTALCPU 388
+#define CPUUSER 389
+#define CPUSYSTEM 390
+#define CPUWAIT 391
+#define GROUP 392
+#define REQUEST 393
+#define DEPENDS 394
+#define BASEDIR 395
+#define SLOT 396
+#define EVENTQUEUE 397
+#define SECRET 398
+#define HOSTHEADER 399
+#define UID 400
+#define GID 401
+#define MMONIT 402
+#define INSTANCE 403
+#define USERNAME 404
+#define PASSWORD 405
+#define TIMESTAMP 406
+#define CHANGED 407
+#define SECOND 408
+#define MINUTE 409
+#define HOUR 410
+#define DAY 411
+#define SSLAUTO 412
+#define SSLV2 413
+#define SSLV3 414
+#define TLSV1 415
+#define CERTMD5 416
+#define BYTE 417
+#define KILOBYTE 418
+#define MEGABYTE 419
+#define GIGABYTE 420
+#define INODE 421
+#define SPACE 422
+#define PERMISSION 423
+#define SIZE 424
+#define MATCH 425
+#define NOT 426
+#define IGNORE 427
+#define ACTION 428
+#define UPTIME 429
+#define EXEC 430
+#define UNMONITOR 431
+#define ICMP 432
+#define ICMPECHO 433
+#define NONEXIST 434
+#define EXIST 435
+#define INVALID 436
+#define DATA 437
+#define RECOVERED 438
+#define PASSED 439
+#define SUCCEEDED 440
+#define URL 441
+#define CONTENT 442
+#define PID 443
+#define PPID 444
+#define FSFLAG 445
+#define REGISTER 446
+#define CREDENTIALS 447
+#define URLOBJECT 448
+#define TARGET 449
+#define TIMESPEC 450
+#define MAXFORWARD 451
+#define FIPS 452
+#define NOTEQUAL 453
+#define EQUAL 454
+#define LESS 455
+#define GREATER 456
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 1676 of yacc.c  */
+#line 260 "src/p.y"
+
+  URL_T url;
+  float real;
+  int   number;
+  char *string;
+
+
+
+/* Line 1676 of yacc.c  */
+#line 463 "src/y.tab.h"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+extern YYSTYPE yylval;
+
+
diff --git a/monit-5.4/src/util.c b/monit-5.4/src/util.c
new file mode 100644
index 0000000..605e27a
--- /dev/null
+++ b/monit-5.4/src/util.c
@@ -0,0 +1,1919 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_CRYPT_H
+#include <crypt.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#ifdef HAVE_PAM_PAM_APPL_H
+#include <pam/pam_appl.h>
+#endif
+
+#ifdef HAVE_SECURITY_PAM_APPL_H
+#include <security/pam_appl.h>
+#endif
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif
+
+#include "monit.h"
+#include "engine.h"
+#include "md5.h"
+#include "md5_crypt.h"
+#include "sha1.h"
+#include "base64.h"
+#include "alert.h"
+#include "process.h"
+#include "event.h"
+
+
+struct ad_user {
+        const char *login;
+        const char *passwd;
+};
+
+
+/* Unsafe URL characters: <>\"#%{}|\\^[] ` */
+static const unsigned char urlunsafe[256] = {
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 
+        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 
+};
+
+
+static const unsigned char b2x[][256] = {
+        "00", "01", "02", "03", "04", "05", "06", "07", 
+        "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", 
+        "10", "11", "12", "13", "14", "15", "16", "17", 
+        "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", 
+        "20", "21", "22", "23", "24", "25", "26", "27", 
+        "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", 
+        "30", "31", "32", "33", "34", "35", "36", "37", 
+        "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", 
+        "40", "41", "42", "43", "44", "45", "46", "47", 
+        "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", 
+        "50", "51", "52", "53", "54", "55", "56", "57", 
+        "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", 
+        "60", "61", "62", "63", "64", "65", "66", "67", 
+        "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", 
+        "70", "71", "72", "73", "74", "75", "76", "77", 
+        "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
+        "80", "81", "82", "83", "84", "85", "86", "87", 
+        "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
+        "90", "91", "92", "93", "94", "95", "96", "97", 
+        "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", 
+        "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", 
+        "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", 
+        "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", 
+        "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", 
+        "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", 
+        "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
+        "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", 
+        "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", 
+        "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", 
+        "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", 
+        "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", 
+        "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
+};
+
+
+/**
+ *  General purpose utility methods.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Returns the value of the parameter if defined or the String "(not
+ * defined)"
+ */
+static char *is_str_defined(char *s) {
+        return((s && *s) ? s : "(not defined)");
+}
+
+
+/**
+ * Convert a hex char to a char
+ */
+static char x2c(char *hex) {
+        register char digit;
+        digit = ((hex[0] >= 'A') ? ((hex[0] & 0xdf) - 'A')+10 : (hex[0] - '0'));
+        digit *= 16;
+        digit += (hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A')+10 : (hex[1] - '0'));
+        return(digit);
+}
+
+
+/**
+ * Print registered events list
+ */
+static void printevents(unsigned int events) {
+        if(events == Event_Null) {
+                printf("No events");
+        } else if(events == Event_All) {
+                printf("All events");
+        } else {
+                if(IS_EVENT_SET(events, Event_Action))
+                        printf("Action ");
+                if(IS_EVENT_SET(events, Event_Checksum))
+                        printf("Checksum ");
+                if(IS_EVENT_SET(events, Event_Connection))
+                        printf("Connection ");
+                if(IS_EVENT_SET(events, Event_Content))
+                        printf("Content ");
+                if(IS_EVENT_SET(events, Event_Data))
+                        printf("Data ");
+                if(IS_EVENT_SET(events, Event_Exec))
+                        printf("Exec ");
+                if(IS_EVENT_SET(events, Event_Fsflag))
+                        printf("Fsflags ");
+                if(IS_EVENT_SET(events, Event_Gid))
+                        printf("Gid ");
+                if(IS_EVENT_SET(events, Event_Icmp))
+                        printf("Icmp ");
+                if(IS_EVENT_SET(events, Event_Instance))
+                        printf("Instance ");
+                if(IS_EVENT_SET(events, Event_Invalid))
+                        printf("Invalid ");
+                if(IS_EVENT_SET(events, Event_Nonexist))
+                        printf("Nonexist ");
+                if(IS_EVENT_SET(events, Event_Permission))
+                        printf("Permission ");
+                if(IS_EVENT_SET(events, Event_Pid))
+                        printf("PID ");
+                if(IS_EVENT_SET(events, Event_PPid))
+                        printf("PPID ");
+                if(IS_EVENT_SET(events, Event_Resource))
+                        printf("Resource ");
+                if(IS_EVENT_SET(events, Event_Size))
+                        printf("Size ");
+                if(IS_EVENT_SET(events, Event_Status))
+                        printf("Status ");
+                if(IS_EVENT_SET(events, Event_Timeout))
+                        printf("Timeout ");
+                if(IS_EVENT_SET(events, Event_Timestamp))
+                        printf("Timestamp ");
+                if(IS_EVENT_SET(events, Event_Uid))
+                        printf("Uid ");
+                if(IS_EVENT_SET(events, Event_Uptime))
+                        printf("Uptime ");
+                
+        }
+        printf("\n");
+}
+
+
+#ifdef HAVE_LIBPAM
+/**
+ * PAM conversation
+ */
+#if defined(SOLARIS) || defined(AIX)
+static int PAMquery(int num_msg, struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {
+#else
+static int PAMquery(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {
+#endif
+        int i;
+        struct ad_user *user = (struct ad_user *)appdata_ptr;
+        struct pam_response *response;
+        
+        /* Sanity checking */
+        if (!msg || !resp || !user )
+                return PAM_CONV_ERR;
+        
+        response = CALLOC(sizeof(struct pam_response), num_msg);
+        
+        for (i = 0; i < num_msg; i++) {
+                response[i].resp = NULL;
+                response[i].resp_retcode = 0;
+                
+                switch ((*(msg[i])).msg_style) {
+                        case PAM_PROMPT_ECHO_ON:
+                                /* Store the login as the response. This likely never gets called, since login was on pam_start() */
+                                response[i].resp= appdata_ptr ? Str_dup(user->login) : NULL;
+                                break;
+                                
+                        case PAM_PROMPT_ECHO_OFF:
+                                /* Store the password as the response */
+                                response[i].resp= appdata_ptr ? Str_dup(user->passwd) : NULL;
+                                break;
+                                
+                        case PAM_TEXT_INFO:
+                        case PAM_ERROR_MSG:
+                                /* Shouldn't happen since we have PAM_SILENT set. If it happens anyway, ignore it. */
+                                break;
+                                
+                        default:
+                                /* Something strange... */
+                                if (response != NULL)
+                                        FREE(response);
+                                return PAM_CONV_ERR;
+                }
+        }
+        /* On success, return the response structure */
+        *resp = response;
+        return PAM_SUCCESS;
+}
+
+
+/**
+ * Validate login/passwd via PAM service "monit"
+ */
+static int PAMcheckPasswd(const char *login, const char *passwd) {
+        int rv;
+        pam_handle_t *pamh = NULL;
+        struct ad_user user_info = {
+                login,
+                passwd
+        };
+        struct pam_conv conv = {
+                PAMquery,
+                &user_info
+        };
+        
+        if ((rv = pam_start("monit", login, &conv, &pamh) != PAM_SUCCESS)) {
+                DEBUG("PAM authentication start failed -- %d\n", rv);
+                return FALSE;
+        }
+        
+        rv = pam_authenticate(pamh, PAM_SILENT);
+        
+        if (pam_end(pamh, rv) != PAM_SUCCESS)
+                pamh = NULL;
+        
+        return(rv == PAM_SUCCESS ? TRUE : FALSE);
+}
+
+
+/**
+ * Check whether the user is member of allowed groups
+ */
+static Auth_T PAMcheckUserGroup(const char *uname) {
+        Auth_T c = Run.credentials;
+        struct passwd *pwd = NULL; 
+        struct group  *grp = NULL;
+        
+        ASSERT(uname);
+        
+        if (!(pwd = getpwnam(uname)))
+                return NULL;
+        
+        if (!(grp = getgrgid(pwd->pw_gid)))
+                return NULL;
+        
+        while (c) {
+                if (c->groupname) {
+                        struct group *sgrp = NULL;
+                        
+                        /* check for primary group match */
+                        if (IS(c->groupname, grp->gr_name))
+                                return c;
+                        
+                        /* check secondary groups match */
+                        if ((sgrp = getgrnam(c->groupname))) {
+                                char **g = NULL;
+                                
+                                for (g = sgrp->gr_mem; *g; g++)
+                                        if (IS(*g, uname))
+                                                return c;
+                        }
+                }
+                c = c->next;
+        }
+        return NULL;
+}
+#endif
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+char *Util_replaceString(char **src, const char *old, const char *new) {
+        int i;
+        size_t d;
+        
+        ASSERT(src);
+        ASSERT(*src);
+        ASSERT(old);
+        ASSERT(new);
+        
+        i= Util_countWords(*src, old);
+        d= strlen(new)-strlen(old);
+        
+        if(i==0)
+                return *src;
+        if(d>0)
+                d*= i;
+        else
+                d= 0;
+        
+        {
+                char *p, *q;
+                size_t l = strlen(old);
+                char *buf= CALLOC(sizeof(char), strlen(*src)+d+1);
+                
+                q= *src;
+                *buf= 0;
+                
+                while((p= strstr(q, old))) {
+                        
+                        *p= '\0';
+                        strcat(buf, q);
+                        strcat(buf, new);
+                        p+= l;
+                        q= p;
+                        
+                }
+                
+                strcat(buf, q);
+                FREE(*src);
+                *src= buf;
+        }
+        return *src;
+}
+
+
+int Util_countWords(char *s, const char *word) {
+        int i= 0;
+        char *p= s;
+        
+        ASSERT(s && word);
+        
+        while((p= strstr(p, word))) { i++;  p++; }
+        return i;
+}
+
+
+void Util_handleEscapes(char *buf) {
+        int editpos;
+        int insertpos;
+        
+        ASSERT(buf);
+        
+        for(editpos=insertpos=0; *(buf+editpos)!='\0'; editpos++, insertpos++) {
+                if(*(buf+editpos) == '\\' ) {
+                        switch(*(buf+editpos+1)) {
+                                case 'n': 
+                                        *(buf+insertpos)='\n';
+                                        editpos++;
+                                        break;
+                                        
+                                case 't':
+                                        *(buf+insertpos)='\t';
+                                        editpos++;
+                                        break;
+                                        
+                                case 'r':
+                                        *(buf+insertpos)='\r';
+                                        editpos++;
+                                        break;
+                                        
+                                case ' ':
+                                        *(buf+insertpos)=' ';
+                                        editpos++;
+                                        break;
+                                        
+                                case '0':
+                                        if(*(buf+editpos+2)=='x') {
+                                                if((*(buf+editpos+3)=='0' && *(buf+editpos+4)=='0')) {
+                                                        /* Don't swap \0x00 with 0 to avoid truncating the string. 
+                                                         Currently the only place where we support sending of 0 bytes
+                                                         is in check_generic(). The \0x00 -> 0 byte swap is performed
+                                                         there and in-place.
+                                                         */
+                                                        *(buf+insertpos)=*(buf+editpos);
+                                                } else {
+                                                        *(buf+insertpos)=x2c(&buf[editpos+3]);
+                                                        editpos+=4;
+                                                } 
+                                        }
+                                        break;
+                                        
+                                case '\\':
+                                        *(buf+insertpos)='\\';
+                                        editpos++;
+                                        break;
+                                        
+                                default:
+                                        *(buf+insertpos)=*(buf+editpos);
+                                        
+                        }  
+                        
+                } else {
+                        *(buf+insertpos)=*(buf+editpos);
+                }  
+                
+        }
+        *(buf+insertpos)='\0';
+}
+
+
+int Util_handle0Escapes(char *buf) {
+        int editpos;
+        int insertpos;
+        
+        ASSERT(buf);
+        
+        for(editpos=insertpos=0; *(buf+editpos)!='\0'; editpos++, insertpos++) {
+                if(*(buf+editpos) == '\\' ) {
+                        switch(*(buf+editpos+1)) {
+                                case '0':
+                                        if(*(buf+editpos+2)=='x') {
+                                                *(buf+insertpos)=x2c(&buf[editpos+3]);
+                                                editpos+=4;
+                                        }
+                                        break;
+                                        
+                                default:
+                                        *(buf+insertpos)=*(buf+editpos);
+                                        
+                        }  
+                        
+                } else {
+                        *(buf+insertpos)=*(buf+editpos);
+                }  
+        }
+        *(buf+insertpos)='\0';
+        return insertpos;
+}
+
+
+char *Util_digest2Bytes(unsigned char *digest, int mdlen, MD_T result) {
+        int i;
+        unsigned char *tmp= (unsigned char*)result;
+        static unsigned char hex[] = "0123456789abcdef";     
+        ASSERT(mdlen * 2 < MD_SIZE); // Overflow guard
+        for(i= 0; i < mdlen; i++) {
+                *tmp++ = hex[digest[i] >> 4];
+                *tmp++ = hex[digest[i] & 0xf];
+        }
+        *tmp = '\0';
+        return result;
+}
+
+
+int Util_getStreamDigests(FILE *stream, void *sha1_resblock, void *md5_resblock) {
+#define HASHBLOCKSIZE 4096
+        md5_context_t ctx_md5;
+        sha1_context_t ctx_sha1;
+        unsigned char buffer[HASHBLOCKSIZE + 72];
+        size_t sum;
+
+        /* Initialize the computation contexts */
+        if (md5_resblock)
+                md5_init(&ctx_md5);
+        if (sha1_resblock)
+                sha1_init(&ctx_sha1);
+
+        /* Iterate over full file contents */
+        while (1)  {
+                /* We read the file in blocks of HASHBLOCKSIZE bytes. One call of the computation function processes the whole buffer so that with the next round of the loop another block can be read */
+                size_t n;
+                sum = 0;
+                
+                /* Read block. Take care for partial reads */
+                while (1) {
+                        n = fread(buffer + sum, 1, HASHBLOCKSIZE - sum, stream);
+                        sum += n;
+                        if (sum == HASHBLOCKSIZE)
+                                break;
+                        if (n == 0) {
+                                /* Check for the error flag IFF N == 0, so that we don't exit the loop after a partial read due to e.g., EAGAIN or EWOULDBLOCK */
+                                if (ferror(stream))
+                                        return FALSE;
+                                goto process_partial_block;
+                        }
+                        
+                        /* We've read at least one byte, so ignore errors. But always check for EOF, since feof may be true even though N > 0. Otherwise, we could end up calling fread after EOF */
+                        if (feof(stream))
+                                goto process_partial_block;
+                }
+
+                /* Process buffer with HASHBLOCKSIZE bytes. Note that HASHBLOCKSIZE % 64 == 0 */
+                if (md5_resblock)
+                        md5_append(&ctx_md5, (const md5_byte_t *)buffer, HASHBLOCKSIZE);
+                if (sha1_resblock)
+                        sha1_append(&ctx_sha1, buffer, HASHBLOCKSIZE);
+        }
+        
+process_partial_block:
+        /* Process any remaining bytes */
+        if (sum > 0) {
+                if (md5_resblock)
+                        md5_append(&ctx_md5, (const md5_byte_t *)buffer, (int)sum);
+                if (sha1_resblock)
+                        sha1_append(&ctx_sha1, buffer, sum);
+        }
+        /* Construct result in desired memory */
+        if (md5_resblock)
+                md5_finish(&ctx_md5, md5_resblock);
+        if (sha1_resblock)
+                sha1_finish(&ctx_sha1, sha1_resblock);
+        return TRUE;
+}
+
+
+void Util_printHash(char *file) {
+        MD_T hash;
+        unsigned char sha1[STRLEN], md5[STRLEN];
+        FILE *fhandle = NULL;
+        
+        if (! (fhandle = file ? fopen(file, "r") : stdin) || ! Util_getStreamDigests(fhandle, sha1, md5) || (file && fclose(fhandle))) {
+                printf("%s: %s\n", file, STRERROR);
+                exit(1);
+        }
+        printf("SHA1(%s) = %s\n", file ? file : "stdin", Util_digest2Bytes(sha1, 20, hash));
+        printf("MD5(%s)  = %s\n", file ? file : "stdin", Util_digest2Bytes(md5, 16, hash));
+}
+
+
+int Util_getChecksum(char *file, int hashtype, char *buf, int bufsize) {
+        int hashlength = 16;
+        
+        ASSERT(file);
+        ASSERT(buf);
+        ASSERT(bufsize >= sizeof(MD_T));
+        
+        switch (hashtype) {
+                case HASH_MD5:
+                        hashlength = 16;
+                        break;
+                case HASH_SHA1:
+                        hashlength = 20;
+                        break;
+                default:
+                        LogError("checksum: invalid hash type: 0x%x\n", hashtype);
+                        return FALSE;
+        }
+        
+        if (file_isFile(file)) {
+                FILE *f = fopen(file, "r");
+                if (f) {
+                        int fresult = FALSE;
+                        MD_T sum;
+                        
+                        switch (hashtype) {
+                                case HASH_MD5:
+                                        fresult = Util_getStreamDigests(f, NULL, sum);
+                                        break;
+                                case HASH_SHA1:
+                                        fresult = Util_getStreamDigests(f, sum, NULL);
+                                        break;
+                        }
+                        
+                        if (fclose(f))
+                                LogError("checksum: error closing file '%s' -- %s\n", file, STRERROR);
+                        
+                        if (! fresult) {
+                                LogError("checksum: file %s stream error (0x%x)\n", file, fresult);
+                                return FALSE;
+                        }
+                        
+                        Util_digest2Bytes((unsigned char *)sum, hashlength, buf);
+                        return TRUE;
+                        
+                } else
+                        LogError("checksum: failed to open file %s -- %s\n", file, STRERROR);
+        } else
+                LogError("checksum: file %s is not regular file\n", file);
+        return FALSE;
+}
+
+
+void Util_hmacMD5(const unsigned char *data, int datalen, const unsigned char *key, int keylen, unsigned char *digest) {
+        md5_context_t ctx;
+        md5_init(&ctx);
+        unsigned char k_ipad[65];
+        unsigned char k_opad[65];
+        unsigned char tk[16];
+        int i;
+
+        if (keylen > 64) {
+                md5_context_t tctx;
+                md5_init(&tctx);
+                md5_append(&tctx, (const md5_byte_t *)key, keylen);
+                md5_finish(&tctx, tk);
+                key = tk;
+                keylen = 16;
+        }
+
+        memset(k_ipad, 0, sizeof(k_ipad));
+        memset(k_opad, 0, sizeof(k_opad));
+        memcpy(k_ipad, key, keylen);
+        memcpy(k_opad, key, keylen);
+
+        for (i = 0; i < 64; i++) {
+                k_ipad[i] ^= 0x36;
+                k_opad[i] ^= 0x5c;
+        }
+
+        md5_init(&ctx);
+        md5_append(&ctx, (const md5_byte_t *)k_ipad, 64);
+        md5_append(&ctx, (const md5_byte_t *)data, datalen);
+        md5_finish(&ctx, digest);
+
+        md5_init(&ctx);
+        md5_append(&ctx, (const md5_byte_t *)k_opad, 64);
+        md5_append(&ctx, (const md5_byte_t *)digest, 16);
+        md5_finish(&ctx, digest);
+}
+
+
+Service_T Util_getService(const char *name) {
+        Service_T s;
+        
+        ASSERT(name);
+        
+        for(s= servicelist; s; s= s->next) {
+                if(IS(s->name, name)) {
+                        return s;
+                }
+        }
+        return NULL;
+}
+
+
+int Util_getNumberOfServices() {
+        int i= 0;
+        Service_T s;
+        for(s= servicelist; s; s= s->next) i+=1;
+        return i;
+}
+
+
+int Util_existService(const char *name) {
+        ASSERT(name);
+        return Util_getService(name)?TRUE:FALSE;
+}
+
+
+void Util_printRunList() {
+        printf("Runtime constants:\n");
+        printf(" %-18s = %s\n", "Control file", is_str_defined(Run.controlfile));
+        printf(" %-18s = %s\n", "Log file", is_str_defined(Run.logfile));
+        printf(" %-18s = %s\n", "Pid file", is_str_defined(Run.pidfile));
+        printf(" %-18s = %s\n", "Id file", is_str_defined(Run.idfile));
+        printf(" %-18s = %s\n", "Debug", Run.debug?"True":"False");
+        printf(" %-18s = %s\n", "Log", Run.dolog?"True":"False");
+        printf(" %-18s = %s\n", "Use syslog", Run.use_syslog?"True":"False");
+        printf(" %-18s = %s\n", "Is Daemon", Run.isdaemon?"True":"False");
+        printf(" %-18s = %s\n", "Use process engine", Run.doprocess?"True":"False");
+        printf(" %-18s = %d seconds with start delay %d seconds\n", "Poll time", Run.polltime, Run.startdelay);
+        printf(" %-18s = %d bytes\n", "Expect buffer", Run.expectbuffer);
+        
+        if(Run.eventlist_dir) {
+                char slots[STRLEN];
+                
+                if(Run.eventlist_slots < 0)
+                        snprintf(slots, STRLEN, "unlimited"); 
+                else
+                        snprintf(slots, STRLEN, "%d", Run.eventlist_slots);
+                
+                printf(" %-18s = base directory %s with %s slots\n",
+                       "Event queue", Run.eventlist_dir, slots);
+        }
+        
+        if(Run.mmonits) {
+                Mmonit_T c;
+                printf(" %-18s = ", "M/Monit(s)");
+                for(c= Run.mmonits; c; c= c->next) {
+                        printf("%s with timeout %d seconds%s%s%s%s%s%s",
+                               c->url->url,
+                               c->timeout,
+                               (c->ssl.use_ssl && c->ssl.version) ? " ssl version " : "",
+                               (c->ssl.use_ssl && c->ssl.version) ? sslnames[c->ssl.version] : "",
+                               c->ssl.certmd5?" server cert md5 sum ":"",
+                               c->ssl.certmd5?c->ssl.certmd5:"",
+                               c->url->user?" using credentials":"",
+                               c->next?",\n                    = ":"");
+                }
+                if (! Run.dommonitcredentials)
+                        printf("\n                      register without credentials");
+                printf("\n");
+        }
+        
+        if(Run.mailservers) {
+                MailServer_T mta;
+                printf(" %-18s = ", "Mail server(s)");
+                for(mta= Run.mailservers; mta; mta= mta->next)
+                        printf("%s:%d%s%s",
+                               mta->host,
+                               mta->port,
+                               mta->ssl.use_ssl?"(ssl)":"",
+                               mta->next?", ":" ");
+                printf("with timeout %d seconds", Run.mailserver_timeout);
+                if(Run.mail_hostname)
+                        printf(" using '%s' as my hostname", Run.mail_hostname);
+                printf("\n");
+        }
+        
+        printf(" %-18s = %s\n", "Mail from", is_str_defined(Run.MailFormat.from));
+        printf(" %-18s = %s\n", "Mail subject",
+               is_str_defined(Run.MailFormat.subject));
+        printf(" %-18s = %-.20s%s\n", "Mail message",
+               Run.MailFormat.message?
+               Run.MailFormat.message:"(not defined)",
+               Run.MailFormat.message?"..(truncated)":"");
+        
+        printf(" %-18s = %s\n", "Start monit httpd", Run.dohttpd?"True":"False");
+        
+        if(Run.dohttpd) {
+                
+                printf(" %-18s = %s\n", "httpd bind address",
+                       Run.bind_addr?Run.bind_addr:"Any/All");
+                printf(" %-18s = %d\n", "httpd portnumber", Run.httpdport);
+                printf(" %-18s = %s\n", "httpd signature", Run.httpdsig?"True":"False");
+                printf(" %-18s = %s\n", "Use ssl encryption", Run.httpdssl?"True":"False");
+                
+                if(Run.httpdssl) {
+                        
+                        printf(" %-18s = %s\n", "PEM key/cert file", Run.httpsslpem);
+                        
+                        if(Run.httpsslclientpem!=NULL) {
+                                printf(" %-18s = %s\n", "Client cert file", Run.httpsslclientpem);
+                        } else {
+                                printf(" %-18s = %s\n", "Client cert file", "None");
+                        } 
+                        
+                        printf(" %-18s = %s\n", "Allow self certs", 
+                               Run.allowselfcert?"True":"False");
+                        
+                }
+                
+                printf(" %-18s = %s\n", "httpd auth. style",
+                       (Run.credentials!=NULL)&&has_hosts_allow()?
+                       "Basic Authentication and Host/Net allow list":
+                       (Run.credentials!=NULL)?"Basic Authentication":
+                       has_hosts_allow()?"Host/Net allow list":
+                       "No authentication!");
+                
+        }
+        
+        {
+                Mail_T list;
+                for(list= Run.maillist; list; list= list->next) {
+                        printf(" %-18s = %s\n", "Alert mail to", is_str_defined(list->to));
+                        printf("   %-16s = ", "Alert on");
+                        printevents(list->events);
+                        if(list->reminder)
+                                printf("   %-16s = %u cycles\n", "Alert reminder", list->reminder);
+                }
+        }
+        
+        printf("\n");
+}
+
+
+void Util_printService(Service_T s) {
+        int sgheader = FALSE;
+        Port_T n;
+        Icmp_T i;
+        Mail_T r;
+        Filesystem_T dl;
+        Resource_T q;
+        Timestamp_T t;
+        ActionRate_T ar;
+        Size_T sl;
+        Uptime_T ul;
+        Match_T ml;
+        Dependant_T d;
+        ServiceGroup_T sg;
+        ServiceGroupMember_T sgm;
+        char buf[STRLEN];
+        
+        ASSERT(s);
+        
+        snprintf(buf, sizeof(buf), "%s Name", servicetypes[s->type]);
+        printf("%-21s = %s\n", buf, s->name);
+        
+        for (sg = servicegrouplist; sg; sg = sg->next) {
+                for (sgm = sg->members; sgm; sgm = sgm->next) {
+                        if (! strcasecmp(sgm->name, s->name)) {
+                                if (! sgheader) {
+                                        printf(" %-20s = %s", "Group", sg->name);
+                                        sgheader = TRUE;
+                                } else
+                                        printf(", %s", sg->name);
+                        }
+                }
+        }
+        if (sgheader)
+                printf("\n");
+        
+        if(s->type == TYPE_PROCESS) {
+                if (s->matchlist)
+                        printf(" %-20s = %s\n", "Match", s->path);
+                else
+                        printf(" %-20s = %s\n", "Pid file", s->path);
+        } else if(s->type != TYPE_HOST && s->type != TYPE_SYSTEM) {
+                printf(" %-20s = %s\n", "Path", s->path);
+        }
+        printf(" %-20s = %s\n", "Monitoring mode", modenames[s->mode]);
+        if(s->start) {
+                int i = 0;
+                
+                printf(" %-20s = '", "Start program");
+                while(s->start->arg[i]) {
+                        if(i) printf(" ");
+                        printf("%s", s->start->arg[i++]);
+                }
+                printf("'");
+                if(s->start->has_uid)
+                        printf(" as uid %d", s->start->uid);
+                if(s->start->has_gid)
+                        printf(" as gid %d", s->start->gid);
+                printf(" timeout %d second(s)", s->start->timeout);
+                printf("\n");
+        }
+        if(s->stop) {
+                int i = 0;
+                
+                printf(" %-20s = '", "Stop program");
+                while(s->stop->arg[i]) {
+                        if(i) printf(" ");
+                        printf("%s", s->stop->arg[i++]);
+                }
+                printf("'");
+                if(s->stop->has_uid)
+                        printf(" as uid %d", s->stop->uid);
+                if(s->stop->has_gid)
+                        printf(" as gid %d", s->stop->gid);
+                printf(" timeout %d second(s)", s->stop->timeout);
+                printf("\n");
+        }
+        
+        if(s->type != TYPE_SYSTEM) {
+                printf(" %-20s = ", "Existence");
+                printf("if does not exist %s ", Util_getEventratio(s->action_NONEXIST->failed, buf, sizeof(buf)));
+                printf("then %s ", Util_describeAction(s->action_NONEXIST->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(s->action_NONEXIST->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(s->action_NONEXIST->succeeded, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        for(d= s->dependantlist; d; d= d->next)
+                if(d->dependant != NULL)
+                        printf(" %-20s = %s\n", "Depends on Service", d->dependant);
+        
+        if(s->type == TYPE_PROCESS) {
+                printf(" %-20s = ", "Pid");
+                printf("if changed %s ", Util_getEventratio(s->action_PID->failed, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(s->action_PID->failed, buf, sizeof(buf)));
+                printf("\n");
+                
+                printf(" %-20s = ", "Ppid");
+                printf("if changed %s ", Util_getEventratio(s->action_PPID->failed, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(s->action_PPID->failed, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        if(s->type == TYPE_FILESYSTEM) {
+                printf(" %-20s = ", "Filesystem flags");
+                printf("if changed %s ", Util_getEventratio(s->action_FSFLAG->failed, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(s->action_FSFLAG->failed, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        if(s->type == TYPE_PROGRAM) {
+                Program_T p = s->program;
+                EventAction_T a= p->action;
+                printf(" %-20s = ", "Status");
+                printf("if '%s' exit value %s %d within %d seconds ", s->name, operatorshortnames[p->operator], p->return_value, p->timeout);
+                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                printf("\n");
+        }
+
+        if(s->checksum && s->checksum->action) {
+                Checksum_T cs= s->checksum;
+                EventAction_T a= cs->action;
+                printf(" %-20s = ", "Checksum");
+                if(cs->test_changes) {
+                        printf("if changed %s %s ", checksumnames[cs->type], Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                } else {
+                        printf("if failed %s(%s) %s ", cs->hash, checksumnames[cs->type], Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                }
+                printf("\n");
+        }
+        
+        if(s->perm && s->perm->action) {
+                EventAction_T a= s->perm->action;
+                printf(" %-20s = ", "Permission");
+                printf("if failed %04o %s ", s->perm->perm, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        if(s->uid && s->uid->action) {
+                EventAction_T a= s->uid->action;
+                printf(" %-20s = ", "UID");
+                printf("if failed %d %s ", (int)s->uid->uid, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        if(s->gid && s->gid->action) {
+                EventAction_T a= s->gid->action;
+                printf(" %-20s = ", "GID");
+                printf("if failed %d %s ", (int)s->gid->gid, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                printf("\n");
+        }
+        
+        if(s->icmplist)
+                for(i= s->icmplist; i; i= i->next) {
+                        EventAction_T a= i->action;
+                        printf(" %-20s = ", "ICMP");
+                        printf("if failed [%s count %d with timeout %d seconds] %s ", icmpnames[i->type], i->count, i->timeout, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        printf("\n");
+                }
+        
+        if(s->portlist) {
+                for(n= s->portlist; n; n= n->next) {
+                        EventAction_T a= n->action;
+                        if(n->family == AF_INET) {
+                                printf(" %-20s = ", "Port");
+                                printf("if failed [%s:%d%s [%s via %s] with timeout %d seconds and retry %d time(s)] %s ", n->hostname, n->port, n->request ? n->request : "", n->protocol->name, Util_portTypeDescription(n), n->timeout, n->retry > 1 ? n->retry : 0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                printf("\n");
+                                if(n->SSL.certmd5 != NULL)
+                                        printf(" %-20s = %s\n", "Server cert md5 sum", n->SSL.certmd5);
+                        } else if(n->family == AF_UNIX) {
+                                printf(" %-20s = ", "Unix Socket");
+                                printf("if failed [%s [protocol %s] with timeout %d seconds and retry %d time(s)] %s ", n->pathname, n->protocol->name, n->timeout, n->retry > 1 ? n->retry : 0,Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                printf("\n");
+                        }
+                }
+        }
+        
+        for(t= s->timestamplist; t; t= t->next) {
+                EventAction_T a= t->action;
+                printf(" %-20s = ", "Timestamp");
+                if(t->test_changes) {
+                        printf("if changed %s ", Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                } else {
+                        printf("if %s %d second(s) %s ", operatornames[t->operator], t->time, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                }
+                printf("\n");
+        }
+        
+        for(sl= s->sizelist; sl; sl= sl->next) {
+                EventAction_T a= sl->action;
+                printf(" %-20s = ", "Size");
+                if(sl->test_changes) {
+                        printf("if changed %s ", Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                } else {
+                        printf("if %s %llu byte(s) %s ", operatornames[sl->operator], sl->size, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                }
+                printf("\n");
+                
+        }
+        
+        for(ul= s->uptimelist; ul; ul= ul->next) {
+                EventAction_T a= ul->action;
+                printf(" %-20s = ", "Uptime");
+                printf("if %s %llu second(s) %s ", operatornames[ul->operator], ul->uptime, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                printf("\n");
+
+        }
+
+        if (s->type != TYPE_PROCESS) {
+                for (ml = s->matchignorelist; ml; ml = ml->next) {
+                        EventAction_T a = ml->action;
+                        printf(" %-20s = ", "Ignore pattern");
+                        printf("if%s match \"%s\" %s ", ml->not ? " not" : "", ml->match_string, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("\n");
+                }
+                for (ml = s->matchlist; ml; ml = ml->next) {
+                        EventAction_T a = ml->action;
+                        printf(" %-20s = ", "Pattern");
+                        printf("if%s match \"%s\" %s ", ml->not ? " not" : "", ml->match_string, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                        printf("then %s", Util_describeAction(a->failed, buf, sizeof(buf)));
+                        printf("\n");
+                }
+        }
+        
+        for(dl= s->filesystemlist; dl; dl= dl->next) {
+                EventAction_T a= dl->action;
+                if(dl->resource == RESOURCE_ID_INODE) {
+                        printf(" %-20s = ", "Inodes usage limit");
+                        if(dl->limit_absolute > -1) {
+                                printf("if %s %ld %s ", operatornames[dl->operator], dl->limit_absolute, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        } else {
+                                printf("if %s %.1f%% %s ", operatornames[dl->operator], dl->limit_percent / 10., Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        }
+                        printf("\n");
+                } else if(dl->resource == RESOURCE_ID_SPACE) {
+                        printf(" %-20s = ", "Space usage limit");
+                        if(dl->limit_absolute > -1) {
+                                printf("if %s %ld blocks %s ", operatornames[dl->operator], dl->limit_absolute, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        } else {
+                                printf("if %s %.1f%% %s ", operatornames[dl->operator], dl->limit_percent / 10., Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                        }
+                        printf("\n");
+                }
+        }
+        
+        for(q= s->resourcelist; q; q= q->next) {
+                EventAction_T a= q->action;
+                switch(q->resource_id) {
+                        case RESOURCE_ID_CPU_PERCENT: 
+                                printf(" %-20s = ", "CPU usage limit");
+                                break;
+                                
+                        case RESOURCE_ID_TOTAL_CPU_PERCENT: 
+                                printf(" %-20s = ", "CPU usage limit (incl. children)");
+                                break;
+                                
+                        case RESOURCE_ID_CPUUSER: 
+                                printf(" %-20s = ", "CPU user limit");
+                                break;
+                                
+                        case RESOURCE_ID_CPUSYSTEM: 
+                                printf(" %-20s = ", "CPU system limit");
+                                break;
+                                
+                        case RESOURCE_ID_CPUWAIT: 
+                                printf(" %-20s = ", "CPU wait limit");
+                                break;
+                                
+                        case RESOURCE_ID_MEM_PERCENT: 
+                                printf(" %-20s = ", "Memory usage limit");
+                                break;
+                                
+                        case RESOURCE_ID_MEM_KBYTE: 
+                                printf(" %-20s = ", "Memory amount limit");
+                                break;
+                                
+                        case RESOURCE_ID_SWAP_PERCENT: 
+                                printf(" %-20s = ", "Swap usage limit");
+                                break;
+                                
+                        case RESOURCE_ID_SWAP_KBYTE: 
+                                printf(" %-20s = ", "Swap amount limit");
+                                break;
+                                
+                        case RESOURCE_ID_LOAD1: 
+                                printf(" %-20s = ", "Load avg. (1min)");
+                                break;
+                                
+                        case RESOURCE_ID_LOAD5: 
+                                printf(" %-20s = ", "Load avg. (5min)");
+                                break;
+                                
+                        case RESOURCE_ID_LOAD15: 
+                                printf(" %-20s = ", "Load avg. (15min)");
+                                break;
+                                
+                        case RESOURCE_ID_CHILDREN:
+                                printf(" %-20s = ", "Children");
+                                break;
+                                
+                        case RESOURCE_ID_TOTAL_MEM_KBYTE:
+                                printf(" %-20s = ", "Memory amount limit (incl. children)");
+                                break;
+                                
+                        case RESOURCE_ID_TOTAL_MEM_PERCENT:
+                                printf(" %-20s = ", "Memory usage limit (incl. children)");
+                                break;
+                }
+                switch(q->resource_id) {
+                        case RESOURCE_ID_CPU_PERCENT: 
+                        case RESOURCE_ID_TOTAL_CPU_PERCENT: 
+                        case RESOURCE_ID_TOTAL_MEM_PERCENT:
+                        case RESOURCE_ID_CPUUSER: 
+                        case RESOURCE_ID_CPUSYSTEM: 
+                        case RESOURCE_ID_CPUWAIT: 
+                        case RESOURCE_ID_MEM_PERCENT: 
+                        case RESOURCE_ID_SWAP_PERCENT: 
+                                printf("if %s %.1f%% %s ", operatornames[q->operator], q->limit / 10.0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                break;
+                                
+                        case RESOURCE_ID_MEM_KBYTE: 
+                        case RESOURCE_ID_SWAP_KBYTE: 
+                                printf("if %s %ldkB %s ", operatornames[q->operator], q->limit, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                break;
+                                
+                        case RESOURCE_ID_LOAD1: 
+                        case RESOURCE_ID_LOAD5: 
+                        case RESOURCE_ID_LOAD15: 
+                                printf("if %s %.1f %s ", operatornames[q->operator], q->limit / 10.0, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                break;
+                                
+                        case RESOURCE_ID_CHILDREN:
+                        case RESOURCE_ID_TOTAL_MEM_KBYTE:
+                                printf("if %s %ld %s ", operatornames[q->operator], q->limit, Util_getEventratio(a->failed, buf, sizeof(buf)));
+                                printf("then %s ", Util_describeAction(a->failed, buf, sizeof(buf)));
+                                printf("else if succeeded %s ", Util_getEventratio(a->succeeded, buf, sizeof(buf)));
+                                printf("then %s", Util_describeAction(a->succeeded, buf, sizeof(buf)));
+                                break;
+                }
+                printf("\n");
+        }
+        
+        if (s->every.type == EVERY_SKIPCYCLES)
+                printf(" %-20s = Check service every %d cycles\n", "Every", s->every.spec.cycle.number);
+        else if (s->every.type == EVERY_CRON)
+                printf(" %-20s = Check service every %s\n", "Every", s->every.spec.cron);
+        else if (s->every.type == EVERY_NOTINCRON)
+                printf(" %-20s = Don't check service every %s\n", "Every", s->every.spec.cron);
+
+        for (ar = s->actionratelist; ar; ar = ar->next)
+                printf(" %-20s = If restarted %d times within %d cycle(s) then %s\n", "Timeout", ar->count, ar->cycle, Util_describeAction(ar->action->failed, buf, sizeof(buf)));
+        
+        for(r= s->maillist; r; r= r->next) {
+                printf(" %-20s = %s\n", "Alert mail to", is_str_defined(r->to));
+                printf("   %-18s = ", "Alert on");
+                printevents(r->events);
+                if(r->reminder)
+                        printf("   %-18s = %u cycles\n", "Alert reminder", r->reminder);
+        }
+        
+        printf("\n");
+        
+}
+
+
+void Util_printServiceList() {
+        Service_T s;
+        char ruler[STRLEN];
+        
+        printf("The service list contains the following entries:\n\n");
+        
+        for(s= servicelist_conf; s; s= s->next_conf)
+                Util_printService(s);
+        
+        memset(ruler, '-', STRLEN);
+        printf("%-.79s\n", ruler);
+}
+
+
+char *Util_monitId(char *idfile) {
+        FILE *file = NULL;
+        
+        ASSERT(idfile);
+        
+        if(! file_exist(idfile)) {
+                md5_context_t ctx;
+                char buf[STRLEN];
+                MD_T digest;
+                mode_t mask = umask(PRIVATEMASK);
+                file = fopen(idfile, "w");
+                umask(mask);
+                if(! file) {
+                        LogError("%s: Error opening the idfile '%s' -- %s\n", prog, idfile, STRERROR);
+                        return NULL;
+                }
+                /* Generate the unique id */
+                snprintf(buf, STRLEN, "%lu%d%lu", (unsigned long)time(NULL), getpid(), random());
+                md5_init(&ctx);
+                md5_append(&ctx, (const md5_byte_t *)buf, (int)strlen(buf));
+                md5_finish(&ctx, (md5_byte_t *)digest);
+                Util_digest2Bytes((unsigned char *)digest, 16, Run.id);
+                fprintf(file, "%s", Run.id);
+                LogInfo("%s: generated unique Monit id %s and stored to '%s'\n", prog, Run.id, idfile);
+        } else {
+                if(! file_isFile(idfile)) {
+                        LogError("%s: idfile '%s' is not a regular file\n", prog, idfile);
+                        return NULL;
+                }
+                if((file = fopen(idfile,"r")) == (FILE *)NULL) {
+                        LogError("%s: Error opening the idfile '%s' -- %s\n", prog, idfile, STRERROR);
+                        return NULL;
+                }
+                if(fscanf(file, "%256s", Run.id) != 1) {
+                        LogError("%s: Error reading id from file '%s'\n", prog, idfile);
+                        if (fclose(file))
+                                LogError("%s: Error closing file '%s' -- %s\n", prog, idfile, STRERROR);
+                        return NULL;
+                }
+        }
+        if (fclose(file))
+                LogError("%s: Error closing file '%s' -- %s\n", prog, idfile, STRERROR);
+        
+        return Run.id;
+}
+
+
+pid_t Util_getPid(char *pidfile) {
+        FILE *file= NULL;
+        int pid= -1;
+        
+        ASSERT(pidfile);
+        
+        if(! file_exist(pidfile)) {
+                DEBUG("%s: pidfile '%s' does not exist\n",prog, pidfile);
+                return FALSE;
+        }
+        if(! file_isFile(pidfile)) {
+                LogError("%s: pidfile '%s' is not a regular file\n",prog, pidfile);
+                return FALSE;
+        }
+        if((file = fopen(pidfile,"r")) == (FILE *)NULL) {
+                LogError("%s: Error opening the pidfile '%s' -- %s\n", prog, pidfile, STRERROR);
+                return FALSE;
+        }
+        if(fscanf(file, "%d", &pid) != 1) {
+                LogError("%s: Error reading pid from file '%s'\n", prog, pidfile);
+                if (fclose(file))
+                        LogError("%s: Error closing file '%s' -- %s\n", prog, pidfile, STRERROR);
+                return FALSE;
+        }
+        if (fclose(file))
+                LogError("%s: Error closing file '%s' -- %s\n", prog, pidfile, STRERROR);
+        
+        if(pid < 0)
+                return(FALSE);
+        
+        return(pid_t)pid;
+        
+}
+
+
+int Util_isProcessRunning(Service_T s, int refresh) {
+        int   i;
+        pid_t pid = -1;
+        
+        ASSERT(s);
+        
+        errno = 0;
+        
+        if (refresh || ! ptree || ! ptreesize)
+                initprocesstree(&ptree, &ptreesize, &oldptree, &oldptreesize);
+        
+        if (s->matchlist) {
+                /* The process table read may sporadically fail during read, because we're using glob on some platforms which may fail if the proc filesystem
+                 * which it traverses is changed during glob (process stopped). Note that the glob failure is rare and temporary - it will be OK on next cycle.
+                 * We skip the process matching that cycle however because we don't have process informations - will retry next cycle */
+                if (Run.doprocess) {
+                        for (i = 0; i < ptreesize; i++) {
+                                int found = FALSE;
+                                
+                                if (ptree[i].cmdline) {
+#ifdef HAVE_REGEX_H
+                                        found = regexec(s->matchlist->regex_comp, ptree[i].cmdline, 0, NULL, 0) ? FALSE : TRUE;
+#else
+                                        found = strstr(ptree[i].cmdline, s->matchlist->match_string) ? TRUE : FALSE;
+#endif
+                                }
+                                if (found) {
+                                        pid = ptree[i].pid;
+                                        break;
+                                }
+                        }
+                } else {
+                        DEBUG("Process information not available -- skipping service %s process existence check for this cycle\n", s->name);
+                        /* Return value is NOOP - it is based on existing errors bitmap so we don't generate false recovery/failures */
+                        return ! (s->error & Event_Nonexist);
+                }
+        } else {
+                pid = Util_getPid(s->path);
+        }
+        
+        if (pid > 0) {
+                if ((getpgid(pid) > -1) || (errno == EPERM))
+                        return pid;
+                DEBUG("'%s' Error testing process id [%d] -- %s\n", s->name, pid, STRERROR);
+        }
+        Util_resetInfo(s);
+        
+        return 0;
+}
+
+
+time_t Util_getProcessUptime(char *pidfile) {
+        time_t ctime;
+        
+        ASSERT(pidfile);
+        
+        if((ctime= file_getTimestamp(pidfile, S_IFREG)) ) {
+                time_t now= time(&now);
+                time_t since= now-ctime;
+                return since;
+        }
+        return (time_t)-1;
+}
+
+
+char *Util_getUptime(time_t delta, char *sep) {
+        static int min = 60;
+        static int hour = 3600;
+        static int day = 86400;
+        long rest_d;
+        long rest_h;
+        long rest_m;
+        char buf[STRLEN];
+        char *p = buf;
+        
+        *buf = 0;
+        if(delta < 0)
+                return(Str_dup(""));
+        if((rest_d = delta/day)>0) {
+                p += snprintf(p, STRLEN-(p-buf), "%ldd%s", rest_d,sep);
+                delta -= rest_d*day;
+        }
+        if((rest_h = delta/hour)>0 || (rest_d > 0)) {
+                p += snprintf(p, STRLEN-(p-buf), "%ldh%s", rest_h,sep);
+                delta -= rest_h*hour;
+        }
+        rest_m = delta/min;
+        snprintf(p, STRLEN - (p - buf), "%ldm%s", rest_m, sep);
+        
+        return Str_dup(buf);
+}
+
+
+int Util_isurlsafe(const char *url) {
+        int i;
+        ASSERT(url && *url);
+        for (i = 0; url[i]; i++) 
+                if (urlunsafe[(unsigned char)url[i]])
+                        return FALSE;
+        return TRUE;
+}
+
+
+char *Util_urlEncode(char *url) {
+        char *escaped = NULL;
+        if (url) {
+                char *p;
+                int i, n;
+                for (n = i = 0; url[i]; i++) 
+                        if (urlunsafe[(unsigned char)(url[i])]) 
+                                n += 2;
+                p = escaped = ALLOC(i + n + 1);
+                for (; *url; url++, p++) {
+                        if (urlunsafe[(unsigned char)(*p = *url)]) {
+                                *p++= '%';
+                                *p++= b2x[(unsigned char)(*url)][0];
+                                *p = b2x[(unsigned char)(*url)][1];
+                        }
+                }
+                *p = 0;
+        }
+        return escaped;
+}
+
+
+char *Util_urlDecode(char *url) {
+	if (url && *url) {
+                register int x, y;
+                for (x = 0, y = 0; url[y]; x++, y++) {
+                        if ((url[x] = url[y]) == '+')
+                                url[x] = ' ';
+                        else if (url[x] == '%') {
+                                if (! (url[x + 1] && url[x + 2]))
+                                        break;
+                                url[x] = x2c(url + y + 1);
+                                y += 2;
+                        }
+                }
+                url[x] = 0;
+        }
+	return url;
+}
+
+
+// NOTE: To be used to URL encode service names when ready
+char *Util_encodeServiceName(char *name) {
+        int i;
+        char *s;
+        ASSERT(name);
+        s = Util_urlEncode(name);
+        for (i = 0; s[i]; i++)
+                if (s[i] == '/') return Util_replaceString(&s, "/", "%2F");
+        return s;
+}
+
+
+char *Util_getBasicAuthHeaderMonit() {
+        Auth_T c = Run.credentials;
+        
+        /* We find the first cleartext credential for authorization */
+        while (c != NULL) {
+                if (c->digesttype == DIGEST_CLEARTEXT && ! c->is_readonly)
+                        break;
+                c = c->next;
+        }
+        
+        if (c)
+                return Util_getBasicAuthHeader(c->uname, c->passwd);
+        
+        return NULL;
+}
+
+
+char *Util_getBasicAuthHeader(char *username, char *password) {
+        char *auth, *b64;
+        char  buf[STRLEN];
+        
+        if (!username)
+                return NULL;
+        
+        snprintf(buf, STRLEN, "%s:%s", username, password ? password : "");
+        if(! (b64= encode_base64(strlen(buf), (unsigned char *)buf)) ) {
+                LogError("Failed to base64 encode authentication header\n");
+                return NULL;
+        }
+        auth= CALLOC(sizeof(char), STRLEN+1);
+        snprintf(auth, STRLEN, "Authorization: Basic %s\r\n", b64);
+        FREE(b64);
+        return auth;
+}
+
+
+void Util_redirectStdFds() {
+        int i;
+        for(i= 0; i < 3; i++) {
+                if(close(i) == -1 || open("/dev/null", O_RDWR) != i) {
+                        LogError("Cannot reopen standard file descriptor (%d) -- %s\n", i, STRERROR);
+                }
+        }
+}
+
+
+void Util_closeFds() {
+        int i;
+#ifdef HAVE_UNISTD_H
+        int max_descriptors = getdtablesize();
+#else
+        int max_descriptors = 1024;
+#endif
+        for(i = 3; i < max_descriptors; i++)
+                close(i);
+        errno= 0;
+}
+
+
+Auth_T Util_getUserCredentials(char *uname) {
+        Auth_T c;
+        
+        /* check allowed user names */
+        for (c = Run.credentials; c; c = c->next)
+                if (c->uname && IS(c->uname, uname))
+                        return c;
+        
+#ifdef HAVE_LIBPAM
+        /* check allowed group names */
+        return(PAMcheckUserGroup(uname));
+#else
+        return NULL;
+#endif
+}
+
+
+int Util_checkCredentials(char *uname, char *outside) {
+        Auth_T c= Util_getUserCredentials(uname);
+        char outside_crypt[STRLEN];
+        if (c == NULL)
+                return FALSE;
+        switch (c->digesttype) {
+                case DIGEST_CLEARTEXT:
+                        outside_crypt[sizeof(outside_crypt) - 1] = 0;
+                        strncpy(outside_crypt, outside, sizeof(outside_crypt) - 1); 
+                        break;
+                case DIGEST_MD5:
+                {
+                        char id[STRLEN];
+                        char salt[STRLEN];
+                        char *temp;
+                        /* A password looks like this,
+                         *   $id$salt$digest
+                         * the '$' around the id are still part of the id. 
+                         */
+                        id[sizeof(id) - 1] = 0;
+                        strncpy(id, c->passwd, sizeof(id) - 1);
+                        if (! (temp = strchr(id+1, '$'))) {
+                                LogError("Password not in MD5 format.\n");
+                                return FALSE;
+                        }
+                        temp += 1;
+                        *temp = '\0';
+                        salt[sizeof(salt) - 1] = 0;
+                        strncpy(salt, c->passwd+strlen(id), sizeof(salt) - 1);
+                        if(! (temp = strchr(salt, '$'))) {
+                                LogError("Password not in MD5 format.\n");
+                                return FALSE;
+                        }
+                        *temp = '\0';
+                        if (md5_crypt(outside, id, salt, outside_crypt, sizeof(outside_crypt)) == NULL) {
+                                LogError("Cannot generate MD5 digest error.\n");
+                                return FALSE;
+                        }
+                        break;
+                }
+                case DIGEST_CRYPT:
+                {
+                        char salt[3];
+                        char *temp;
+                        snprintf(salt, 3, "%c%c", c->passwd[0], c->passwd[1]);
+                        temp = crypt(outside, salt);
+                        outside_crypt[sizeof(outside_crypt) - 1] = 0;
+                        strncpy(outside_crypt, temp, sizeof(outside_crypt) - 1); 
+                        break;
+                }
+#ifdef HAVE_LIBPAM
+                case DIGEST_PAM:
+                        return PAMcheckPasswd(uname, outside);
+                        break;
+#endif
+                default:
+                        LogError("Unknown password digestion method.\n");
+                        return FALSE;
+        }
+        
+        if (strcmp(outside_crypt,c->passwd) == 0)
+                return TRUE;
+        return FALSE;
+}
+
+
+void Util_resetInfo(Service_T s) {
+        s->inf->st_mode = 0;
+        s->inf->st_uid = 0;
+        s->inf->st_gid = 0;
+        s->inf->timestamp = 0;
+        switch (s->type) {
+                case TYPE_FILESYSTEM:
+                        s->inf->priv.filesystem.f_bsize = 0L;
+                        s->inf->priv.filesystem.f_blocks = 0L;
+                        s->inf->priv.filesystem.f_blocksfree = 0L;
+                        s->inf->priv.filesystem.f_blocksfreetotal = 0L;
+                        s->inf->priv.filesystem.f_files = 0L;
+                        s->inf->priv.filesystem.f_filesfree = 0L;
+                        FREE(s->inf->priv.filesystem.mntpath);
+                        s->inf->priv.filesystem.inode_percent = 0;
+                        s->inf->priv.filesystem.inode_total = 0L;
+                        s->inf->priv.filesystem.space_percent = 0;
+                        s->inf->priv.filesystem.space_total = 0L;
+                        s->inf->priv.filesystem._flags = -1;
+                        s->inf->priv.filesystem.flags = -1;
+                        break;
+                case TYPE_FILE:
+                        // persistent: st_ino, readpos
+                        s->inf->priv.file.st_size  = 0;
+                        s->inf->priv.file.st_ino_prev = 0;
+                        *s->inf->priv.file.cs_sum = 0;
+                        break;
+                case TYPE_PROCESS:
+                        s->inf->priv.process._pid = -1;
+                        s->inf->priv.process._ppid = -1;
+                        s->inf->priv.process.pid = -1;
+                        s->inf->priv.process.ppid = -1;
+                        s->inf->priv.process.status_flag = 0;
+                        s->inf->priv.process.children = 0;
+                        s->inf->priv.process.mem_kbyte = 0L;
+                        s->inf->priv.process.total_mem_kbyte = 0L;
+                        s->inf->priv.process.mem_percent = 0;
+                        s->inf->priv.process.total_mem_percent = 0;
+                        s->inf->priv.process.cpu_percent = 0;
+                        s->inf->priv.process.total_cpu_percent = 0;
+                        s->inf->priv.process.uptime = 0;
+                        break;
+                default:
+                        break;
+        }
+}
+
+
+int Util_hasServiceStatus(Service_T s) {
+        return((s->monitor & MONITOR_YES) && !(s->error & Event_Nonexist) && !(s->error & Event_Data));
+}
+
+
+char *Util_getHTTPHostHeader(Socket_T s, char *hostBuf, int len) {
+        if(socket_get_remote_port(s)==80)
+                snprintf(hostBuf, len, "%s", socket_get_remote_host(s));
+        else
+                snprintf(hostBuf, len, "%s:%d", socket_get_remote_host(s), socket_get_remote_port(s));
+        return hostBuf;
+}
+
+
+int Util_evalQExpression(int operator, long long left, long long right) {
+        
+        switch(operator) {
+                case OPERATOR_GREATER:
+                        if(left > right)
+                                return TRUE;
+                        break;
+                case OPERATOR_LESS:
+                        if(left < right)
+                                return TRUE;
+                        break;
+                case OPERATOR_EQUAL:
+                        if(left == right)
+                                return TRUE;
+                        break;
+                case OPERATOR_NOTEQUAL:
+                        if(left != right)
+                                return TRUE;
+                        break;
+                default:
+                        LogError("Unknown comparison operator\n");
+                        return FALSE;
+        }
+        
+        return FALSE;
+        
+}
+
+
+void Util_monitorSet(Service_T s) {
+        ASSERT(s);
+        if(s->monitor == MONITOR_NOT) {
+                s->monitor = MONITOR_INIT;
+                DEBUG("'%s' monitoring enabled\n", s->name);
+        }
+}
+
+
+void Util_monitorUnset(Service_T s) {
+        ASSERT(s);
+        if(s->monitor != MONITOR_NOT) {
+                s->monitor = MONITOR_NOT;
+                DEBUG("'%s' monitoring disabled\n", s->name);
+        }
+        s->nstart = 0;
+        s->ncycle = 0;
+        if (s->every.type == EVERY_SKIPCYCLES)
+                s->every.spec.cycle.counter = 0;
+        s->error = Event_Null;
+        if(s->eventlist)
+                gc_event(&s->eventlist);
+        Util_resetInfo(s);
+}
+
+
+int Util_getAction(const char *action) {
+        int i = 1; /* the ACTION_IGNORE has index 0 => we will start on next item */
+        
+        ASSERT(action);
+        
+        while (strlen(actionnames[i])) {
+                if (IS(action, actionnames[i]))
+                        return i;
+                i++;
+        }
+        /* the action was not found */
+        return ACTION_IGNORE;
+}
+
+
+char *Util_describeAction(Action_T A, char *buf, int bufsize) {
+#define BUF_CURSOR    (buf + strlen(buf))
+#define BUF_AVAILABLE (bufsize - strlen(buf) - 1)
+        snprintf(buf, bufsize, "%s", actionnames[A->id]);
+        if (A->id == ACTION_EXEC) {
+                int i = 0;
+                command_t C = A->exec;
+                
+                while (C->arg[i]) {
+                        snprintf(BUF_CURSOR, BUF_AVAILABLE, "%s%s", i ? " " : " '", C->arg[i]);
+                        i++;
+                }
+                snprintf(BUF_CURSOR, BUF_AVAILABLE, "'");
+                if (C->has_uid)
+                        snprintf(BUF_CURSOR, BUF_AVAILABLE, " as uid %d", C->uid);
+                if (C->has_gid)
+                        snprintf(BUF_CURSOR, BUF_AVAILABLE, " as gid %d", C->gid);
+                snprintf(BUF_CURSOR, BUF_AVAILABLE, " timeout %d cycle(s)", C->timeout);
+        }
+        return buf;
+#undef BUF_CURSOR
+#undef BUF_AVAILABLE
+}
+
+
+char *Util_getEventratio(Action_T action, char *buf, int bufsize) {
+        snprintf(buf, bufsize, "%d times within %d cycle(s)", action->count, action->cycles);
+        return buf;
+}
+
+
+char *Util_portTypeDescription(Port_T p) {
+        switch(p->type) {
+                case SOCK_STREAM:
+                        return p->SSL.use_ssl?"TCPSSL":"TCP";
+                case SOCK_DGRAM:
+                        return "UDP";
+                default:
+                        return "UNKNOWN";
+        }
+}
+
+
+char *Util_portDescription(Port_T p, char *buf, int bufsize) {
+        if (p->family == AF_INET)
+                snprintf(buf, STRLEN, "INET[%s:%d%s]%s%s", p->hostname, p->port, p->request ? p->request : "", p->family == AF_INET ? " via " : "", p->family == AF_INET ? Util_portTypeDescription(p) : "");
+        else if (p->family == AF_UNIX)
+                snprintf(buf, STRLEN, "UNIX[%s]", p->pathname);
+        else
+                *buf = 0;
+        return buf;
+}
+
+
+int Util_getfqdnhostname(char *buf, unsigned len) {
+        int status;
+        char hostname[STRLEN];
+        struct addrinfo hints, *info = NULL;
+        
+	// Set the base hostname
+        if (gethostname(hostname, sizeof(hostname))) {
+                LogError("%s: Error getting hostname -- %s\n", prog, STRERROR);
+                return -1;
+        }
+	snprintf(buf, len, "%s", hostname);
+        
+	// Try to look for FQDN hostname
+        memset(&hints, 0, sizeof(hints));
+        hints.ai_family = AF_UNSPEC;
+        hints.ai_socktype = SOCK_STREAM;
+        hints.ai_flags = AI_CANONNAME;
+        if ((status = getaddrinfo(hostname, NULL, &hints, &info))) {
+                LogError("%s: Cannot translate '%s' to FQDN name -- %s\n", prog, hostname, status == EAI_SYSTEM ? STRERROR : gai_strerror(status));
+        } else {
+		for (struct addrinfo *result = info; result; result = result->ai_next) {
+			if (Str_startsWith(result->ai_canonname, hostname)) {
+	                	snprintf(buf, len, "%s", result->ai_canonname);
+				break;
+			}
+		}
+	}
+        if (info)
+                freeaddrinfo(info);
+        return 0;
+}
+
diff --git a/monit-5.4/src/util.h b/monit-5.4/src/util.h
new file mode 100644
index 0000000..b0dea93
--- /dev/null
+++ b/monit-5.4/src/util.h
@@ -0,0 +1,405 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#ifndef MONIT_UTIL_H
+#define MONIT_UTIL_H
+
+
+/**
+ *  General purpose utility methods.
+ *
+ *  @file
+ */
+
+
+/**
+ * Replace all occurrences of the sub-string old in the string src
+ * with the sub-string new. The method is case sensitive for the
+ * sub-strings new and old. The string parameter src must be an
+ * allocated string, not a character array.
+ * @param src An allocated string reference (e.g. &string)
+ * @param old The old sub-string
+ * @param new The new sub-string
+ * @return src where all occurrences of the old sub-string are
+ * replaced with the new sub-string. 
+ */
+char *Util_replaceString(char **src, const char *old, const char *new);
+
+
+/**
+ * Count the number the sub-string word occurs in s.
+ * @param s The String to search for word in
+ * @param word 	The sub-string to count in s
+ */
+int Util_countWords(char *s, const char *word);
+
+
+/**
+ * Exchanges \escape sequences in a string
+ * @param buf A string
+ */
+void Util_handleEscapes(char *buf);
+
+
+/**
+ * Variant of Util_handleEscapes() which only handle \0x00 escape sequences 
+ * in a string
+ * @param buf A string
+ * @return The new length of buf
+ */
+int Util_handle0Escapes(char *buf);
+
+ 
+/**
+ * Convert a digest buffer to a char string
+ * @param digest buffer containing a MD digest
+ * @param mdlen digest length
+ * @param result buffer to write the result to. Must be at least 41 bytes long.
+ */
+char *Util_digest2Bytes(unsigned char *digest, int mdlen, MD_T result);
+
+
+/**
+ * Compute SHA1 and MD5 message digests simultaneously for bytes read
+ * from STREAM (suitable for stdin, which is not always rewindable).
+ * The resulting message digest numbers will be written into the first
+ * bytes of resblock buffers.
+ * @param stream The stream from where the digests are computed
+ * @param sha_resblock The buffer to write the SHA1 result to or NULL to skip the SHA1
+ * @param md5_resblock The buffer to write the MD5 result to or NULL to skip the MD5
+ * @return FALSE if failed, otherwise TRUE
+ */
+int Util_getStreamDigests(FILE *stream, void *sha_resblock, void *md5_resblock);
+
+
+/**
+ * Print MD5 and SHA1 hashes to standard output for given file or standard input
+ * @param file The file for which the hashes will be printed or NULL for stdin
+ */
+void Util_printHash(char *file);
+
+
+/**
+ * Store the checksum of given file in supplied buffer
+ * @param file The file for which to compute the checksum
+ * @param hashtype The hash type (HASH_MD5 or HASH_SHA1)
+ * @param buf The buffer where the result will be stored
+ * @param bufsize The size of the buffer
+ * @return FALSE if failed, otherwise TRUE
+ */
+int Util_getChecksum(char *file, int hashtype, char *buf, int bufsize);
+
+
+/**
+ * Get the HMAC-MD5 signature
+ * @param data The data to sign
+ * @param datalen The length of the data to sign
+ * @param key The key used for the signature
+ * @param keylen The length of the key
+ * @param digest Buffer containing a signature. Must be at least 16 bytes long.
+ */
+void Util_hmacMD5(const unsigned char *data, int datalen, const unsigned char *key, int keylen, unsigned char *digest);
+
+
+/**
+ * @param name A service name as stated in the config file
+ * @return the named service or NULL if not found
+ */
+Service_T Util_getService(const char *name);
+
+
+/**
+ * @param name A service name as stated in the config file
+ * @return TRUE if the service name exist in the
+ * servicelist, otherwise FALSE
+ */
+int Util_existService(const char *name);
+
+
+/**
+ * Get the length of the service list, that is; the number of services
+ * managed by monit
+ * @return The number of services monitored
+ */
+int Util_getNumberOfServices();
+
+
+/**
+ * Print the Runtime object
+ */
+void Util_printRunList();
+
+
+/**
+ * Print a service object
+ * @param p A Service_T object
+ */
+void Util_printService(Service_T s);
+
+
+/**
+ * Print all the services in the servicelist
+ */
+void Util_printServiceList();
+
+
+/**
+ * Open and read the id from the given idfile. If the idfile doesn't exist,
+ * generate new id and store it in the id file.
+ * @param idfile An idfile with full path
+ * @return the id or NULL
+ */
+char *Util_monitId(char *idfile);
+
+
+/**
+ * Open and read the pid from the given pidfile.
+ * @param pidfile A pidfile with full path
+ * @return the pid (TRUE) or FALSE if the pid could
+ * not be read from the file
+ */
+pid_t Util_getPid(char *pidfile);
+
+
+/**
+ * Check whether the process is running
+ * @param s The service being checked
+ * @param refresh TRUE to refresh the global ptree (useful for procmatch if process was mangled by monit in the same cycle such as by restart action) or FALSE to use cached ptree
+ * @return The PID of the running running process or 0 if the process is not running.
+ */
+int Util_isProcessRunning(Service_T s, int refresh);
+
+
+/**
+ * Compute an uptime for a process based on the ctime
+ * from the pidfile.
+ * @param pidfile A process pidfile
+ * @return an uptime
+ */
+time_t Util_getProcessUptime(char *pidfile);
+
+
+/**
+ * Compute an uptime string based on the delta time in seconds. The
+ * caller must free the returned string.
+ * @param delta seconds. 
+ * @param sep string separator
+ * @return an uptime string
+ */
+char *Util_getUptime(time_t delta, char *sep);
+
+
+/**
+ * Returns true if url contains url safe characters otherwise false
+ * @param url an url string to test
+ * @return true if url is url safe otherwise false
+ */
+int Util_isurlsafe(const char *url);
+
+/**
+ * Escape an url string converting unsafe characters to a hex (%xx)
+ * representation.  The caller must free the returned string.
+ * @param url an url string
+ * @return the escaped string
+ */
+char *Util_urlEncode(char *url);
+
+
+/**
+ * Unescape an url string. The <code>url</code> parameter is modified
+ * by this method.
+ * @param url an escaped url string
+ * @return A pointer to the unescaped <code>url</code>string
+ */
+char *Util_urlDecode(char *url);
+
+
+/**
+ * URL escape a service name so it can be safely transfeered over HTTP. In
+ * particular any '/' chars in name is encoded. The caller must free the 
+ * returned string.
+ * @param name a service name string to be URL encoded
+ * @return the escaped string
+ */
+char *Util_encodeServiceName(char *name);
+
+
+/**
+ * @return a Basic Authentication Authorization string (RFC 2617),
+ * with credentials from the Run object, NULL if credentials are not defined.
+ */
+char *Util_getBasicAuthHeaderMonit();
+
+
+/**
+ * @return a Basic Authentication Authorization string (RFC 2617),
+ * NULL if username is not defined.
+ */
+char *Util_getBasicAuthHeader(char *username, char *password);
+
+
+/**
+ * Redirect the standard file descriptors to /dev/null and route any
+ * error messages to the log file.
+ */
+void Util_redirectStdFds();
+
+
+/*
+ * Close all filedescriptors except standard. Everything
+ * seems to have getdtablesize, so we'll use it here, and back
+ * out to use 1024 if getdtablesize not available.
+ */
+
+void Util_closeFds();
+
+
+/*
+ * Check if monit does have credentials for this user.  If successful
+ * a pointer to the password is returned.
+ */
+
+Auth_T Util_getUserCredentials(char *uname);
+
+
+/**
+ * Check if the given password match the registred password for the
+ * given username. 
+ * @param uname Username
+ * @param outside The password to test
+ * @return TRUE if the passwords match for the given uname otherwise
+ * FALSE
+ */
+int Util_checkCredentials(char *uname, char *outside);
+
+
+/**
+ * Reset the service information structure
+ * @param s A Service_T object
+ */
+void Util_resetInfo(Service_T s);
+
+
+/**
+ * Are service status data available?
+ * @param s The service to test
+ * @return TRUE if available otherwise FALSE
+ */
+int Util_hasServiceStatus(Service_T s);
+
+
+/**
+ * Construct a HTTP/1.1 Host header utilizing information from the
+ * socket. The returned hostBuf is set to "hostname:port" or to the
+ * empty string if information is not available or not applicable.
+ * @param s A connected socket 
+ * @param hostBuf the buffer to write the host-header to
+ * @param len Length of the hostBuf
+ * @return the hostBuffer
+ */
+char *Util_getHTTPHostHeader(Socket_T s, char *hostBuf, int len);
+
+
+/**
+ * Evaluate a qualification expression. 
+ * @param operator The qualification operator
+ * @param left Expression lval
+ * @param rightExpression rval
+ * @return the boolean value of the expression
+ */
+int Util_evalQExpression(int operator, long long left, long long right);
+
+
+/*
+ * This will enable service monitoring in the case that it was disabled.
+ * @param s A Service_T object
+ */
+void Util_monitorSet(Service_T s);
+
+
+/*
+ * This will disable service monitoring in the case that it is enabled
+ * @param s A Service_T object
+ */
+void Util_monitorUnset(Service_T s);
+
+
+/*
+ * Retun appropriate action id for string
+ * @param action A action string
+ * @return the action id
+ */
+int Util_getAction(const char *action);
+
+
+/*
+ * Write full action description to given buffer
+ * @param action An action object
+ * @param buf Buffer
+ * @param bufsize Buffer size
+ * @return the buffer
+ */
+char *Util_describeAction(Action_T action, char *buf, int bufsize);
+
+
+/**
+ * Print event ratio needed to trigger the action to given buffer
+ * @param action A action string
+ * @param buf Buffer
+ * @param bufsize Buffer size
+ * @return the buffer
+ */
+char *Util_getEventratio(Action_T action, char *buf, int bufsize);
+
+
+/**
+ * Print port type description
+ * @param p A port structure
+ * @return the socket type description
+ */
+char *Util_portTypeDescription(Port_T p);
+
+
+/**
+ * Print full port description <INET|UNIX>\[<host>:<port>[request]\][via TCP|TCPSSL|UDP]
+ * @param p A port structure
+ * @param buf Buffer
+ * @param bufsize Buffer size
+ * @return the buffer
+ */
+char *Util_portDescription(Port_T p, char *buf, int bufsize);
+
+
+/**
+ *  Returns the FQDN hostname or fallback to gethostname() output
+ *  @param buf the character array for hostname
+ *  @param len the length of buf
+ *  @return zero on success
+ */
+int Util_getfqdnhostname(char *buf, unsigned len);
+
+
+#endif
+
diff --git a/monit-5.4/src/validate.c b/monit-5.4/src/validate.c
new file mode 100644
index 0000000..b7c9bd9
--- /dev/null
+++ b/monit-5.4/src/validate.c
@@ -0,0 +1,1374 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+
+#ifndef HAVE_SOL_IP
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#endif
+
+#ifdef HAVE_NETINET_IP_ICMP_H
+#include <netinet/ip_icmp.h>
+#endif
+
+#include "monit.h"
+#include "alert.h"
+#include "event.h"
+#include "socket.h"
+#include "net.h"
+#include "device.h"
+#include "process.h"
+#include "protocol.h"
+
+// libmonit
+#include "system/Time.h"
+#include "io/File.h"
+
+/**
+ *  Implementation of validation engine
+ *
+ *  @file
+ */
+
+
+/* ------------------------------------------------------------- Definitions */
+
+
+#define MATCH_LINE_LENGTH 512
+
+
+/* -------------------------------------------------------------- Prototypes */
+
+
+static void check_uid(Service_T);
+static void check_gid(Service_T);
+static void check_size(Service_T);
+static void check_uptime(Service_T);
+static void check_perm(Service_T);
+static void check_match(Service_T);
+static int  check_skip(Service_T, time_t);
+static void check_timeout(Service_T);
+static void check_checksum(Service_T);
+static void check_timestamp(Service_T);
+static void check_process_state(Service_T);
+static void check_process_pid(Service_T);
+static void check_process_ppid(Service_T);
+static void check_connection(Service_T, Port_T);
+static void check_filesystem_flags(Service_T);
+static void check_filesystem_resources(Service_T, Filesystem_T);
+static void check_process_resources(Service_T, Resource_T);
+static int  do_scheduled_action(Service_T);
+
+/* ---------------------------------------------------------------- Public */
+
+
+/**
+ *  This function contains the main check machinery for  monit. The
+ *  validate function check services in the service list to see if
+ *  they will pass all defined tests.
+ */
+int validate() {
+        int errors = 0;
+        Service_T s;
+        
+        Run.handler_flag = HANDLER_SUCCEEDED;
+        Event_queue_process();
+        
+        update_system_load();
+        initprocesstree(&ptree, &ptreesize, &oldptree, &oldptreesize);
+        gettimeofday(&systeminfo.collected, NULL);
+        
+        /* In the case that at least one action is pending, perform quick
+         * loop to handle the actions ASAP */
+        if (Run.doaction) {
+                Run.doaction = 0;
+                for (s = servicelist; s; s = s->next)
+                        do_scheduled_action(s);
+        }
+        
+        /* Check the services */
+        time_t now = Time_now();
+        for (s = servicelist; s && !Run.stopped; s = s->next) {
+                if (! do_scheduled_action(s) && s->monitor && ! check_skip(s, now)) {
+                        check_timeout(s); // Can disable monitoring => need to check s->monitor again
+                        if (s->monitor) {
+                                if (! s->check(s))
+                                        errors++;
+                                /* The monitoring may be disabled by some matching rule in s->check
+                                 * so we have to check again before setting to MONITOR_YES */
+                                if (s->monitor != MONITOR_NOT)
+                                        s->monitor = MONITOR_YES;
+                        }
+                        gettimeofday(&s->collected, NULL);
+                }
+        }
+        
+        reset_depend();
+        
+        return errors;
+}
+
+
+/**
+ * Validate a given process service s. Events are posted according to 
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_process(Service_T s) {
+        
+        pid_t  pid = -1;
+        Port_T pp = NULL;
+        Resource_T pr = NULL;
+        
+        ASSERT(s);
+        
+        /* Test for running process */
+        if (!(pid = Util_isProcessRunning(s, FALSE))) {
+                Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "process is not running");
+                return FALSE;
+        } else
+                Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "process is running with pid %d", (int)pid);
+        
+        if (Run.doprocess) {
+                if (update_process_data(s, ptree, ptreesize, pid)) {
+                        check_process_state(s);
+                        check_process_pid(s);
+                        check_process_ppid(s);
+                        if (s->uptimelist)
+                                check_uptime(s);
+                        for (pr = s->resourcelist; pr; pr = pr->next)
+                                check_process_resources(s, pr);
+                } else
+                        LogError("'%s' failed to get service data\n", s->name);
+        }
+        
+        /* Test each host:port and protocol in the service's portlist */
+        if (s->portlist)
+                for (pp = s->portlist; pp; pp = pp->next)
+                        check_connection(s, pp);
+        
+        return TRUE;
+        
+}
+
+
+/**
+ * Validate a given filesystem service s. Events are posted according to 
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_filesystem(Service_T s) {
+        char *p;
+        char path_buf[PATH_MAX+1];
+        Filesystem_T td;
+        struct stat stat_buf;
+        
+        ASSERT(s);
+        
+        p = s->path;
+        
+        /* We need to resolve symbolic link so if it points to device, we'll be able to find it in mnttab */
+        if (lstat(s->path, &stat_buf) != 0) {
+                Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "filesystem doesn't exist");
+                return FALSE;
+        }
+        if (S_ISLNK(stat_buf.st_mode)) {
+                if (! realpath(s->path, path_buf)) {
+                        Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "filesystem symbolic link error -- %s", STRERROR);
+                        return FALSE;
+                }
+                p = path_buf;
+                Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "filesystem symbolic link %s -> %s", s->path, p);
+                if (stat(p, &stat_buf) != 0) {
+                        Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "filesystem doesn't exist");
+                        return FALSE;
+                }
+        }
+        Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "filesystem exists");
+        
+        s->inf->st_mode = stat_buf.st_mode;
+        s->inf->st_uid  = stat_buf.st_uid;
+        s->inf->st_gid  = stat_buf.st_gid;
+        
+        if (!filesystem_usage(s->inf, p)) {
+                Event_post(s, Event_Data, STATE_FAILED, s->action_DATA, "unable to read filesystem %s state", p);
+                return FALSE;
+        }
+        s->inf->priv.filesystem.inode_percent = s->inf->priv.filesystem.f_files > 0 ? (int)((1000.0 * (s->inf->priv.filesystem.f_files - s->inf->priv.filesystem.f_filesfree)) / (float)s->inf->priv.filesystem.f_files) : 0;
+        s->inf->priv.filesystem.space_percent = s->inf->priv.filesystem.f_blocks > 0 ? (int)((1000.0 * (s->inf->priv.filesystem.f_blocks - s->inf->priv.filesystem.f_blocksfree)) / (float)s->inf->priv.filesystem.f_blocks) : 0;
+        s->inf->priv.filesystem.inode_total   = s->inf->priv.filesystem.f_files - s->inf->priv.filesystem.f_filesfree;
+        s->inf->priv.filesystem.space_total   = s->inf->priv.filesystem.f_blocks - s->inf->priv.filesystem.f_blocksfreetotal;
+        Event_post(s, Event_Data, STATE_SUCCEEDED, s->action_DATA, "succeeded getting filesystem statistic for %s", p);
+        
+        if (s->perm)
+                check_perm(s);
+        
+        if (s->uid)
+                check_uid(s);
+        
+        if (s->gid)
+                check_gid(s);
+        
+        check_filesystem_flags(s);
+        
+        if (s->filesystemlist)
+                for (td = s->filesystemlist; td; td = td->next)
+                        check_filesystem_resources(s, td);
+        
+        return TRUE;
+}
+
+
+/**
+ * Validate a given file service s. Events are posted according to 
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_file(Service_T s) {
+        struct stat stat_buf;
+        
+        ASSERT(s);
+        
+        if (stat(s->path, &stat_buf) != 0) {
+                Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "file doesn't exist");
+                return FALSE;
+        } else {
+                s->inf->st_mode = stat_buf.st_mode;
+                if (s->inf->priv.file.st_ino)
+                        s->inf->priv.file.st_ino_prev = s->inf->priv.file.st_ino;
+                s->inf->priv.file.st_ino  = stat_buf.st_ino;
+                s->inf->st_uid            = stat_buf.st_uid;
+                s->inf->st_gid            = stat_buf.st_gid;
+                s->inf->priv.file.st_size = stat_buf.st_size;
+                s->inf->timestamp         = MAX(stat_buf.st_mtime, stat_buf.st_ctime);
+                DEBUG("'%s' file exists check succeeded\n", s->name);
+                Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "file exist");
+        }
+        
+        if (!S_ISREG(s->inf->st_mode)) {
+                Event_post(s, Event_Invalid, STATE_FAILED, s->action_INVALID, "is not a regular file");
+                return FALSE;
+        } else {
+                DEBUG("'%s' is a regular file\n", s->name);
+                Event_post(s, Event_Invalid, STATE_SUCCEEDED, s->action_INVALID, "is a regular file");
+        }
+        
+        if (s->checksum)
+                check_checksum(s);
+        
+        if (s->perm)
+                check_perm(s);
+        
+        if (s->uid)
+                check_uid(s);
+        
+        if (s->gid)
+                check_gid(s);
+        
+        if (s->sizelist)
+                check_size(s);
+        
+        if (s->timestamplist)
+                check_timestamp(s);
+        
+        if (s->matchlist)
+                check_match(s);
+        
+        return TRUE;
+        
+}
+
+
+/**
+ * Validate a given directory service s. Events are posted according to
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_directory(Service_T s) {
+        
+        struct stat stat_buf;
+        
+        ASSERT(s);
+        
+        if (stat(s->path, &stat_buf) != 0) {
+                Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "directory doesn't exist");
+                return FALSE;
+        } else {
+                s->inf->st_mode   = stat_buf.st_mode;
+                s->inf->st_uid    = stat_buf.st_uid;
+                s->inf->st_gid    = stat_buf.st_gid;
+                s->inf->timestamp = MAX(stat_buf.st_mtime, stat_buf.st_ctime);
+                DEBUG("'%s' directory exists check succeeded\n", s->name);
+                Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "directory exist");
+        }
+        
+        if (!S_ISDIR(s->inf->st_mode)) {
+                Event_post(s, Event_Invalid, STATE_FAILED, s->action_INVALID, "is not directory");
+                return FALSE;
+        } else {
+                DEBUG("'%s' is directory\n", s->name);
+                Event_post(s, Event_Invalid, STATE_SUCCEEDED, s->action_INVALID, "is directory");
+        }
+        
+        if (s->perm)
+                check_perm(s);
+        
+        if (s->uid)
+                check_uid(s);
+        
+        if (s->gid)
+                check_gid(s);
+        
+        if (s->timestamplist)
+                check_timestamp(s);
+        
+        return TRUE;
+        
+}
+
+
+/**
+ * Validate a given fifo service s. Events are posted according to 
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_fifo(Service_T s) {
+        
+        struct stat stat_buf;
+        
+        ASSERT(s);
+        
+        if (stat(s->path, &stat_buf) != 0) {
+                Event_post(s, Event_Nonexist, STATE_FAILED, s->action_NONEXIST, "fifo doesn't exist");
+                return FALSE;
+        } else {
+                s->inf->st_mode   = stat_buf.st_mode;
+                s->inf->st_uid    = stat_buf.st_uid;
+                s->inf->st_gid    = stat_buf.st_gid;
+                s->inf->timestamp = MAX(stat_buf.st_mtime, stat_buf.st_ctime);
+                DEBUG("'%s' fifo exists check succeeded\n", s->name);
+                Event_post(s, Event_Nonexist, STATE_SUCCEEDED, s->action_NONEXIST, "fifo exist");
+        }
+        
+        if (!S_ISFIFO(s->inf->st_mode)) {
+                Event_post(s, Event_Invalid, STATE_FAILED, s->action_INVALID, "is not fifo");
+                return FALSE;
+        } else {
+                DEBUG("'%s' is fifo\n", s->name);
+                Event_post(s, Event_Invalid, STATE_SUCCEEDED, s->action_INVALID, "is fifo");
+        }
+        
+        if (s->perm)
+                check_perm(s);
+        
+        if (s->uid)
+                check_uid(s);
+        
+        if (s->gid)
+                check_gid(s);
+        
+        if (s->timestamplist)
+                check_timestamp(s);
+        
+        return TRUE;
+        
+}
+
+
+/**
+ * Validate a program status. Events are posted according to 
+ * its configuration. In case of a fatal event FALSE is returned.
+ */
+int check_program(Service_T s) {
+        
+        ASSERT(s);
+
+        time_t now = Time_now();
+        Process_T P = s->program->P;
+        
+        /* Create the Command object unless it has already been created. */
+        if (! s->program->C) {
+                if (! File_exist(s->path)) {
+                        Event_post(s, Event_Status, STATE_FAILED, s->action_EXEC, "Program '%s' does not exist", s->path);
+                        return FALSE;
+                } else if (! File_isExecutable(s->path)) {
+                        Event_post(s, Event_Status, STATE_FAILED, s->action_EXEC, "Program '%s' is not executable ", s->path);
+                        return FALSE;
+                }
+                s->program->C = Command_new(s->path, NULL);
+        }
+        
+        if (P) {
+                if (Process_exitStatus(P) < 0) { // Program is still running
+                        time_t execution_time = (now - s->program->started);
+                        if (execution_time > s->program->timeout) { // Program timed out
+                                LogError("'%s' program timed out after %ld seconds. Killing program with pid %ld\n", s->name, (long)execution_time, (long)Process_getPid(P));
+                                Process_kill(P); 
+                                Process_waitFor(P); // Wait for child to exit to get correct exit value
+                                // Fall-through with P and evaluate exit value below. 
+                        } else { 
+                                // Defer test of exit value until program exit or timeout
+                                DEBUG("'%s' status check defered - waiting on program to exit\n", s->name);
+                                return TRUE;
+                        }
+                }
+                s->program->exitStatus = Process_exitStatus(P); // Save exit status for web-view display 
+                // Evaluate program's exit status against our status check
+                if (Util_evalQExpression(s->program->operator, s->program->exitStatus, s->program->return_value)) {
+                        int n; char buf[STRLEN + 1] = "no output to stderr";
+                        if ((n = InputStream_readBytes(Process_getErrorStream(P), buf, STRLEN)) > 0) buf[n] = 0;
+                        Event_post(s, Event_Status, STATE_FAILED, s->program->action, "status failed (%d) for %s. Error: %s..", s->program->exitStatus, s->path, buf);
+                } else {
+                        DEBUG("'%s' status check succeeded\n", s->name);
+                        Event_post(s, Event_Status, STATE_SUCCEEDED, s->program->action, "status succeeded");
+                }
+                Process_free(&s->program->P);
+        } 
+
+        // Start program 
+        s->program->P = Command_execute(s->program->C);
+        if (! s->program->P) {
+                Event_post(s, Event_Status, STATE_FAILED, s->action_EXEC, "failed to execute '%s' -- %s", s->path, STRERROR);
+        } else {
+                Event_post(s, Event_Status, STATE_SUCCEEDED, s->action_EXEC, "'%s' program started", s->name);
+                s->program->started = now;
+        }
+        return TRUE;
+}
+
+
+/**
+ * Validate a remote service.
+ * @param s The remote service to validate
+ * @return FALSE if there was an error otherwise TRUE
+ */
+int check_remote_host(Service_T s) {
+        
+        Port_T p = NULL;
+        Icmp_T icmp = NULL;
+        Icmp_T last_ping = NULL;
+        
+        ASSERT(s);
+        
+        /* Test each icmp type in the service's icmplist */
+        if (s->icmplist) {
+                for (icmp = s->icmplist; icmp; icmp = icmp->next) {
+                        
+                        switch(icmp->type) {
+                                case ICMP_ECHO:
+                                        
+                                        icmp->response = icmp_echo(s->path, icmp->timeout, icmp->count);
+                                        
+                                        if (icmp->response == -2) {
+                                                icmp->is_available = TRUE;
+                                                DEBUG("'%s' icmp ping skipped -- the monit user has no permission to create raw socket, please run monit as root or add privilege for net_icmpaccess\n", s->name);
+                                        } else if (icmp->response == -1) {
+                                                icmp->is_available = FALSE;
+                                                DEBUG("'%s' icmp ping failed\n", s->name);
+                                                Event_post(s, Event_Icmp, STATE_FAILED, icmp->action, "failed ICMP test [%s]", icmpnames[icmp->type]);
+                                        } else {
+                                                icmp->is_available = TRUE;
+                                                DEBUG("'%s' icmp ping succeeded [response time %.3fs]\n", s->name, icmp->response);
+                                                Event_post(s, Event_Icmp, STATE_SUCCEEDED, icmp->action, "succeeded ICMP test [%s]", icmpnames[icmp->type]);
+                                        }
+                                        last_ping = icmp;
+                                        break;
+                                        
+                                default:
+                                        LogError("'%s' error -- unknown ICMP type: [%d]\n", s->name, icmp->type);
+                                        return FALSE;
+                                        
+                        }
+                }
+        }
+        
+        /* If we could not ping the host we assume it's down and do not
+         * continue to check any port connections  */
+        if (last_ping && !last_ping->is_available) {
+                DEBUG("'%s' icmp ping failed, skipping any port connection tests\n", s->name);
+                return FALSE;
+        }
+        
+        /* Test each host:port and protocol in the service's portlist */
+        if (s->portlist)
+                for (p = s->portlist; p; p = p->next)
+                        check_connection(s, p);
+        
+        return TRUE;
+        
+}
+
+
+/**
+ * Validate the general system indicators. In case of a fatal event
+ * FALSE is returned.
+ */
+int check_system(Service_T s) {
+        Resource_T r = NULL;
+        
+        ASSERT(s);
+        
+        for (r = s->resourcelist; r; r = r->next) {
+                check_process_resources(s, r);
+        }
+        
+        return TRUE;
+}
+
+
+/* --------------------------------------------------------------- Private */
+
+
+/**
+ * Test the connection and protocol
+ */
+static void check_connection(Service_T s, Port_T p) {
+        Socket_T socket;
+        volatile int retry_count = p->retry;
+        volatile int rv = TRUE;
+        char buf[STRLEN];
+        char report[STRLEN] = {0};
+        struct timeval t1;
+        struct timeval t2;
+        
+        ASSERT(s && p);
+retry:
+        /* Get time of connection attempt beginning */
+        gettimeofday(&t1, NULL);
+        
+        /* Open a socket to the destination INET[hostname:port] or UNIX[pathname] */
+        socket = socket_create(p);
+        if (!socket) {
+                snprintf(report, STRLEN, "failed, cannot open a connection to %s", Util_portDescription(p, buf, sizeof(buf)));
+                rv = FALSE;
+                goto error;
+        } else
+                DEBUG("'%s' succeeded connecting to %s\n", s->name, Util_portDescription(p, buf, sizeof(buf)));
+        
+        /* Verify that the socket is ready for i|o. TCP sockets are checked anytime, UDP
+         * sockets just when there is no specific protocol test used since the socket_is_ready()
+         * adds 2s delay when used with UDP socket. When there is specific protocol used, we
+         * don't need it for UDP, since the protocol test is sufficient */
+        if ((socket_get_type(socket) != SOCK_DGRAM || p->protocol->check == check_default) && !socket_is_ready(socket)) {
+                snprintf(report, STRLEN, "connection failed, %s is not ready for i|o -- %s", Util_portDescription(p, buf, sizeof(buf)), STRERROR);
+                rv = FALSE;
+                goto error;
+        }
+        
+        /* Run the protocol verification routine through the socket */
+        if (! p->protocol->check(socket)) {
+                snprintf(report, STRLEN, "failed protocol test [%s] at %s -- %s", p->protocol->name, Util_portDescription(p, buf, sizeof(buf)), socket_getError(socket));
+                rv = FALSE;
+                goto error;
+        } else
+                DEBUG("'%s' succeeded testing protocol [%s] at %s\n", s->name, p->protocol->name, Util_portDescription(p, buf, sizeof(buf)));
+        
+        /* Get time of connection attempt finish */
+        gettimeofday(&t2, NULL);
+        
+        /* Get the response time */
+        p->response = (double)(t2.tv_sec - t1.tv_sec) + (double)(t2.tv_usec - t1.tv_usec)/1000000;
+        
+error:
+        if (socket)
+                socket_free(&socket);
+        if (!rv) {
+                if (retry_count-- > 1) {
+                        DEBUG("'%s' %s (attempt %d/%d)\n", s->name, report, p->retry - retry_count, p->retry);
+                        goto retry;
+                }
+                p->response = -1;
+                p->is_available = FALSE;
+                Event_post(s, Event_Connection, STATE_FAILED, p->action, report);
+        } else {
+                p->is_available = TRUE;
+                Event_post(s, Event_Connection, STATE_SUCCEEDED, p->action, "connection succeeded to %s", Util_portDescription(p, buf, sizeof(buf)));
+        }
+        
+}
+
+
+/**
+ * Test process state (e.g. Zombie)
+ */
+static void check_process_state(Service_T s) {
+        
+        ASSERT(s);
+        
+        if (s->inf->priv.process.status_flag & PROCESS_ZOMBIE)
+                Event_post(s, Event_Data, STATE_FAILED, s->action_DATA, "process with pid %d is a zombie", s->inf->priv.process.pid);
+        else {
+                DEBUG("'%s' zombie check succeeded [status_flag=%04x]\n", s->name,  s->inf->priv.process.status_flag);
+                Event_post(s, Event_Data, STATE_SUCCEEDED, s->action_DATA, "check process state succeeded");
+        }
+        
+}
+
+
+/**
+ * Test process pid for possible change since last cycle
+ */
+static void check_process_pid(Service_T s) {
+        
+        ASSERT(s && s->inf);
+        
+        /* process pid was not initialized yet */
+        if (s->inf->priv.process._pid == -1)
+                return;
+        
+        if (s->inf->priv.process._pid != s->inf->priv.process.pid)
+                Event_post(s, Event_Pid, STATE_CHANGED, s->action_PID, "process PID changed from %d to %d", s->inf->priv.process._pid, s->inf->priv.process.pid);
+        else
+                Event_post(s, Event_Pid, STATE_CHANGEDNOT, s->action_PID, "process PID has not changed since last cycle");
+}
+
+
+/**
+ * Test process ppid for possible change since last cycle
+ */
+static void check_process_ppid(Service_T s) {
+        
+        ASSERT(s && s->inf);
+        
+        /* process ppid was not initialized yet */
+        if (s->inf->priv.process._ppid == -1)
+                return;
+        
+        if (s->inf->priv.process._ppid != s->inf->priv.process.ppid)
+                Event_post(s, Event_PPid, STATE_CHANGED, s->action_PPID, "process PPID changed from %d to %d", s->inf->priv.process._ppid, s->inf->priv.process.ppid);
+        else
+                Event_post(s, Event_PPid, STATE_CHANGEDNOT, s->action_PPID, "process PPID has not changed since last cycle");
+}
+
+
+/**
+ * Check process resources
+ */
+static void check_process_resources(Service_T s, Resource_T r) {
+        
+        int okay = TRUE;
+        char report[STRLEN]={0};
+        
+        ASSERT(s && r);
+        
+        switch(r->resource_id) {
+                        
+                case RESOURCE_ID_CPU_PERCENT:
+                        if (s->monitor & MONITOR_INIT || s->inf->priv.process.cpu_percent < 0) {
+                                DEBUG("'%s' cpu usage check skipped (initializing)\n", s->name);
+                        } else if (Util_evalQExpression(r->operator, s->inf->priv.process.cpu_percent, r->limit)) {
+                                snprintf(report, STRLEN, "cpu usage of %.1f%% matches resource limit [cpu usage%s%.1f%%]", s->inf->priv.process.cpu_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' cpu usage check succeeded [current cpu usage=%.1f%%]", s->name, s->inf->priv.process.cpu_percent/10.0);
+                        break;
+                        
+                case RESOURCE_ID_TOTAL_CPU_PERCENT:
+                        if (s->monitor & MONITOR_INIT || s->inf->priv.process.total_cpu_percent < 0) {
+                                DEBUG("'%s' total cpu usage check skipped (initializing)\n", s->name);
+                        } else if (Util_evalQExpression(r->operator, s->inf->priv.process.total_cpu_percent, r->limit)) {
+                                snprintf(report, STRLEN, "total cpu usage of %.1f%% matches resource limit [cpu usage%s%.1f%%]", s->inf->priv.process.total_cpu_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' total cpu usage check succeeded [current cpu usage=%.1f%%]", s->name, s->inf->priv.process.total_cpu_percent/10.0);
+                        break;
+                        
+                case RESOURCE_ID_CPUUSER:
+                        if (s->monitor & MONITOR_INIT || systeminfo.total_cpu_user_percent < 0) {
+                                DEBUG("'%s' cpu user usage check skipped (initializing)\n", s->name);
+                        } else if (Util_evalQExpression(r->operator, systeminfo.total_cpu_user_percent, r->limit)) {
+                                snprintf(report, STRLEN, "cpu user usage of %.1f%% matches resource limit [cpu user usage%s%.1f%%]", systeminfo.total_cpu_user_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' cpu user usage check succeeded [current cpu user usage=%.1f%%]", s->name, systeminfo.total_cpu_user_percent/10.0);
+                        break;
+                        
+                case RESOURCE_ID_CPUSYSTEM:
+                        if (s->monitor & MONITOR_INIT || systeminfo.total_cpu_syst_percent < 0) {
+                                DEBUG("'%s' cpu system usage check skipped (initializing)\n", s->name);
+                        } else if (Util_evalQExpression(r->operator, systeminfo.total_cpu_syst_percent, r->limit)) {
+                                snprintf(report, STRLEN, "cpu system usage of %.1f%% matches resource limit [cpu system usage%s%.1f%%]", systeminfo.total_cpu_syst_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' cpu system usage check succeeded [current cpu system usage=%.1f%%]", s->name, systeminfo.total_cpu_syst_percent/10.0);
+                        break;
+                        
+                case RESOURCE_ID_CPUWAIT:
+                        if (s->monitor & MONITOR_INIT || systeminfo.total_cpu_wait_percent < 0) {
+                                DEBUG("'%s' cpu wait usage check skipped (initializing)\n", s->name);
+                        } else if (Util_evalQExpression(r->operator, systeminfo.total_cpu_wait_percent, r->limit)) {
+                                snprintf(report, STRLEN, "cpu wait usage of %.1f%% matches resource limit [cpu wait usage%s%.1f%%]", systeminfo.total_cpu_wait_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' cpu wait usage check succeeded [current cpu wait usage=%.1f%%]", s->name, systeminfo.total_cpu_wait_percent/10.0);
+                        break;
+                        
+                case RESOURCE_ID_MEM_PERCENT:
+                        if (s->type == TYPE_SYSTEM) {
+                                if (Util_evalQExpression(r->operator, systeminfo.total_mem_percent, r->limit)) {
+                                        snprintf(report, STRLEN, "mem usage of %.1f%% matches resource limit [mem usage%s%.1f%%]", systeminfo.total_mem_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' mem usage check succeeded [current mem usage=%.1f%%]", s->name, systeminfo.total_mem_percent/10.0);
+                        } else {
+                                if (Util_evalQExpression(r->operator, s->inf->priv.process.mem_percent, r->limit)) {
+                                        snprintf(report, STRLEN, "mem usage of %.1f%% matches resource limit [mem usage%s%.1f%%]", s->inf->priv.process.mem_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' mem usage check succeeded [current mem usage=%.1f%%]", s->name, s->inf->priv.process.mem_percent/10.0);
+                        }
+                        break;
+                        
+                case RESOURCE_ID_MEM_KBYTE:
+                        if (s->type == TYPE_SYSTEM) {
+                                if (Util_evalQExpression(r->operator, systeminfo.total_mem_kbyte, r->limit)) {
+                                        snprintf(report, STRLEN, "mem amount of %ldkB matches resource limit [mem amount%s%ldkB]", systeminfo.total_mem_kbyte, operatorshortnames[r->operator], r->limit);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' mem amount check succeeded [current mem amount=%ldkB]", s->name, systeminfo.total_mem_kbyte);
+                        } else {
+                                if (Util_evalQExpression(r->operator, s->inf->priv.process.mem_kbyte, r->limit)) {
+                                        snprintf(report, STRLEN, "mem amount of %ldkB matches resource limit [mem amount%s%ldkB]", s->inf->priv.process.mem_kbyte, operatorshortnames[r->operator], r->limit);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' mem amount check succeeded [current mem amount=%ldkB]", s->name, s->inf->priv.process.mem_kbyte);
+                        }
+                        break;
+                        
+                case RESOURCE_ID_SWAP_PERCENT:
+                        if (s->type == TYPE_SYSTEM) {
+                                if (Util_evalQExpression(r->operator, systeminfo.total_swap_percent, r->limit)) {
+                                        snprintf(report, STRLEN, "swap usage of %.1f%% matches resource limit [swap usage%s%.1f%%]", systeminfo.total_swap_percent/10.0, operatorshortnames[r->operator], r->limit/10.0);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' swap usage check succeeded [current swap usage=%.1f%%]", s->name, systeminfo.total_swap_percent/10.0);
+                        }
+                        break;
+                        
+                case RESOURCE_ID_SWAP_KBYTE:
+                        if (s->type == TYPE_SYSTEM) {
+                                if (Util_evalQExpression(r->operator, systeminfo.total_swap_kbyte, r->limit)) {
+                                        snprintf(report, STRLEN, "swap amount of %ldkB matches resource limit [swap amount%s%ldkB]", systeminfo.total_swap_kbyte, operatorshortnames[r->operator], r->limit);
+                                        okay = FALSE;
+                                } else
+                                        snprintf(report, STRLEN, "'%s' swap amount check succeeded [current swap amount=%ldkB]", s->name, systeminfo.total_swap_kbyte);
+                        }
+                        break;
+                        
+                case RESOURCE_ID_LOAD1:
+                        if (Util_evalQExpression(r->operator, (int)(systeminfo.loadavg[0]*10.0), r->limit)) {
+                                snprintf(report, STRLEN, "loadavg(1min) of %.1f matches resource limit [loadavg(1min)%s%.1f]", systeminfo.loadavg[0], operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' loadavg(1min) check succeeded [current loadavg(1min)=%.1f]", s->name, systeminfo.loadavg[0]);
+                        break;
+                        
+                case RESOURCE_ID_LOAD5:
+                        if (Util_evalQExpression(r->operator, (int)(systeminfo.loadavg[1]*10.0), r->limit)) {
+                                snprintf(report, STRLEN, "loadavg(5min) of %.1f matches resource limit [loadavg(5min)%s%.1f]", systeminfo.loadavg[1], operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' loadavg(5min) check succeeded [current loadavg(5min)=%.1f]", s->name, systeminfo.loadavg[1]);
+                        break;
+                        
+                case RESOURCE_ID_LOAD15:
+                        if (Util_evalQExpression(r->operator, (int)(systeminfo.loadavg[2]*10.0), r->limit)) {
+                                snprintf(report, STRLEN, "loadavg(15min) of %.1f matches resource limit [loadavg(15min)%s%.1f]", systeminfo.loadavg[2], operatorshortnames[r->operator], r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' loadavg(15min) check succeeded [current loadavg(15min)=%.1f]", s->name, systeminfo.loadavg[2]);
+                        break;
+                        
+                case RESOURCE_ID_CHILDREN:
+                        if (Util_evalQExpression(r->operator, s->inf->priv.process.children, r->limit)) {
+                                snprintf(report, STRLEN, "children of %i matches resource limit [children%s%ld]", s->inf->priv.process.children, operatorshortnames[r->operator], r->limit);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' children check succeeded [current children=%i]", s->name, s->inf->priv.process.children);
+                        break;
+                        
+                case RESOURCE_ID_TOTAL_MEM_KBYTE:
+                        if (Util_evalQExpression(r->operator, s->inf->priv.process.total_mem_kbyte, r->limit)) {
+                                snprintf(report, STRLEN, "total mem amount of %ldkB matches resource limit [total mem amount%s%ldkB]", s->inf->priv.process.total_mem_kbyte, operatorshortnames[r->operator], r->limit);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' total mem amount check succeeded [current total mem amount=%ldkB]", s->name, s->inf->priv.process.total_mem_kbyte);
+                        break;
+                        
+                case RESOURCE_ID_TOTAL_MEM_PERCENT:
+                        if (Util_evalQExpression(r->operator, s->inf->priv.process.total_mem_percent, r->limit)) {
+                                snprintf(report, STRLEN, "total mem amount of %.1f%% matches resource limit [total mem amount%s%.1f%%]", (float)s->inf->priv.process.total_mem_percent/10.0, operatorshortnames[r->operator], (float)r->limit/10.0);
+                                okay = FALSE;
+                        } else
+                                snprintf(report, STRLEN, "'%s' total mem amount check succeeded [current total mem amount=%.1f%%]", s->name, s->inf->priv.process.total_mem_percent/10.0);
+                        break;
+                        
+                default:
+                        LogError("'%s' error -- unknown resource ID: [%d]\n", s->name, r->resource_id);
+                        return;
+        }
+        
+        if (! okay)
+                Event_post(s, Event_Resource, STATE_FAILED, r->action, "%s", report);
+        else {
+                Event_post(s, Event_Resource, STATE_SUCCEEDED, r->action, "%s", report);
+                if (*report)
+                        DEBUG("%s\n", report);
+        }
+}
+
+
+/**
+ * Test for associated path checksum change
+ */
+static void check_checksum(Service_T s) {
+        int         changed;
+        Checksum_T  cs;
+        
+        ASSERT(s && s->path && s->checksum);
+        
+        cs = s->checksum;
+        
+        if (Util_getChecksum(s->path, cs->type, s->inf->priv.file.cs_sum, sizeof(s->inf->priv.file.cs_sum))) {
+                
+                Event_post(s, Event_Data, STATE_SUCCEEDED, s->action_DATA, "checksum computed for %s", s->path);
+                
+                switch(cs->type) {
+                        case HASH_MD5:
+                                changed = strncmp(cs->hash, s->inf->priv.file.cs_sum, 32);
+                                break;
+                        case HASH_SHA1:
+                                changed = strncmp(cs->hash, s->inf->priv.file.cs_sum, 40);
+                                break;
+                        default:
+                                LogError("'%s' unknown hash type\n", s->name);
+                                *s->inf->priv.file.cs_sum = 0;
+                                return;
+                }
+                
+                if (changed) {
+                        
+                        /* if we are testing for changes only, the value is variable */
+                        if (cs->test_changes) {
+                                if (!cs->test_changes_ok)
+                                /* the checksum was not initialized during monit start, so set the checksum now and allow further checksum change testing */
+                                        cs->test_changes_ok = TRUE;
+                                else
+                                        Event_post(s, Event_Checksum, STATE_CHANGED, cs->action, "checksum was changed for %s", s->path);
+                                
+                                /* reset expected value for next cycle */
+                                snprintf(cs->hash, sizeof(cs->hash), "%s", s->inf->priv.file.cs_sum);
+                                
+                        } else
+                        /* we are testing constant value for failed or succeeded state */
+                                Event_post(s, Event_Checksum, STATE_FAILED, cs->action, "checksum test failed for %s", s->path);
+                        
+                } else if (cs->test_changes) {
+                        
+                        DEBUG("'%s' checksum has not changed\n", s->name);
+                        Event_post(s, Event_Checksum, STATE_CHANGEDNOT, cs->action, "checksum has not changed");
+                        
+                } else {
+                        
+                        DEBUG("'%s' has valid checksums\n", s->name);
+                        Event_post(s, Event_Checksum, STATE_SUCCEEDED, cs->action, "checksum succeeded");
+                        
+                }
+                return;
+        }
+        
+        Event_post(s, Event_Data, STATE_FAILED, s->action_DATA, "cannot compute checksum for %s", s->path);
+        
+}
+
+
+/**
+ * Test for associated path permission change
+ */
+static void check_perm(Service_T s) {
+        ASSERT(s && s->perm);
+        
+        if ((s->inf->st_mode & 07777) != s->perm->perm)
+                Event_post(s, Event_Permission, STATE_FAILED, s->perm->action, "permission test failed for %s -- current permission is %04o", s->path, s->inf->st_mode&07777);
+        else {
+                DEBUG("'%s' permission check succeeded [current permission=%04o]\n", s->name, s->inf->st_mode&07777);
+                Event_post(s, Event_Permission, STATE_SUCCEEDED, s->perm->action, "permission succeeded");
+        }
+}
+
+
+/**
+ * Test for associated path uid change
+ */
+static void check_uid(Service_T s) {
+        ASSERT(s && s->uid);
+        
+        if (s->inf->st_uid != s->uid->uid)
+                Event_post(s, Event_Uid, STATE_FAILED, s->uid->action, "uid test failed for %s -- current uid is %d", s->path, (int)s->inf->st_uid);
+        else {
+                DEBUG("'%s' uid check succeeded [current uid=%d]\n", s->name, (int)s->inf->st_uid);
+                Event_post(s, Event_Uid, STATE_SUCCEEDED, s->uid->action, "uid succeeded");
+        }
+}
+
+
+/**
+ * Test for associated path gid change
+ */
+static void check_gid(Service_T s) {
+        ASSERT(s && s->gid);
+        
+        if (s->inf->st_gid != s->gid->gid )
+                Event_post(s, Event_Gid, STATE_FAILED, s->gid->action, "gid test failed for %s -- current gid is %d", s->path, (int)s->inf->st_gid);
+        else {
+                DEBUG("'%s' gid check succeeded [current gid=%d]\n", s->name, (int)s->inf->st_gid);
+                Event_post(s, Event_Gid, STATE_SUCCEEDED, s->gid->action, "gid succeeded");
+        }
+}
+
+
+/**
+ * Validate timestamps of a service s
+ */
+static void check_timestamp(Service_T s) {
+        Timestamp_T t;
+        time_t      now;
+        
+        ASSERT(s && s->timestamplist);
+        
+        if ((int)time(&now) == -1) {
+                Event_post(s, Event_Data, STATE_FAILED, s->action_DATA, "can't obtain actual system time");
+                return;
+        } else
+                Event_post(s, Event_Data, STATE_SUCCEEDED, s->action_DATA, "actual system time obtained");
+        
+        for (t = s->timestamplist; t; t = t->next) {
+                if (t->test_changes) {
+                        
+                        /* if we are testing for changes only, the value is variable */
+                        
+                        if (t->timestamp != s->inf->timestamp) {
+                                /* reset expected value for next cycle */
+                                t->timestamp = s->inf->timestamp;
+                                Event_post(s, Event_Timestamp, STATE_CHANGED, t->action, "timestamp was changed for %s", s->path);
+                        } else {
+                                DEBUG("'%s' timestamp was not changed for %s\n", s->name, s->path);
+                                Event_post(s, Event_Timestamp, STATE_CHANGEDNOT, t->action, "timestamp was not changed for %s", s->path);
+                        }
+                        break;
+                } else {
+                        
+                        /* we are testing constant value for failed or succeeded state */
+                        
+                        if (Util_evalQExpression(t->operator, (int)(now - s->inf->timestamp), t->time))
+                                Event_post(s, Event_Timestamp, STATE_FAILED, t->action, "timestamp test failed for %s", s->path);
+                        else {
+                                DEBUG("'%s' timestamp test succeeded for %s\n", s->name, s->path); 
+                                Event_post(s, Event_Timestamp, STATE_SUCCEEDED, t->action, "timestamp succeeded");
+                        }
+                }
+        }
+}
+
+
+/**
+ * Test size
+ */
+static void check_size(Service_T s) {
+        Size_T sl;
+        
+        ASSERT(s && s->sizelist);
+        
+        for (sl = s->sizelist; sl; sl = sl->next) {
+                
+                /* if we are testing for changes only, the value is variable */
+                if (sl->test_changes) {
+                        if (!sl->test_changes_ok) {
+                                /* the size was not initialized during monit start, so set the size now
+                                 * and allow further size change testing */
+                                sl->test_changes_ok = TRUE;
+                                sl->size = s->inf->priv.file.st_size;
+                        } else {
+                                if (sl->size != s->inf->priv.file.st_size) {
+                                        Event_post(s, Event_Size, STATE_CHANGED, sl->action, "size was changed for %s", s->path);
+                                        /* reset expected value for next cycle */
+                                        sl->size = s->inf->priv.file.st_size;
+                                } else {
+                                        DEBUG("'%s' size has not changed [current size=%llu B]\n", s->name, s->inf->priv.file.st_size);
+                                        Event_post(s, Event_Size, STATE_CHANGEDNOT, sl->action, "size was not changed", s->path);
+                                }
+                        }
+                        break;
+                }
+                
+                /* we are testing constant value for failed or succeeded state */
+                if (Util_evalQExpression(sl->operator, s->inf->priv.file.st_size, sl->size))
+                        Event_post(s, Event_Size, STATE_FAILED, sl->action, "size test failed for %s -- current size is %llu B", s->path, s->inf->priv.file.st_size);
+                else {
+                        DEBUG("'%s' size check succeeded [current size=%llu B]\n", s->name, s->inf->priv.file.st_size);
+                        Event_post(s, Event_Size, STATE_SUCCEEDED, sl->action, "size succeeded");
+                }
+        }
+}
+
+
+/**
+ * Test uptime
+ */
+static void check_uptime(Service_T s) {
+        Uptime_T ul;
+
+        ASSERT(s && s->uptimelist);
+
+        for (ul = s->uptimelist; ul; ul = ul->next) {
+                if (Util_evalQExpression(ul->operator, s->inf->priv.process.uptime, ul->uptime))
+                        Event_post(s, Event_Uptime, STATE_FAILED, ul->action, "uptime test failed for %s -- current uptime is %llu seconds", s->path, s->inf->priv.process.uptime);
+                else {
+                        DEBUG("'%s' uptime check succeeded [current uptime=%llu seconds]\n", s->name, s->inf->priv.process.uptime);
+                        Event_post(s, Event_Uptime, STATE_SUCCEEDED, ul->action, "uptime succeeded");
+                }
+        }
+}
+
+
+static int check_pattern(Match_T pattern, const char *line) {
+#ifdef HAVE_REGEX_H
+        return regexec(pattern->regex_comp, line, 0, NULL, 0);
+#else
+        if (strstr(line, pattern->match_string) == NULL)
+                return -1;
+        else
+                return 0;
+#endif
+}
+
+
+/**
+ * Match content.
+ *
+ * The test compares only the lines terminated with \n.
+ *
+ * In the case that line with missing \n is read, the test stops, as we suppose that the file contains only partial line and the rest of it is yet stored in the buffer of the application which writes to the file.
+ * The test will resume at the beginning of the incomplete line during the next cycle, allowing the writer to finish the write.
+ *
+ * We test only MATCH_LINE_LENGTH at maximum (512 bytes) - in the case that the line is bigger, we read the rest of the line (till '\n') but ignore the characters past the maximum (512+).
+ */
+static void check_match(Service_T s) {
+        Match_T ml;
+        FILE *file;
+        char line[MATCH_LINE_LENGTH];
+        
+        ASSERT(s && s->matchlist);
+        
+        /* Open the file */
+        if (! (file = fopen(s->path, "r"))) {
+                LogError("'%s' cannot open file %s: %s\n", s->name, s->path, STRERROR);
+                return;
+        }
+        
+        /* FIXME: Refactor: Initialize the filesystems table ahead of file and filesystems test and index it by device id + replace the Str_startsWith() with lookup to the table by device id (obtained via file's stat()).
+                            The central filesystems initialization will allow to reduce the statfs() calls in the case that there will be multiple file and/or filesystems tests for the same fs. Temporarily we go with
+                            dummy Str_startsWith() as quick fix which will cover 99.9% of use cases without rising the statfs overhead if statfs call would be inlined here.
+         */ 
+        if (Str_startsWith(s->path, "/proc")) {
+                s->inf->priv.file.readpos = 0;
+        } else {
+                /* If inode changed or size shrinked -> set read position = 0 */
+                if (s->inf->priv.file.st_ino != s->inf->priv.file.st_ino_prev || s->inf->priv.file.readpos > s->inf->priv.file.st_size)
+                        s->inf->priv.file.readpos = 0;
+        
+                /* Do we need to match? Even if not, go to final, so we can reset the content match error flags in this cycle */
+                if (s->inf->priv.file.readpos == s->inf->priv.file.st_size)
+                        goto final;
+        }
+        
+        while (TRUE) {
+next:
+                /* Seek to the read position */
+                if (fseek(file, (long)s->inf->priv.file.readpos, SEEK_SET)) {
+                        LogError("'%s' cannot seek file %s: %s\n", s->name, s->path, STRERROR);
+                        goto final;
+                }
+                
+                if (! fgets(line, MATCH_LINE_LENGTH, file)) {
+                        if (! feof(file))
+                                LogError("'%s' cannot read file %s: %s\n", s->name, s->path, STRERROR);
+                        goto final;
+                }
+                
+                int length = strlen(line);
+                if (length == 0) {
+                        /* No content: shouldn't happen - empty line will contain at least '\n' */
+                        goto final;
+                } else if (line[length-1] != '\n') {
+                        if (length < MATCH_LINE_LENGTH-1) {
+                                /* Incomplete line: we gonna read it next time again, allowing the writer to complete the write */
+                                goto final;
+                        } else if (length == MATCH_LINE_LENGTH-1) {
+                                /* Our read buffer is full: ignore the content past the MATCH_LINE_LENGTH */
+                                int rv;
+                                do {
+                                        if ((rv = fgetc(file)) == EOF)
+                                                goto final;
+                                        length++;
+                                } while (rv != '\n');
+                        }
+                } else {
+                        /* Remove appending newline */
+                        line[length-1] = 0;
+                }
+                /* Set read position to the end of last read */
+                s->inf->priv.file.readpos += length;
+
+                /* Check ignores */
+                for (ml = s->matchignorelist; ml; ml = ml->next) {
+                        if ((check_pattern(ml, line) == 0)  ^ (ml->not)) {
+                                /* We match! -> line is ignored! */
+                                DEBUG("'%s' Ignore pattern %s'%s' match on content line\n", s->name, ml->not ? "not " : "", ml->match_string);
+                                goto next;
+                        }
+                }
+
+                /* Check non ignores */
+                for (ml = s->matchlist; ml; ml = ml->next) {
+                        if ((check_pattern(ml, line) == 0) ^ (ml->not)) {
+                                DEBUG("'%s' Pattern %s'%s' match on content line [%s]\n", s->name, ml->not ? "not " : "", ml->match_string, line);
+                                /* Save the line: we limit the content showed in the event roughly to MATCH_LINE_LENGTH (we allow exceed to not break the line) */
+                                if (! ml->log)
+                                        ml->log = StringBuffer_create(MATCH_LINE_LENGTH);
+                                if (StringBuffer_length(ml->log) < MATCH_LINE_LENGTH) {
+                                        StringBuffer_append(ml->log, "%s\n", line);
+                                        if (StringBuffer_length(ml->log) >= MATCH_LINE_LENGTH)
+                                                StringBuffer_append(ml->log, "...\n");
+                                }
+                        } else {
+                                DEBUG("'%s' Pattern %s'%s' doesn't match on content line [%s]\n", s->name, ml->not ? "not " : "", ml->match_string, line);
+                        }
+                }
+        }
+final:
+        if (fclose(file))
+                LogError("'%s' cannot close file %s: %s\n", s->name, s->path, STRERROR);
+
+        /* Post process the matches: generate events for particular patterns */
+        for (ml = s->matchlist; ml; ml = ml->next) {
+                if (ml->log) {
+                        Event_post(s, Event_Content, STATE_CHANGED, ml->action, "content match:\n%s", StringBuffer_toString(ml->log));
+                        StringBuffer_free(&ml->log);
+                } else {
+                        Event_post(s, Event_Content, STATE_CHANGEDNOT, ml->action, "content doesn't match");
+                }
+        }
+}
+
+
+/**
+ * Test filesystem flags for possible change since last cycle
+ */
+static void check_filesystem_flags(Service_T s) {
+        ASSERT(s && s->inf);
+        
+        /* filesystem flags were not initialized yet */
+        if (s->inf->priv.filesystem._flags == -1)
+                return;
+        
+        if (s->inf->priv.filesystem._flags != s->inf->priv.filesystem.flags)
+                Event_post(s, Event_Fsflag, STATE_CHANGED, s->action_FSFLAG, "filesytem flags changed to %#lx", s->inf->priv.filesystem.flags);
+}
+
+/**
+ * Filesystem test
+ */
+static void check_filesystem_resources(Service_T s, Filesystem_T td) {
+        ASSERT(s && td);
+        
+        if ( (td->limit_percent < 0) && (td->limit_absolute < 0) ) {
+                LogError("'%s' error: filesystem limit not set\n", s->name);
+                return;
+        }
+        
+        switch(td->resource) {
+                        
+                case RESOURCE_ID_INODE:
+                        if (s->inf->priv.filesystem.f_files <= 0) {
+                                DEBUG("'%s' filesystem doesn't support inodes\n", s->name);
+                                return;
+                        }
+                        
+                        if (td->limit_percent >= 0) {
+                                if (Util_evalQExpression( td->operator, s->inf->priv.filesystem.inode_percent, td->limit_percent)) {
+                                        Event_post(s, Event_Resource, STATE_FAILED, td->action, "inode usage %.1f%% matches resource limit [inode usage%s%.1f%%]", s->inf->priv.filesystem.inode_percent/10., operatorshortnames[td->operator], td->limit_percent/10.);
+                                        return;
+                                }
+                        } else {
+                                if (Util_evalQExpression(td->operator, s->inf->priv.filesystem.inode_total, td->limit_absolute)) {
+                                        Event_post(s, Event_Resource, STATE_FAILED, td->action, "inode usage %ld matches resource limit [inode usage%s%ld]", s->inf->priv.filesystem.inode_total, operatorshortnames[td->operator], td->limit_absolute);
+                                        return;
+                                }
+                        }
+                        DEBUG("'%s' inode usage check succeeded [current inode usage=%.1f%%]\n", s->name, s->inf->priv.filesystem.inode_percent/10.);
+                        Event_post(s, Event_Resource, STATE_SUCCEEDED, td->action, "filesystem resources succeeded");
+                        return;
+                        
+                case RESOURCE_ID_SPACE:
+                        if (td->limit_percent >= 0) {
+                                if (Util_evalQExpression( td->operator, s->inf->priv.filesystem.space_percent, td->limit_percent)) {
+                                        Event_post(s, Event_Resource, STATE_FAILED, td->action, "space usage %.1f%% matches resource limit [space usage%s%.1f%%]", s->inf->priv.filesystem.space_percent/10., operatorshortnames[td->operator], td->limit_percent/10.);
+                                        return;
+                                }
+                        } else {
+                                if (Util_evalQExpression(td->operator, s->inf->priv.filesystem.space_total, td->limit_absolute)) {
+                                        Event_post(s, Event_Resource, STATE_FAILED, td->action, "space usage %ld blocks matches resource limit [space usage%s%ld blocks]", s->inf->priv.filesystem.space_total, operatorshortnames[td->operator], td->limit_absolute);
+                                        return;
+                                }
+                        }
+                        DEBUG("'%s' space usage check succeeded [current space usage=%.1f%%]\n", s->name, s->inf->priv.filesystem.space_percent/10.);
+                        Event_post(s, Event_Resource, STATE_SUCCEEDED, td->action, "filesystem resources succeeded");
+                        return;
+                        
+                default:
+                        LogError("'%s' error -- unknown resource type: [%d]\n", s->name, td->resource);
+                        return;
+        }
+        
+}
+
+
+static void check_timeout(Service_T s) {
+        ActionRate_T ar;
+        int max = 0;
+        
+        ASSERT(s);
+        
+        if (! s->actionratelist)
+                return;
+        
+        /* Start counting cycles */
+        if (s->nstart > 0)
+                s->ncycle++;
+        
+        for (ar = s->actionratelist; ar; ar = ar->next) {
+                if (max < ar->cycle)
+                        max = ar->cycle;
+                if (s->nstart >= ar->count && s->ncycle <= ar->cycle)
+                        Event_post(s, Event_Timeout, STATE_FAILED, ar->action, "service restarted %d times within %d cycles(s) - %s", s->nstart, s->ncycle, actionnames[ar->action->failed->id]);
+        }
+        
+        /* Stop counting and reset if the cycle interval is succeeded */
+        if (s->ncycle > max) {
+                s->ncycle = 0;
+                s->nstart = 0;
+        }
+}
+
+
+/**
+ * Returns TRUE if validation should be skiped for
+ * this service in this cycle, otherwise FALSE. Handle
+ * every statement
+ */
+static int check_skip(Service_T s, time_t time) {
+        ASSERT(s);
+        if (s->visited) {
+                DEBUG("'%s' check skipped -- service already handled in a dependency chain\n", s->name);
+                return TRUE;
+        }
+        if (s->every.type == EVERY_SKIPCYCLES) {
+                s->every.spec.cycle.counter++;
+                if (s->every.spec.cycle.counter < s->every.spec.cycle.number) {
+                        s->monitor |= MONITOR_WAITING;
+                        DEBUG("'%s' test skipped as current cycle (%d) < every cycle (%d) \n", s->name, s->every.spec.cycle.counter, s->every.spec.cycle.number);
+                        return TRUE;
+                }
+                s->every.spec.cycle.counter = 0;
+        } else if (s->every.type == EVERY_CRON && ! Time_incron(s->every.spec.cron, time)) {
+                s->monitor |= MONITOR_WAITING;
+                DEBUG("'%s' test skipped as current time (%ld) does not match every's cron spec \"%s\"\n", s->name, (long)time, s->every.spec.cron);
+                return TRUE;
+        } else if (s->every.type == EVERY_NOTINCRON && Time_incron(s->every.spec.cron, time)) {
+                s->monitor |= MONITOR_WAITING;
+                DEBUG("'%s' test skipped as current time (%ld) matches every's cron spec \"not %s\"\n", s->name, (long)time, s->every.spec.cron);
+                return TRUE;
+        }
+        s->monitor &= ~MONITOR_WAITING;
+        return FALSE;
+}
+
+
+/**
+ * Returns TRUE if scheduled action was performed
+ */
+static int do_scheduled_action(Service_T s) {
+        int rv = FALSE;
+        if (s->doaction != ACTION_IGNORE) {
+                // FIXME: let the event engine do the action directly? (just replace s->action_ACTION with s->doaction and drop control_service call)
+                rv = control_service(s->name, s->doaction);
+                Event_post(s, Event_Action, STATE_CHANGED, s->action_ACTION, "%s action done", actionnames[s->doaction]);
+                s->doaction = ACTION_IGNORE;
+                FREE(s->token);
+        }
+        return rv;
+}
+
diff --git a/monit-5.4/src/xml.c b/monit-5.4/src/xml.c
new file mode 100644
index 0000000..1133c3d
--- /dev/null
+++ b/monit-5.4/src/xml.c
@@ -0,0 +1,413 @@
+/*
+ * Copyright (C) Tildeslash Ltd. All rights reserved.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License version 3.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU Affero General Public License in all respects
+ * for all of the code used other than OpenSSL.  
+ */
+
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif 
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#include "monit.h"
+#include "event.h"
+#include "process.h"
+
+
+/**
+ *  XML routines for status and event notification message handling.
+ *
+ *  @file
+ */
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Prints a document header into the given buffer.
+ * @param B StringBuffer object
+ * @param V Format version
+ * @param myip The client-side IP address
+ */
+static void document_head(StringBuffer_T B, int V, const char *myip) {
+        StringBuffer_append(B, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
+        if (V == 2)
+                StringBuffer_append(B, "<monit id=\"%s\" incarnation=\"%lld\" version=\"%s\"><server>", Run.id, (long long)Run.incarnation, VERSION);
+        else
+                StringBuffer_append(B,
+                        "<monit>"
+                        "<server>"
+                        "<id>%s</id>"
+                        "<incarnation>%lld</incarnation>"
+                        "<version>%s</version>",
+                        Run.id,
+                        (long long)Run.incarnation,
+                        VERSION);
+        StringBuffer_append(B,
+                "<uptime>%ld</uptime>"
+                "<poll>%d</poll>"
+                "<startdelay>%d</startdelay>"
+                "<localhostname>%s</localhostname>"
+                "<controlfile>%s</controlfile>",
+                (long)Util_getProcessUptime(Run.pidfile),
+                Run.polltime,
+                Run.startdelay,
+                Run.localhostname ? Run.localhostname : "",
+                Run.controlfile ? Run.controlfile : "");
+
+        if (Run.dohttpd) {
+                StringBuffer_append(B, "<httpd><address>%s</address><port>%d</port><ssl>%d</ssl></httpd>", Run.bind_addr ? Run.bind_addr : myip, Run.httpdport, Run.httpdssl);
+
+                if (Run.mmonitcredentials)
+                        StringBuffer_append(B, "<credentials><username>%s</username><password>%s</password></credentials>", Run.mmonitcredentials->uname, Run.mmonitcredentials->passwd);
+        }
+ 
+        StringBuffer_append(B,
+                "</server>"
+                "<platform>"
+                "<name>%s</name>"
+                "<release>%s</release>"
+                "<version>%s</version>"
+                "<machine>%s</machine>"
+                "<cpu>%d</cpu>"
+                "<memory>%lu</memory>"
+                "<swap>%lu</swap>"
+                "</platform>",
+                systeminfo.uname.sysname,
+                systeminfo.uname.release,
+                systeminfo.uname.version,
+                systeminfo.uname.machine,
+                systeminfo.cpus,
+                systeminfo.mem_kbyte_max,
+                systeminfo.swap_kbyte_max);
+}
+
+
+/**
+ * Prints a document footer into the given buffer.
+ * @param B StringBuffer object
+ */
+static void document_foot(StringBuffer_T B) {
+        StringBuffer_append(B, "</monit>");
+}
+
+
+/**
+ * Prints a service status into the given buffer.
+ * @param S Service object
+ * @param B StringBuffer object
+ * @param L Status information level
+ * @param V Format version
+ */
+static void status_service(Service_T S, StringBuffer_T B, short L, int V) {
+        Event_T E = S->eventlist;
+
+        if (V == 2)
+                StringBuffer_append(B, "<service name=\"%s\"><type>%d</type>", S->name ? S->name : "", S->type);
+        else
+                StringBuffer_append(B, "<service type=\"%d\"><name>%s</name>", S->type, S->name ? S->name : "");
+        StringBuffer_append(B,
+                "<collected_sec>%ld</collected_sec>"
+                "<collected_usec>%ld</collected_usec>"
+                "<status>%d</status>"
+                "<status_hint>%d</status_hint>"
+                "<monitor>%d</monitor>"
+                "<monitormode>%d</monitormode>"
+                "<pendingaction>%d</pendingaction>",
+                S->collected.tv_sec,
+                (long)S->collected.tv_usec,
+                S->error,
+                S->error_hint,
+                S->monitor,
+                S->mode,
+                S->doaction);
+        if (S->every.type != EVERY_CYCLE) {
+                StringBuffer_append(B, "<every><type>%d</type>", S->every.type);
+                if (S->every.type == 1)
+                        StringBuffer_append(B, "<counter>%d</counter><number>%d</number>", S->every.spec.cycle.counter, S->every.spec.cycle.number);
+                else
+                        StringBuffer_append(B, "<cron><![CDATA[%s]]></cron>", S->every.spec.cron);
+                StringBuffer_append(B, "</every>");
+        }
+
+        /* if the service is in error state, display first active error message to provide more details */
+        while (E) {
+                if ((E->state == STATE_FAILED || E->state == STATE_CHANGED) && (S->error & E->id) && E->message) {
+                        StringBuffer_append(B, "<status_message><![CDATA[%s]]></status_message>", E->message);
+                        break;
+                }
+                E = E->next;
+        }
+        if (L == LEVEL_FULL) {
+                if (Util_hasServiceStatus(S)) {
+                        if (S->type == TYPE_FILE || S->type == TYPE_DIRECTORY || S->type == TYPE_FIFO || S->type == TYPE_FILESYSTEM)
+                                StringBuffer_append(B, "<mode>%o</mode><uid>%d</uid><gid>%d</gid>", S->inf->st_mode & 07777, (int)S->inf->st_uid, (int)S->inf->st_gid);
+                        if (S->type == TYPE_FILE || S->type == TYPE_FIFO || S->type == TYPE_DIRECTORY)
+                                StringBuffer_append(B, "<timestamp>%ld</timestamp>", (long)S->inf->timestamp);
+                        if (S->type == TYPE_FILE) {
+                                StringBuffer_append(B, "<size>%llu</size>", (unsigned long long) S->inf->priv.file.st_size);
+                                if (S->checksum)
+                                        StringBuffer_append(B, "<checksum type=\"%s\">%s</checksum>", checksumnames[S->checksum->type], S->inf->priv.file.cs_sum);
+                        }
+                        if (S->type == TYPE_FILESYSTEM) {
+                                StringBuffer_append(B,
+                                        "<flags>%d</flags>"
+                                        "<block>"
+                                        "<percent>%.1f</percent>"
+                                        "<usage>%.1f</usage>"
+                                        "<total>%.1f</total>"
+                                        "</block>",
+                                        S->inf->priv.filesystem.flags,
+                                        S->inf->priv.filesystem.space_percent/10.,
+                                        S->inf->priv.filesystem.f_bsize > 0 ? (float)S->inf->priv.filesystem.space_total / (float)1048576 * (float)S->inf->priv.filesystem.f_bsize : 0,
+                                        S->inf->priv.filesystem.f_bsize > 0 ? (float)S->inf->priv.filesystem.f_blocks / (float)1048576 * (float)S->inf->priv.filesystem.f_bsize : 0);
+                                if (S->inf->priv.filesystem.f_files > 0) {
+                                        StringBuffer_append(B,
+                                  	        "<inode>"
+                                                "<percent>%.1f</percent>"
+                                                "<usage>%ld</usage>"
+                                                "<total>%ld</total>"
+                                        	"</inode>",
+                                        	S->inf->priv.filesystem.inode_percent/10.,
+                                        	S->inf->priv.filesystem.inode_total,
+                                                S->inf->priv.filesystem.f_files);
+                                }
+                        }
+                        if (S->type == TYPE_PROCESS) {
+                                StringBuffer_append(B,
+                                        "<pid>%d</pid>"
+                                        "<ppid>%d</ppid>"
+                                        "<uptime>%ld</uptime>",
+                                        S->inf->priv.process.pid,
+                                        S->inf->priv.process.ppid,
+                                        (long)S->inf->priv.process.uptime);
+                                if (Run.doprocess) {
+                                        StringBuffer_append(B,
+                                                "<children>%d</children>"
+                                                "<memory>"
+                                                "<percent>%.1f</percent>"
+                                                "<percenttotal>%.1f</percenttotal>"
+                                                "<kilobyte>%ld</kilobyte>"
+                                                "<kilobytetotal>%ld</kilobytetotal>"
+                                                "</memory>"
+                                                "<cpu>"
+                                                "<percent>%.1f</percent>"
+                                                "<percenttotal>%.1f</percenttotal>"
+                                                "</cpu>",
+                                                S->inf->priv.process.children,
+                                                S->inf->priv.process.mem_percent/10.0,
+                                                S->inf->priv.process.total_mem_percent/10.0,
+                                                S->inf->priv.process.mem_kbyte,
+                                                S->inf->priv.process.total_mem_kbyte,
+                                                S->inf->priv.process.cpu_percent/10.0,
+                                                S->inf->priv.process.total_cpu_percent/10.0);
+                                }
+                        }
+                        if (S->type == TYPE_HOST && S->icmplist) {
+                                for (Icmp_T i = S->icmplist; i; i = i->next) {
+                                        StringBuffer_append(B,
+                                                "<icmp>"
+                                                "<type>%s</type>"
+                                                "<responsetime>%.3f</responsetime>"
+                                                "</icmp>",
+                                                icmpnames[i->type],
+                                                i->is_available ? i->response : -1.);
+                                }
+                        }
+                        if ((S->type == TYPE_HOST || S->type == TYPE_PROCESS) && S-> portlist) {
+                                Port_T p;
+                                for (p = S->portlist; p; p = p->next) {
+                                        if (p->family == AF_INET)
+                                                StringBuffer_append(B,
+                                                  	"<port>"
+                                                  	"<hostname>%s</hostname>"
+                                                  	"<portnumber>%d</portnumber>"
+                                                  	"<request>%s</request>"
+                                                  	"<protocol>%s</protocol>"
+                                                  	"<type>%s</type>"
+                                                  	"<responsetime>%.3f</responsetime>"
+                                                  	"</port>",
+                                                  	p->hostname?p->hostname:"",
+                                                  	p->port,
+                                                  	p->request?p->request:"",
+                                                  	p->protocol->name?p->protocol->name:"",
+                                                  	Util_portTypeDescription(p),
+                                                  	p->is_available?p->response:-1.);
+                                        else if (p->family == AF_UNIX)
+                                                StringBuffer_append(B,
+                                                  	"<unix>"
+                                                	"<path>%s</path>"
+                                                	"<protocol>%s</protocol>"
+                                                	"<responsetime>%.3f</responsetime>"
+                                                	"</unix>",
+                                                	p->pathname?p->pathname:"",
+                                                	p->protocol->name?p->protocol->name:"",
+                                                	p->is_available?p->response:-1.);
+                                }
+                        }
+                        if (S->type == TYPE_SYSTEM && Run.doprocess) {
+                                StringBuffer_append(B,
+                                        "<system>"
+                                        "<load>"
+                                        "<avg01>%.2f</avg01>"
+                                        "<avg05>%.2f</avg05>"
+                                        "<avg15>%.2f</avg15>"
+                                        "</load>"
+                                        "<cpu>"
+                                        "<user>%.1f</user>"
+                                        "<system>%.1f</system>"
+#ifdef HAVE_CPU_WAIT
+                                        "<wait>%.1f</wait>"
+#endif
+                                        "</cpu>"
+                                        "<memory>"
+                                        "<percent>%.1f</percent>"
+                                        "<kilobyte>%ld</kilobyte>"
+                                        "</memory>"
+                                        "<swap>"
+                                        "<percent>%.1f</percent>"
+                                        "<kilobyte>%ld</kilobyte>"
+                                        "</swap>"
+                                        "</system>",
+                                        systeminfo.loadavg[0],
+                                        systeminfo.loadavg[1],
+                                        systeminfo.loadavg[2],
+                                        systeminfo.total_cpu_user_percent > 0 ? systeminfo.total_cpu_user_percent/10. : 0,
+                                        systeminfo.total_cpu_syst_percent > 0 ? systeminfo.total_cpu_syst_percent/10. : 0,
+#ifdef HAVE_CPU_WAIT
+                                        systeminfo.total_cpu_wait_percent > 0 ? systeminfo.total_cpu_wait_percent/10. : 0,
+#endif
+                                        systeminfo.total_mem_percent/10.,
+                                        systeminfo.total_mem_kbyte,
+                                        systeminfo.total_swap_percent/10.,
+                                        systeminfo.total_swap_kbyte);
+                        }
+                        if (S->type == TYPE_PROGRAM && S->program->started) {
+                                StringBuffer_append(B,
+                                        "<program>"
+                                        "<started>%lu</started>"
+                                        "<status>%d</status>"
+                                        "</program>",
+                                        (unsigned long)S->program->started,
+                                        S->program->exitStatus);
+                        }
+                }
+        }
+        StringBuffer_append(B, "</service>");
+}
+
+
+/**
+ * Prints a servicegroups into the given buffer.
+ * @param SG ServiceGroup object
+ * @param B StringBuffer object
+ * @param L Status information level
+ */
+static void status_servicegroup(ServiceGroup_T SG, StringBuffer_T B, short L) {
+        StringBuffer_append(B, "<servicegroup name=\"%s\">", SG->name);
+        for (ServiceGroupMember_T SGM = SG->members; SGM; SGM = SGM->next)
+                StringBuffer_append(B, "<service>%s</service>", SGM->name);
+        StringBuffer_append(B, "</servicegroup>");
+}
+
+
+/**
+ * Prints a event description into the given buffer.
+ * @param E Event object
+ * @param B StringBuffer object
+ */
+static void status_event(Event_T E, StringBuffer_T B) {
+        struct timeval *tv = Event_get_collected(E);
+        StringBuffer_append(B,
+                "<event>"
+                "<collected_sec>%ld</collected_sec>"
+                "<collected_usec>%ld</collected_usec>"
+                "<service>%s</service>"
+                "<type>%d</type>"
+                "<id>%ld</id>"
+                "<state>%d</state>"
+                "<action>%d</action>"
+                "<message><![CDATA[%s]]></message>",
+                tv->tv_sec,
+                (long)tv->tv_usec,
+                Event_get_id(E) == Event_Instance ? "Monit" : Event_get_source_name(E),
+                Event_get_source_type(E),
+                Event_get_id(E),
+                Event_get_state(E),
+                Event_get_action(E),
+                Event_get_message(E));
+        Service_T s = Event_get_source(E);
+        if (s && s->token)
+                StringBuffer_append(B, "<token>%s</token>", s->token);
+        StringBuffer_append(B, "</event>");
+}
+
+
+/* ------------------------------------------------------------------ Public */
+
+
+/**
+ * Get a XML formated message for event notification or general status
+ * of monitored services and resources.
+ * @param E An event object or NULL for general status
+ * @param L Status information level
+ * @param V Format version
+ * @param myip The client-side IP address
+ */
+void status_xml(StringBuffer_T B, Event_T E, short L, int V, const char *myip) {
+        Service_T S;
+        ServiceGroup_T SG;
+
+        document_head(B, V, myip);
+        if (V == 2)
+                StringBuffer_append(B, "<services>");
+        for (S = servicelist_conf; S; S = S->next_conf)
+                status_service(S, B, L, V);
+        if (V == 2) {
+                StringBuffer_append(B, "</services><servicegroups>");
+                for (SG = servicegrouplist; SG; SG = SG->next)
+                        status_servicegroup(SG, B, L);
+                StringBuffer_append(B, "</servicegroups>");
+        }
+        if (E)
+                status_event(E, B);
+        document_foot(B);
+}
+
diff --git a/monit-5.4/src/y.tab.c b/monit-5.4/src/y.tab.c
new file mode 100644
index 0000000..c32cfd9
--- /dev/null
+++ b/monit-5.4/src/y.tab.c
@@ -0,0 +1,7613 @@
+#include <config.h>
+
+/* A Bison parser, made by GNU Bison 2.4.1.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program 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 General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.4.1"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+
+
+/* Copy the first part of user declarations.  */
+
+/* Line 189 of yacc.c  */
+#line 26 "src/p.y"
+
+  
+/*
+ * DESCRIPTION
+ *   Simple context-free grammar for parsing the control file. 
+ *
+ */
+
+#include "config.h"
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif 
+
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif 
+
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif 
+
+#ifdef HAVE_GRP_H
+#include <grp.h>
+#endif 
+  
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+  
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+  
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+  
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#ifdef HAVE_ASM_PARAM_H
+#include <asm/param.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifndef HAVE_SOL_IP
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#endif
+
+#ifdef HAVE_NETINET_IP_ICMP_H
+#include <netinet/ip_icmp.h>
+#endif
+
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+  
+#include "net.h"
+#include "monit.h"
+#include "protocol.h"
+#include "engine.h"
+#include "alert.h"
+#include "process.h"
+#include "ssl.h"
+#include "device.h"
+
+// libmonit
+#include "io/File.h"
+
+
+/* ------------------------------------------------------------- Definitions */
+
+  struct IHavePrecedence {
+    int daemon;
+    int logfile;
+    int pidfile;
+  }; 
+
+  struct myrate {
+    unsigned count;
+    unsigned cycles;
+  }; 
+
+  /* yacc interface */
+  void  yyerror(const char *,...);
+  void  yyerror2(const char *,...);
+  void  yywarning(const char *,...);
+  void  yywarning2(const char *,...);
+
+  /* lexer interface */
+  int yylex(void);
+  extern FILE *yyin;
+  extern int lineno;
+  extern int arglineno;
+  extern char *yytext;
+  extern char *argyytext;
+  extern char *currentfile;
+  extern char *argcurrentfile;
+  extern int buffer_stack_ptr;
+
+  /* Local variables */
+  static int cfg_errflag = FALSE;
+  static Service_T tail = NULL;
+  static Service_T current = NULL;
+  static Request_T urlrequest = NULL;
+  static command_t command = NULL;
+  static command_t command1 = NULL;
+  static command_t command2 = NULL;
+  static Service_T depend_list = NULL;
+  static struct mygid gidset;
+  static struct myuid uidset;
+  static struct myprogram programset;
+  static struct myperm permset;
+  static struct mysize sizeset;
+  static struct myuptime uptimeset;
+  static struct mymatch matchset;
+  static struct myicmp icmpset;
+  static struct mymail mailset;
+  static struct myport portset;
+  static struct mymailserver mailserverset;
+  static struct myfilesystem filesystemset;
+  static struct myresource resourceset;
+  static struct mychecksum checksumset;
+  static struct mytimestamp timestampset;
+  static struct myactionrate actionrateset;
+  static struct IHavePrecedence ihp = {FALSE, FALSE, FALSE};
+  static struct myrate rate1 = {1, 1};
+  static struct myrate rate2 = {1, 1};
+  static char * htpasswd_file = NULL;
+  static int    digesttype = DIGEST_CLEARTEXT;
+  static int    hassystem = FALSE;
+
+#define BITMAP_MAX (sizeof(long long) * 8)
+
+  
+/* -------------------------------------------------------------- Prototypes */
+
+  static void  preparse();
+  static void  postparse();
+  static void  addservice(Service_T);
+  static void  addmail(char *, Mail_T, Mail_T *);
+  static void  createservice(int, char *, char *, int (*)(Service_T));
+  static void  adddependant(char *);
+  static void  addservicegroup(char *);
+  static void  addport(Port_T);
+  static void  addresource(Resource_T);
+  static void  addtimestamp(Timestamp_T, int);
+  static void  addactionrate(ActionRate_T);
+  static void  addsize(Size_T);
+  static void  adduptime(Uptime_T);
+  static void  addfilesystem(Filesystem_T);
+  static void  addicmp(Icmp_T);
+  static void  addgeneric(Port_T, char*, char*);
+  static void  addcommand(int, unsigned);
+  static void  addargument(char *);
+  static void  addmmonit(URL_T, int, int, char *);
+  static void  addmailserver(MailServer_T);
+  static int   addcredentials(char *, char *, int, int);
+#ifdef HAVE_LIBPAM
+  static void  addpamauth(char *, int);
+#endif
+  static void  addhtpasswdentry(char *, char *, int);
+  static uid_t get_uid(char *, uid_t);
+  static gid_t get_gid(char *, gid_t);
+  static void  addchecksum(Checksum_T);
+  static void  addperm(Perm_T);
+  static void  addmatch(Match_T, int, int);
+  static void  addmatchpath(Match_T, int);
+  static void  addprogram(Program_T);
+  static void  adduid(Uid_T);
+  static void  addgid(Gid_T);
+  static void  addeuid(uid_t);
+  static void  addegid(gid_t);
+  static void  addeventaction(EventAction_T *, int, int);
+  static void  seteventaction(EventAction_T *, int, int);
+  static void  prepare_urlrequest(URL_T U);
+  static void  seturlrequest(int, char *);
+  static void  setlogfile(char *);
+  static void  setpidfile(char *);
+  static void  reset_mailset();
+  static void  reset_mailserverset();
+  static void  reset_portset();
+  static void  reset_resourceset();
+  static void  reset_timestampset();
+  static void  reset_actionrateset();
+  static void  reset_sizeset();
+  static void  reset_uptimeset();
+  static void  reset_checksumset();
+  static void  reset_permset();
+  static void  reset_uidset();
+  static void  reset_programset();
+  static void  reset_gidset();
+  static void  reset_filesystemset();
+  static void  reset_icmpset();
+  static void  reset_rateset();
+  static void  check_name(char *);
+  static int   check_perm(int);
+  static void  check_hostname (char *);
+  static void  check_exec(char *);
+  static int   cleanup_hash_string(char *);
+  static void  check_depend();
+  static void  setsyslog(char *);
+  static command_t copycommand(command_t);
+  static int verifyMaxForward(int);  
+
+
+
+/* Line 189 of yacc.c  */
+#line 308 "src/y.tab.c"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 1
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     IF = 258,
+     ELSE = 259,
+     THEN = 260,
+     OR = 261,
+     FAILED = 262,
+     SET = 263,
+     LOGFILE = 264,
+     FACILITY = 265,
+     DAEMON = 266,
+     SYSLOG = 267,
+     MAILSERVER = 268,
+     HTTPD = 269,
+     ALLOW = 270,
+     ADDRESS = 271,
+     INIT = 272,
+     READONLY = 273,
+     CLEARTEXT = 274,
+     MD5HASH = 275,
+     SHA1HASH = 276,
+     CRYPT = 277,
+     DELAY = 278,
+     PEMFILE = 279,
+     ENABLE = 280,
+     DISABLE = 281,
+     HTTPDSSL = 282,
+     CLIENTPEMFILE = 283,
+     ALLOWSELFCERTIFICATION = 284,
+     IDFILE = 285,
+     STATEFILE = 286,
+     SEND = 287,
+     EXPECT = 288,
+     EXPECTBUFFER = 289,
+     CYCLE = 290,
+     COUNT = 291,
+     REMINDER = 292,
+     PIDFILE = 293,
+     START = 294,
+     STOP = 295,
+     PATHTOK = 296,
+     HOST = 297,
+     HOSTNAME = 298,
+     PORT = 299,
+     TYPE = 300,
+     UDP = 301,
+     TCP = 302,
+     TCPSSL = 303,
+     PROTOCOL = 304,
+     CONNECTION = 305,
+     ALERT = 306,
+     NOALERT = 307,
+     MAILFORMAT = 308,
+     UNIXSOCKET = 309,
+     SIGNATURE = 310,
+     TIMEOUT = 311,
+     RETRY = 312,
+     RESTART = 313,
+     CHECKSUM = 314,
+     EVERY = 315,
+     NOTEVERY = 316,
+     DEFAULT = 317,
+     HTTP = 318,
+     APACHESTATUS = 319,
+     FTP = 320,
+     SMTP = 321,
+     POP = 322,
+     IMAP = 323,
+     CLAMAV = 324,
+     NNTP = 325,
+     NTP3 = 326,
+     MYSQL = 327,
+     DNS = 328,
+     SSH = 329,
+     DWP = 330,
+     LDAP2 = 331,
+     LDAP3 = 332,
+     RDATE = 333,
+     RSYNC = 334,
+     TNS = 335,
+     PGSQL = 336,
+     POSTFIXPOLICY = 337,
+     SIP = 338,
+     LMTP = 339,
+     GPS = 340,
+     RADIUS = 341,
+     MEMCACHE = 342,
+     STRING = 343,
+     PATH = 344,
+     MAILADDR = 345,
+     MAILFROM = 346,
+     MAILREPLYTO = 347,
+     MAILSUBJECT = 348,
+     MAILBODY = 349,
+     SERVICENAME = 350,
+     STRINGNAME = 351,
+     NUMBER = 352,
+     PERCENT = 353,
+     LOGLIMIT = 354,
+     CLOSELIMIT = 355,
+     DNSLIMIT = 356,
+     KEEPALIVELIMIT = 357,
+     REPLYLIMIT = 358,
+     REQUESTLIMIT = 359,
+     STARTLIMIT = 360,
+     WAITLIMIT = 361,
+     GRACEFULLIMIT = 362,
+     CLEANUPLIMIT = 363,
+     REAL = 364,
+     CHECKPROC = 365,
+     CHECKFILESYS = 366,
+     CHECKFILE = 367,
+     CHECKDIR = 368,
+     CHECKHOST = 369,
+     CHECKSYSTEM = 370,
+     CHECKFIFO = 371,
+     CHECKPROGRAM = 372,
+     CHILDREN = 373,
+     SYSTEM = 374,
+     STATUS = 375,
+     RESOURCE = 376,
+     MEMORY = 377,
+     TOTALMEMORY = 378,
+     LOADAVG1 = 379,
+     LOADAVG5 = 380,
+     LOADAVG15 = 381,
+     SWAP = 382,
+     MODE = 383,
+     ACTIVE = 384,
+     PASSIVE = 385,
+     MANUAL = 386,
+     CPU = 387,
+     TOTALCPU = 388,
+     CPUUSER = 389,
+     CPUSYSTEM = 390,
+     CPUWAIT = 391,
+     GROUP = 392,
+     REQUEST = 393,
+     DEPENDS = 394,
+     BASEDIR = 395,
+     SLOT = 396,
+     EVENTQUEUE = 397,
+     SECRET = 398,
+     HOSTHEADER = 399,
+     UID = 400,
+     GID = 401,
+     MMONIT = 402,
+     INSTANCE = 403,
+     USERNAME = 404,
+     PASSWORD = 405,
+     TIMESTAMP = 406,
+     CHANGED = 407,
+     SECOND = 408,
+     MINUTE = 409,
+     HOUR = 410,
+     DAY = 411,
+     SSLAUTO = 412,
+     SSLV2 = 413,
+     SSLV3 = 414,
+     TLSV1 = 415,
+     CERTMD5 = 416,
+     BYTE = 417,
+     KILOBYTE = 418,
+     MEGABYTE = 419,
+     GIGABYTE = 420,
+     INODE = 421,
+     SPACE = 422,
+     PERMISSION = 423,
+     SIZE = 424,
+     MATCH = 425,
+     NOT = 426,
+     IGNORE = 427,
+     ACTION = 428,
+     UPTIME = 429,
+     EXEC = 430,
+     UNMONITOR = 431,
+     ICMP = 432,
+     ICMPECHO = 433,
+     NONEXIST = 434,
+     EXIST = 435,
+     INVALID = 436,
+     DATA = 437,
+     RECOVERED = 438,
+     PASSED = 439,
+     SUCCEEDED = 440,
+     URL = 441,
+     CONTENT = 442,
+     PID = 443,
+     PPID = 444,
+     FSFLAG = 445,
+     REGISTER = 446,
+     CREDENTIALS = 447,
+     URLOBJECT = 448,
+     TARGET = 449,
+     TIMESPEC = 450,
+     MAXFORWARD = 451,
+     FIPS = 452,
+     NOTEQUAL = 453,
+     EQUAL = 454,
+     LESS = 455,
+     GREATER = 456
+   };
+#endif
+/* Tokens.  */
+#define IF 258
+#define ELSE 259
+#define THEN 260
+#define OR 261
+#define FAILED 262
+#define SET 263
+#define LOGFILE 264
+#define FACILITY 265
+#define DAEMON 266
+#define SYSLOG 267
+#define MAILSERVER 268
+#define HTTPD 269
+#define ALLOW 270
+#define ADDRESS 271
+#define INIT 272
+#define READONLY 273
+#define CLEARTEXT 274
+#define MD5HASH 275
+#define SHA1HASH 276
+#define CRYPT 277
+#define DELAY 278
+#define PEMFILE 279
+#define ENABLE 280
+#define DISABLE 281
+#define HTTPDSSL 282
+#define CLIENTPEMFILE 283
+#define ALLOWSELFCERTIFICATION 284
+#define IDFILE 285
+#define STATEFILE 286
+#define SEND 287
+#define EXPECT 288
+#define EXPECTBUFFER 289
+#define CYCLE 290
+#define COUNT 291
+#define REMINDER 292
+#define PIDFILE 293
+#define START 294
+#define STOP 295
+#define PATHTOK 296
+#define HOST 297
+#define HOSTNAME 298
+#define PORT 299
+#define TYPE 300
+#define UDP 301
+#define TCP 302
+#define TCPSSL 303
+#define PROTOCOL 304
+#define CONNECTION 305
+#define ALERT 306
+#define NOALERT 307
+#define MAILFORMAT 308
+#define UNIXSOCKET 309
+#define SIGNATURE 310
+#define TIMEOUT 311
+#define RETRY 312
+#define RESTART 313
+#define CHECKSUM 314
+#define EVERY 315
+#define NOTEVERY 316
+#define DEFAULT 317
+#define HTTP 318
+#define APACHESTATUS 319
+#define FTP 320
+#define SMTP 321
+#define POP 322
+#define IMAP 323
+#define CLAMAV 324
+#define NNTP 325
+#define NTP3 326
+#define MYSQL 327
+#define DNS 328
+#define SSH 329
+#define DWP 330
+#define LDAP2 331
+#define LDAP3 332
+#define RDATE 333
+#define RSYNC 334
+#define TNS 335
+#define PGSQL 336
+#define POSTFIXPOLICY 337
+#define SIP 338
+#define LMTP 339
+#define GPS 340
+#define RADIUS 341
+#define MEMCACHE 342
+#define STRING 343
+#define PATH 344
+#define MAILADDR 345
+#define MAILFROM 346
+#define MAILREPLYTO 347
+#define MAILSUBJECT 348
+#define MAILBODY 349
+#define SERVICENAME 350
+#define STRINGNAME 351
+#define NUMBER 352
+#define PERCENT 353
+#define LOGLIMIT 354
+#define CLOSELIMIT 355
+#define DNSLIMIT 356
+#define KEEPALIVELIMIT 357
+#define REPLYLIMIT 358
+#define REQUESTLIMIT 359
+#define STARTLIMIT 360
+#define WAITLIMIT 361
+#define GRACEFULLIMIT 362
+#define CLEANUPLIMIT 363
+#define REAL 364
+#define CHECKPROC 365
+#define CHECKFILESYS 366
+#define CHECKFILE 367
+#define CHECKDIR 368
+#define CHECKHOST 369
+#define CHECKSYSTEM 370
+#define CHECKFIFO 371
+#define CHECKPROGRAM 372
+#define CHILDREN 373
+#define SYSTEM 374
+#define STATUS 375
+#define RESOURCE 376
+#define MEMORY 377
+#define TOTALMEMORY 378
+#define LOADAVG1 379
+#define LOADAVG5 380
+#define LOADAVG15 381
+#define SWAP 382
+#define MODE 383
+#define ACTIVE 384
+#define PASSIVE 385
+#define MANUAL 386
+#define CPU 387
+#define TOTALCPU 388
+#define CPUUSER 389
+#define CPUSYSTEM 390
+#define CPUWAIT 391
+#define GROUP 392
+#define REQUEST 393
+#define DEPENDS 394
+#define BASEDIR 395
+#define SLOT 396
+#define EVENTQUEUE 397
+#define SECRET 398
+#define HOSTHEADER 399
+#define UID 400
+#define GID 401
+#define MMONIT 402
+#define INSTANCE 403
+#define USERNAME 404
+#define PASSWORD 405
+#define TIMESTAMP 406
+#define CHANGED 407
+#define SECOND 408
+#define MINUTE 409
+#define HOUR 410
+#define DAY 411
+#define SSLAUTO 412
+#define SSLV2 413
+#define SSLV3 414
+#define TLSV1 415
+#define CERTMD5 416
+#define BYTE 417
+#define KILOBYTE 418
+#define MEGABYTE 419
+#define GIGABYTE 420
+#define INODE 421
+#define SPACE 422
+#define PERMISSION 423
+#define SIZE 424
+#define MATCH 425
+#define NOT 426
+#define IGNORE 427
+#define ACTION 428
+#define UPTIME 429
+#define EXEC 430
+#define UNMONITOR 431
+#define ICMP 432
+#define ICMPECHO 433
+#define NONEXIST 434
+#define EXIST 435
+#define INVALID 436
+#define DATA 437
+#define RECOVERED 438
+#define PASSED 439
+#define SUCCEEDED 440
+#define URL 441
+#define CONTENT 442
+#define PID 443
+#define PPID 444
+#define FSFLAG 445
+#define REGISTER 446
+#define CREDENTIALS 447
+#define URLOBJECT 448
+#define TARGET 449
+#define TIMESPEC 450
+#define MAXFORWARD 451
+#define FIPS 452
+#define NOTEQUAL 453
+#define EQUAL 454
+#define LESS 455
+#define GREATER 456
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 214 of yacc.c  */
+#line 260 "src/p.y"
+
+  URL_T url;
+  float real;
+  int   number;
+  char *string;
+
+
+
+/* Line 214 of yacc.c  */
+#line 755 "src/y.tab.c"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 264 of yacc.c  */
+#line 767 "src/y.tab.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  58
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   989
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  206
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  164
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  509
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  893
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   456
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   204,     2,
+       2,     2,     2,     2,   205,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   202,     2,   203,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,   192,   193,   194,
+     195,   196,   197,   198,   199,   200,   201
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint16 yyprhs[] =
+{
+       0,     0,     3,     4,     6,     8,    11,    13,    15,    17,
+      19,    21,    23,    25,    27,    29,    31,    33,    35,    37,
+      39,    42,    45,    48,    51,    54,    57,    60,    63,    64,
+      67,    69,    71,    73,    75,    77,    79,    81,    83,    85,
+      87,    89,    91,    93,    95,    97,    99,   100,   103,   105,
+     107,   109,   111,   113,   115,   117,   119,   121,   123,   125,
+     127,   129,   131,   133,   135,   137,   138,   141,   143,   145,
+     147,   149,   151,   153,   155,   157,   159,   161,   163,   165,
+     167,   169,   171,   173,   174,   177,   179,   181,   183,   185,
+     187,   189,   191,   193,   195,   197,   199,   201,   203,   205,
+     207,   210,   212,   214,   216,   218,   220,   222,   224,   226,
+     228,   230,   232,   234,   235,   238,   240,   242,   244,   246,
+     248,   250,   252,   254,   256,   257,   260,   262,   264,   266,
+     268,   270,   272,   274,   276,   278,   280,   282,   284,   286,
+     288,   289,   292,   294,   296,   298,   300,   302,   304,   306,
+     308,   310,   312,   317,   325,   334,   339,   340,   344,   349,
+     352,   355,   359,   363,   369,   374,   381,   386,   390,   394,
+     398,   402,   405,   409,   414,   415,   418,   424,   430,   436,
+     438,   441,   447,   455,   456,   459,   461,   463,   465,   467,
+     469,   472,   473,   476,   478,   480,   482,   484,   487,   490,
+     493,   496,   500,   504,   507,   509,   511,   514,   517,   520,
+     523,   526,   529,   532,   534,   540,   545,   548,   552,   556,
+     560,   561,   566,   567,   573,   574,   580,   581,   587,   590,
+     592,   595,   597,   598,   600,   605,   610,   615,   620,   625,
+     630,   635,   640,   643,   648,   653,   657,   662,   666,   671,
+     675,   680,   682,   685,   687,   690,   692,   694,   697,   700,
+     703,   706,   707,   710,   713,   714,   717,   718,   721,   734,
+     746,   758,   769,   770,   773,   776,   779,   780,   783,   788,
+     791,   792,   795,   796,   798,   800,   802,   804,   805,   809,
+     812,   815,   818,   821,   825,   828,   831,   834,   837,   840,
+     845,   848,   851,   854,   857,   860,   863,   866,   869,   872,
+     875,   878,   881,   885,   888,   890,   892,   895,   898,   901,
+     902,   905,   908,   909,   912,   913,   917,   923,   924,   927,
+     930,   932,   936,   941,   946,   951,   956,   961,   966,   971,
+     976,   981,   986,   994,  1001,  1008,  1018,  1019,  1022,  1023,
+    1027,  1028,  1032,  1033,  1037,  1038,  1041,  1049,  1057,  1058,
+    1062,  1064,  1066,  1070,  1077,  1085,  1087,  1090,  1093,  1095,
+    1098,  1100,  1102,  1104,  1106,  1108,  1110,  1112,  1114,  1116,
+    1118,  1120,  1122,  1124,  1126,  1128,  1130,  1132,  1134,  1136,
+    1138,  1140,  1142,  1143,  1148,  1150,  1153,  1155,  1157,  1159,
+    1161,  1165,  1168,  1171,  1174,  1177,  1180,  1183,  1186,  1188,
+    1191,  1193,  1203,  1210,  1212,  1215,  1217,  1219,  1221,  1223,
+    1230,  1232,  1235,  1237,  1239,  1241,  1243,  1248,  1253,  1258,
+    1260,  1262,  1264,  1269,  1274,  1279,  1284,  1289,  1294,  1298,
+    1302,  1304,  1306,  1308,  1310,  1312,  1322,  1329,  1330,  1332,
+    1334,  1336,  1338,  1340,  1341,  1343,  1345,  1347,  1349,  1351,
+    1354,  1358,  1360,  1362,  1364,  1366,  1368,  1370,  1371,  1374,
+    1378,  1379,  1382,  1386,  1387,  1394,  1401,  1408,  1417,  1428,
+    1436,  1437,  1439,  1441,  1450,  1460,  1470,  1480,  1487,  1488,
+    1490,  1492,  1494,  1496,  1505,  1513,  1521,  1526,  1531,  1532,
+    1534,  1544,  1551,  1560,  1569,  1578,  1587,  1590,  1591,  1594
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
+{
+     207,     0,    -1,    -1,   208,    -1,   209,    -1,   208,   209,
+      -1,   226,    -1,   227,    -1,   232,    -1,   233,    -1,   237,
+      -1,   241,    -1,   242,    -1,   243,    -1,   236,    -1,   234,
+      -1,   235,    -1,   229,    -1,   230,    -1,   231,    -1,   268,
+     210,    -1,   269,   212,    -1,   270,   214,    -1,   271,   216,
+      -1,   272,   218,    -1,   273,   220,    -1,   274,   222,    -1,
+     275,   224,    -1,    -1,   210,   211,    -1,   276,    -1,   277,
+      -1,   278,    -1,   305,    -1,   306,    -1,   307,    -1,   308,
+      -1,   286,    -1,   287,    -1,   314,    -1,   317,    -1,   325,
+      -1,   326,    -1,   327,    -1,   328,    -1,   332,    -1,    -1,
+     212,   213,    -1,   276,    -1,   277,    -1,   278,    -1,   305,
+      -1,   347,    -1,   314,    -1,   325,    -1,   317,    -1,   362,
+      -1,   366,    -1,   367,    -1,   356,    -1,   365,    -1,   363,
+      -1,   326,    -1,   327,    -1,   328,    -1,    -1,   214,   215,
+      -1,   276,    -1,   277,    -1,   278,    -1,   305,    -1,   314,
+      -1,   325,    -1,   317,    -1,   362,    -1,   366,    -1,   367,
+      -1,   326,    -1,   327,    -1,   328,    -1,   358,    -1,   359,
+      -1,   360,    -1,    -1,   216,   217,    -1,   276,    -1,   277,
+      -1,   278,    -1,   305,    -1,   347,    -1,   314,    -1,   325,
+      -1,   317,    -1,   362,    -1,   366,    -1,   367,    -1,   326,
+      -1,   327,    -1,   328,    -1,   219,    -1,   218,   219,    -1,
+     276,    -1,   277,    -1,   278,    -1,   305,    -1,   286,    -1,
+     288,    -1,   314,    -1,   317,    -1,   325,    -1,   326,    -1,
+     327,    -1,   328,    -1,    -1,   220,   221,    -1,   276,    -1,
+     277,    -1,   278,    -1,   314,    -1,   317,    -1,   325,    -1,
+     327,    -1,   328,    -1,   335,    -1,    -1,   222,   223,    -1,
+     276,    -1,   277,    -1,   278,    -1,   305,    -1,   347,    -1,
+     314,    -1,   325,    -1,   317,    -1,   362,    -1,   366,    -1,
+     367,    -1,   326,    -1,   327,    -1,   328,    -1,    -1,   224,
+     225,    -1,   276,    -1,   277,    -1,   278,    -1,   314,    -1,
+     305,    -1,   317,    -1,   325,    -1,   327,    -1,   328,    -1,
+     331,    -1,     8,   318,   322,   369,    -1,     8,   318,   202,
+     320,   203,   322,   369,    -1,     8,   318,   171,   202,   320,
+     203,   322,   369,    -1,     8,    11,    97,   228,    -1,    -1,
+      39,    23,    97,    -1,     8,    34,    97,   361,    -1,     8,
+      17,    -1,     8,   197,    -1,     8,     9,    89,    -1,     8,
+       9,    12,    -1,     8,     9,    12,    10,    88,    -1,     8,
+     142,   140,    89,    -1,     8,   142,   140,    89,   141,    97,
+      -1,     8,   142,   141,    97,    -1,     8,    30,    89,    -1,
+       8,    31,    89,    -1,     8,    38,    89,    -1,     8,   147,
+     238,    -1,   239,   240,    -1,   238,   239,   240,    -1,   193,
+     312,   294,   293,    -1,    -1,   191,   192,    -1,     8,    13,
+     244,   312,   285,    -1,     8,    53,   202,   323,   203,    -1,
+       8,    14,    44,    97,   246,    -1,   245,    -1,   244,   245,
+      -1,    88,   283,   284,   294,   293,    -1,    88,    44,    97,
+     283,   284,   294,   293,    -1,    -1,   246,   247,    -1,   248,
+      -1,   253,    -1,   256,    -1,   260,    -1,   252,    -1,   251,
+     249,    -1,    -1,   249,   250,    -1,   257,    -1,   258,    -1,
+     259,    -1,    27,    -1,    27,    25,    -1,    25,    27,    -1,
+      27,    26,    -1,    26,    27,    -1,   252,    24,    89,    -1,
+     252,    28,    89,    -1,   252,    29,    -1,   254,    -1,   255,
+      -1,    55,    25,    -1,    25,    55,    -1,    55,    26,    -1,
+      26,    55,    -1,    16,    88,    -1,    24,    89,    -1,    28,
+      89,    -1,    29,    -1,    15,    88,   204,    88,   267,    -1,
+      15,   205,    88,   267,    -1,    15,    89,    -1,    15,    19,
+      89,    -1,    15,    20,    89,    -1,    15,    22,    89,    -1,
+      -1,    15,    89,   261,   265,    -1,    -1,    15,    19,    89,
+     262,   265,    -1,    -1,    15,    20,    89,   263,   265,    -1,
+      -1,    15,    22,    89,   264,   265,    -1,    15,    88,    -1,
+     266,    -1,   265,   266,    -1,    88,    -1,    -1,    18,    -1,
+     110,    95,    38,    89,    -1,   110,    95,    41,    89,    -1,
+     110,    95,   170,    88,    -1,   110,    95,   170,    89,    -1,
+     112,    95,    41,    89,    -1,   111,    95,    41,    89,    -1,
+     113,    95,    41,    89,    -1,   114,    95,    16,    88,    -1,
+     115,    95,    -1,   116,    95,    41,    89,    -1,   117,    95,
+      41,    89,    -1,    39,   279,   310,    -1,    39,   279,   280,
+     310,    -1,    40,   279,   310,    -1,    40,   279,   280,   310,
+      -1,    58,   279,   310,    -1,    58,   279,   280,   310,    -1,
+     281,    -1,   279,   281,    -1,   282,    -1,   280,   282,    -1,
+      88,    -1,    89,    -1,   145,    88,    -1,   146,    88,    -1,
+     145,    97,    -1,   146,    97,    -1,    -1,   149,    90,    -1,
+     149,    88,    -1,    -1,   150,    88,    -1,    -1,    43,    88,
+      -1,     3,     7,   289,   290,   292,   295,   312,   313,   353,
+       5,   351,   355,    -1,     3,     7,   186,   193,   315,   312,
+     313,   353,     5,   351,   355,    -1,     3,     7,   291,   292,
+     295,   312,   313,   353,     5,   351,   355,    -1,     3,     7,
+     177,   368,   309,   312,   353,     5,   351,   355,    -1,    -1,
+      42,    88,    -1,    44,    97,    -1,    54,    89,    -1,    -1,
+      45,    47,    -1,    45,    48,   294,   293,    -1,    45,    46,
+      -1,    -1,   161,    88,    -1,    -1,   158,    -1,   159,    -1,
+     160,    -1,   157,    -1,    -1,    49,    64,   303,    -1,    49,
+      62,    -1,    49,    73,    -1,    49,    75,    -1,    49,    65,
+      -1,    49,    63,   300,    -1,    49,    68,    -1,    49,    69,
+      -1,    49,    76,    -1,    49,    77,    -1,    49,    72,    -1,
+      49,    83,   298,   299,    -1,    49,    70,    -1,    49,    71,
+      -1,    49,    82,    -1,    49,    67,    -1,    49,    66,    -1,
+      49,    74,    -1,    49,    78,    -1,    49,    79,    -1,    49,
+      80,    -1,    49,    81,    -1,    49,    84,    -1,    49,    85,
+      -1,    49,    86,   302,    -1,    49,    87,    -1,   296,    -1,
+     297,    -1,   296,   297,    -1,    32,    88,    -1,    33,    88,
+      -1,    -1,   194,    90,    -1,   194,    88,    -1,    -1,   196,
+      97,    -1,    -1,   138,    89,   301,    -1,   138,    89,    59,
+      88,   301,    -1,    -1,   144,    88,    -1,   143,    88,    -1,
+     304,    -1,   303,     6,   304,    -1,    99,   348,    97,    98,
+      -1,   100,   348,    97,    98,    -1,   101,   348,    97,    98,
+      -1,   102,   348,    97,    98,    -1,   103,   348,    97,    98,
+      -1,   104,   348,    97,    98,    -1,   105,   348,    97,    98,
+      -1,   106,   348,    97,    98,    -1,   107,   348,    97,    98,
+      -1,   108,   348,    97,    98,    -1,     3,   171,   180,   353,
+       5,   351,   355,    -1,     3,   152,   188,   353,     5,   351,
+      -1,     3,   152,   189,   353,     5,   351,    -1,     3,   174,
+     348,    97,   349,   353,     5,   351,   355,    -1,    -1,    36,
+      97,    -1,    -1,    56,    97,   153,    -1,    -1,    56,    97,
+     153,    -1,    -1,    56,    97,   153,    -1,    -1,    57,    97,
+      -1,     3,    97,    58,    97,    35,     5,   351,    -1,     3,
+      97,    58,    97,    35,     5,    56,    -1,    -1,   187,   316,
+      88,    -1,   199,    -1,   198,    -1,   318,   322,   369,    -1,
+     318,   202,   320,   203,   322,   369,    -1,   318,   171,   202,
+     320,   203,   322,   369,    -1,   319,    -1,    51,    90,    -1,
+      52,    90,    -1,   321,    -1,   320,   321,    -1,   173,    -1,
+      59,    -1,    50,    -1,   187,    -1,   182,    -1,   175,    -1,
+     190,    -1,   146,    -1,   177,    -1,   148,    -1,   181,    -1,
+     179,    -1,   168,    -1,   188,    -1,   189,    -1,   121,    -1,
+     169,    -1,   120,    -1,    56,    -1,   151,    -1,   145,    -1,
+     174,    -1,    -1,    53,   202,   323,   203,    -1,   324,    -1,
+     323,   324,    -1,    91,    -1,    92,    -1,    93,    -1,    94,
+      -1,    60,    97,    35,    -1,    60,   195,    -1,    61,   195,
+      -1,   128,   129,    -1,   128,   130,    -1,   128,   131,    -1,
+     137,    96,    -1,   139,   329,    -1,   330,    -1,   329,   330,
+      -1,    95,    -1,     3,   120,   348,    97,   311,   353,     5,
+     351,   355,    -1,     3,   333,   353,     5,   351,   355,    -1,
+     334,    -1,   333,   334,    -1,   338,    -1,   341,    -1,   343,
+      -1,   344,    -1,     3,   336,   353,     5,   351,   355,    -1,
+     337,    -1,   336,   337,    -1,   344,    -1,   341,    -1,   342,
+      -1,   339,    -1,   132,   348,    97,    98,    -1,   133,   348,
+      97,    98,    -1,   340,   348,    97,    98,    -1,   134,    -1,
+     135,    -1,   136,    -1,   122,   348,   346,   361,    -1,   122,
+     348,    97,    98,    -1,   123,   348,   346,   361,    -1,   123,
+     348,    97,    98,    -1,   127,   348,   346,   361,    -1,   127,
+     348,    97,    98,    -1,   118,   348,    97,    -1,   345,   348,
+     346,    -1,   124,    -1,   125,    -1,   126,    -1,   109,    -1,
+      97,    -1,     3,   151,   348,    97,   349,   353,     5,   351,
+     355,    -1,     3,   152,   151,   353,     5,   351,    -1,    -1,
+     201,    -1,   200,    -1,   199,    -1,   198,    -1,   152,    -1,
+      -1,   153,    -1,   154,    -1,   155,    -1,   156,    -1,    51,
+      -1,   175,   279,    -1,   175,   279,   280,    -1,    58,    -1,
+      39,    -1,    40,    -1,   176,    -1,   350,    -1,   350,    -1,
+      -1,    97,    35,    -1,    97,    97,    35,    -1,    -1,    97,
+      35,    -1,    97,    97,    35,    -1,    -1,     4,     3,   183,
+     354,     5,   352,    -1,     4,     3,   184,   354,     5,   352,
+      -1,     4,     3,   185,   354,     5,   352,    -1,     3,     7,
+     357,    59,   353,     5,   351,   355,    -1,     3,     7,   357,
+      59,    33,    88,   353,     5,   351,   355,    -1,     3,   152,
+     357,    59,   353,     5,   351,    -1,    -1,    20,    -1,    21,
+      -1,     3,   166,   348,    97,   353,     5,   351,   355,    -1,
+       3,   166,   348,    97,    98,   353,     5,   351,   355,    -1,
+       3,   167,   348,   346,   361,   353,     5,   351,   355,    -1,
+       3,   167,   348,    97,    98,   353,     5,   351,   355,    -1,
+       3,   152,   190,   353,     5,   351,    -1,    -1,   162,    -1,
+     163,    -1,   164,    -1,   165,    -1,     3,     7,   168,    97,
+     353,     5,   351,   355,    -1,     3,   364,   170,    89,   353,
+       5,   351,    -1,     3,   364,   170,    88,   353,     5,   351,
+      -1,   172,   364,   170,    89,    -1,   172,   364,   170,    88,
+      -1,    -1,   171,    -1,     3,   169,   348,    97,   361,   353,
+       5,   351,   355,    -1,     3,   152,   169,   353,     5,   351,
+      -1,     3,     7,   145,    88,   353,     5,   351,   355,    -1,
+       3,     7,   145,    97,   353,     5,   351,   355,    -1,     3,
+       7,   146,    88,   353,     5,   351,   355,    -1,     3,     7,
+     146,    97,   353,     5,   351,   355,    -1,    45,   178,    -1,
+      -1,    37,    97,    -1,    37,    97,    35,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   306,   306,   307,   310,   311,   314,   315,   316,   317,
+     318,   319,   320,   321,   322,   323,   324,   325,   326,   327,
+     328,   329,   330,   331,   332,   333,   334,   335,   338,   339,
+     342,   343,   344,   345,   346,   347,   348,   349,   350,   351,
+     352,   353,   354,   355,   356,   357,   360,   361,   364,   365,
+     366,   367,   368,   369,   370,   371,   372,   373,   374,   375,
+     376,   377,   378,   379,   380,   383,   384,   387,   388,   389,
+     390,   391,   392,   393,   394,   395,   396,   397,   398,   399,
+     400,   401,   402,   405,   406,   409,   410,   411,   412,   413,
+     414,   415,   416,   417,   418,   419,   420,   421,   422,   425,
+     426,   429,   430,   431,   432,   433,   434,   435,   436,   437,
+     438,   439,   440,   443,   444,   447,   448,   449,   450,   451,
+     452,   453,   454,   455,   458,   459,   462,   463,   464,   465,
+     466,   467,   468,   469,   470,   471,   472,   473,   474,   475,
+     478,   479,   482,   483,   484,   485,   486,   487,   488,   489,
+     490,   491,   494,   498,   501,   507,   517,   518,   521,   526,
+     531,   538,   546,   549,   554,   557,   561,   567,   572,   577,
+     585,   588,   589,   592,   598,   599,   604,   610,   619,   625,
+     626,   629,   648,   667,   668,   671,   672,   673,   674,   677,
+     678,   689,   690,   693,   694,   695,   698,   699,   700,   703,
+     704,   705,   706,   707,   710,   711,   714,   715,   718,   719,
+     722,   725,   730,   738,   743,   746,   754,   758,   762,   766,
+     770,   770,   777,   777,   784,   784,   791,   791,   798,   806,
+     807,   810,   814,   815,   818,   821,   824,   831,   840,   845,
+     850,   855,   861,   867,   872,   878,   881,   886,   889,   895,
+     898,   903,   904,   907,   908,   911,   912,   915,   916,   917,
+     918,   921,   922,   923,   926,   927,   930,   931,   934,   941,
+     951,   960,   970,   976,   979,   982,   987,   990,   993,  1001,
+    1006,  1007,  1010,  1011,  1012,  1013,  1014,  1017,  1020,  1023,
+    1026,  1029,  1032,  1035,  1038,  1041,  1044,  1047,  1050,  1053,
+    1056,  1059,  1063,  1066,  1069,  1072,  1075,  1078,  1081,  1084,
+    1087,  1090,  1093,  1096,  1099,  1104,  1105,  1108,  1109,  1112,
+    1113,  1116,  1121,  1122,  1127,  1128,  1132,  1139,  1140,  1145,
+    1150,  1151,  1154,  1158,  1162,  1166,  1170,  1174,  1178,  1182,
+    1186,  1190,  1196,  1202,  1207,  1212,  1219,  1222,  1227,  1230,
+    1235,  1238,  1243,  1246,  1251,  1254,  1259,  1265,  1273,  1274,
+    1280,  1281,  1284,  1288,  1291,  1295,  1300,  1303,  1306,  1307,
+    1310,  1311,  1312,  1313,  1314,  1315,  1316,  1317,  1318,  1319,
+    1320,  1321,  1322,  1323,  1324,  1325,  1326,  1327,  1328,  1329,
+    1330,  1331,  1334,  1335,  1338,  1339,  1342,  1343,  1344,  1345,
+    1348,  1352,  1356,  1362,  1365,  1368,  1374,  1378,  1381,  1382,
+    1385,  1388,  1397,  1403,  1404,  1407,  1408,  1409,  1410,  1413,
+    1419,  1420,  1423,  1424,  1425,  1426,  1429,  1434,  1441,  1448,
+    1449,  1450,  1453,  1458,  1463,  1468,  1475,  1480,  1487,  1494,
+    1501,  1502,  1503,  1506,  1507,  1510,  1516,  1523,  1524,  1525,
+    1526,  1527,  1528,  1531,  1532,  1533,  1534,  1535,  1538,  1539,
+    1540,  1541,  1542,  1543,  1544,  1547,  1556,  1565,  1566,  1572,
+    1582,  1583,  1589,  1599,  1602,  1605,  1608,  1613,  1617,  1624,
+    1630,  1631,  1632,  1635,  1642,  1651,  1660,  1669,  1674,  1675,
+    1676,  1677,  1678,  1681,  1688,  1695,  1701,  1708,  1716,  1719,
+    1725,  1731,  1738,  1744,  1751,  1757,  1764,  1767,  1768,  1769
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "IF", "ELSE", "THEN", "OR", "FAILED",
+  "SET", "LOGFILE", "FACILITY", "DAEMON", "SYSLOG", "MAILSERVER", "HTTPD",
+  "ALLOW", "ADDRESS", "INIT", "READONLY", "CLEARTEXT", "MD5HASH",
+  "SHA1HASH", "CRYPT", "DELAY", "PEMFILE", "ENABLE", "DISABLE", "HTTPDSSL",
+  "CLIENTPEMFILE", "ALLOWSELFCERTIFICATION", "IDFILE", "STATEFILE", "SEND",
+  "EXPECT", "EXPECTBUFFER", "CYCLE", "COUNT", "REMINDER", "PIDFILE",
+  "START", "STOP", "PATHTOK", "HOST", "HOSTNAME", "PORT", "TYPE", "UDP",
+  "TCP", "TCPSSL", "PROTOCOL", "CONNECTION", "ALERT", "NOALERT",
+  "MAILFORMAT", "UNIXSOCKET", "SIGNATURE", "TIMEOUT", "RETRY", "RESTART",
+  "CHECKSUM", "EVERY", "NOTEVERY", "DEFAULT", "HTTP", "APACHESTATUS",
+  "FTP", "SMTP", "POP", "IMAP", "CLAMAV", "NNTP", "NTP3", "MYSQL", "DNS",
+  "SSH", "DWP", "LDAP2", "LDAP3", "RDATE", "RSYNC", "TNS", "PGSQL",
+  "POSTFIXPOLICY", "SIP", "LMTP", "GPS", "RADIUS", "MEMCACHE", "STRING",
+  "PATH", "MAILADDR", "MAILFROM", "MAILREPLYTO", "MAILSUBJECT", "MAILBODY",
+  "SERVICENAME", "STRINGNAME", "NUMBER", "PERCENT", "LOGLIMIT",
+  "CLOSELIMIT", "DNSLIMIT", "KEEPALIVELIMIT", "REPLYLIMIT", "REQUESTLIMIT",
+  "STARTLIMIT", "WAITLIMIT", "GRACEFULLIMIT", "CLEANUPLIMIT", "REAL",
+  "CHECKPROC", "CHECKFILESYS", "CHECKFILE", "CHECKDIR", "CHECKHOST",
+  "CHECKSYSTEM", "CHECKFIFO", "CHECKPROGRAM", "CHILDREN", "SYSTEM",
+  "STATUS", "RESOURCE", "MEMORY", "TOTALMEMORY", "LOADAVG1", "LOADAVG5",
+  "LOADAVG15", "SWAP", "MODE", "ACTIVE", "PASSIVE", "MANUAL", "CPU",
+  "TOTALCPU", "CPUUSER", "CPUSYSTEM", "CPUWAIT", "GROUP", "REQUEST",
+  "DEPENDS", "BASEDIR", "SLOT", "EVENTQUEUE", "SECRET", "HOSTHEADER",
+  "UID", "GID", "MMONIT", "INSTANCE", "USERNAME", "PASSWORD", "TIMESTAMP",
+  "CHANGED", "SECOND", "MINUTE", "HOUR", "DAY", "SSLAUTO", "SSLV2",
+  "SSLV3", "TLSV1", "CERTMD5", "BYTE", "KILOBYTE", "MEGABYTE", "GIGABYTE",
+  "INODE", "SPACE", "PERMISSION", "SIZE", "MATCH", "NOT", "IGNORE",
+  "ACTION", "UPTIME", "EXEC", "UNMONITOR", "ICMP", "ICMPECHO", "NONEXIST",
+  "EXIST", "INVALID", "DATA", "RECOVERED", "PASSED", "SUCCEEDED", "URL",
+  "CONTENT", "PID", "PPID", "FSFLAG", "REGISTER", "CREDENTIALS",
+  "URLOBJECT", "TARGET", "TIMESPEC", "MAXFORWARD", "FIPS", "NOTEQUAL",
+  "EQUAL", "LESS", "GREATER", "'{'", "'}'", "':'", "'@'", "$accept",
+  "cfgfile", "statement_list", "statement", "optproclist", "optproc",
+  "optfilelist", "optfile", "optfilesyslist", "optfilesys", "optdirlist",
+  "optdir", "opthostlist", "opthost", "optsystemlist", "optsystem",
+  "optfifolist", "optfifo", "optstatuslist", "optstatus", "setalert",
+  "setdaemon", "startdelay", "setexpectbuffer", "setinit", "setfips",
+  "setlog", "seteventqueue", "setidfile", "setstatefile", "setpid",
+  "setmmonits", "mmonitlist", "mmonit", "credentials", "setmailservers",
+  "setmailformat", "sethttpd", "mailserverlist", "mailserver", "httpdlist",
+  "httpdoption", "ssl", "optssllist", "optssl", "sslenable", "ssldisable",
+  "signature", "sigenable", "sigdisable", "bindaddress", "pemfile",
+  "clientpemfile", "allowselfcert", "allow", "$@1", "$@2", "$@3", "$@4",
+  "allowuserlist", "allowuser", "readonly", "checkproc", "checkfile",
+  "checkfilesys", "checkdir", "checkhost", "checksystem", "checkfifo",
+  "checkprogram", "start", "stop", "restart", "argumentlist",
+  "useroptionlist", "argument", "useroption", "username", "password",
+  "hostname", "connection", "connectionunix", "icmp", "host", "port",
+  "unixsocket", "type", "certmd5", "sslversion", "protocol",
+  "sendexpectlist", "sendexpect", "target", "maxforward", "request",
+  "hostheader", "secret", "apache_stat_list", "apache_stat", "exist",
+  "pid", "ppid", "uptime", "icmpcount", "exectimeout", "programtimeout",
+  "nettimeout", "retry", "actionrate", "urloption", "urloperator", "alert",
+  "alertmail", "noalertmail", "eventoptionlist", "eventoption",
+  "formatlist", "formatoptionlist", "formatoption", "every", "mode",
+  "group", "depend", "dependlist", "dependant", "exitvalue",
+  "resourceprocess", "resourceprocesslist", "resourceprocessopt",
+  "resourcesystem", "resourcesystemlist", "resourcesystemopt",
+  "resourcecpuproc", "resourcecpu", "resourcecpuid", "resourcemem",
+  "resourceswap", "resourcechild", "resourceload", "resourceloadavg",
+  "value", "timestamp", "operator", "time", "action", "action1", "action2",
+  "rate1", "rate2", "recovery", "checksum", "hashtype", "inode", "space",
+  "fsflag", "unit", "permission", "match", "matchflagnot", "size", "uid",
+  "gid", "icmptype", "reminder", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
+     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,
+     445,   446,   447,   448,   449,   450,   451,   452,   453,   454,
+     455,   456,   123,   125,    58,    64
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint16 yyr1[] =
+{
+       0,   206,   207,   207,   208,   208,   209,   209,   209,   209,
+     209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
+     209,   209,   209,   209,   209,   209,   209,   209,   210,   210,
+     211,   211,   211,   211,   211,   211,   211,   211,   211,   211,
+     211,   211,   211,   211,   211,   211,   212,   212,   213,   213,
+     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
+     213,   213,   213,   213,   213,   214,   214,   215,   215,   215,
+     215,   215,   215,   215,   215,   215,   215,   215,   215,   215,
+     215,   215,   215,   216,   216,   217,   217,   217,   217,   217,
+     217,   217,   217,   217,   217,   217,   217,   217,   217,   218,
+     218,   219,   219,   219,   219,   219,   219,   219,   219,   219,
+     219,   219,   219,   220,   220,   221,   221,   221,   221,   221,
+     221,   221,   221,   221,   222,   222,   223,   223,   223,   223,
+     223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
+     224,   224,   225,   225,   225,   225,   225,   225,   225,   225,
+     225,   225,   226,   226,   226,   227,   228,   228,   229,   230,
+     231,   232,   232,   232,   233,   233,   233,   234,   235,   236,
+     237,   238,   238,   239,   240,   240,   241,   242,   243,   244,
+     244,   245,   245,   246,   246,   247,   247,   247,   247,   248,
+     248,   249,   249,   250,   250,   250,   251,   251,   251,   252,
+     252,   252,   252,   252,   253,   253,   254,   254,   255,   255,
+     256,   257,   258,   259,   260,   260,   260,   260,   260,   260,
+     261,   260,   262,   260,   263,   260,   264,   260,   260,   265,
+     265,   266,   267,   267,   268,   268,   268,   268,   269,   270,
+     271,   272,   273,   274,   275,   276,   276,   277,   277,   278,
+     278,   279,   279,   280,   280,   281,   281,   282,   282,   282,
+     282,   283,   283,   283,   284,   284,   285,   285,   286,   286,
+     287,   288,   289,   289,   290,   291,   292,   292,   292,   292,
+     293,   293,   294,   294,   294,   294,   294,   295,   295,   295,
+     295,   295,   295,   295,   295,   295,   295,   295,   295,   295,
+     295,   295,   295,   295,   295,   295,   295,   295,   295,   295,
+     295,   295,   295,   295,   295,   296,   296,   297,   297,   298,
+     298,   298,   299,   299,   300,   300,   300,   301,   301,   302,
+     303,   303,   304,   304,   304,   304,   304,   304,   304,   304,
+     304,   304,   305,   306,   307,   308,   309,   309,   310,   310,
+     311,   311,   312,   312,   313,   313,   314,   314,   315,   315,
+     316,   316,   317,   317,   317,   317,   318,   319,   320,   320,
+     321,   321,   321,   321,   321,   321,   321,   321,   321,   321,
+     321,   321,   321,   321,   321,   321,   321,   321,   321,   321,
+     321,   321,   322,   322,   323,   323,   324,   324,   324,   324,
+     325,   325,   325,   326,   326,   326,   327,   328,   329,   329,
+     330,   331,   332,   333,   333,   334,   334,   334,   334,   335,
+     336,   336,   337,   337,   337,   337,   338,   338,   339,   340,
+     340,   340,   341,   341,   341,   341,   342,   342,   343,   344,
+     345,   345,   345,   346,   346,   347,   347,   348,   348,   348,
+     348,   348,   348,   349,   349,   349,   349,   349,   350,   350,
+     350,   350,   350,   350,   350,   351,   352,   353,   353,   353,
+     354,   354,   354,   355,   355,   355,   355,   356,   356,   356,
+     357,   357,   357,   358,   358,   359,   359,   360,   361,   361,
+     361,   361,   361,   362,   363,   363,   363,   363,   364,   364,
+     365,   365,   366,   366,   367,   367,   368,   369,   369,   369
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     0,     1,     1,     2,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     2,     2,     2,     2,     2,     2,     2,     0,     2,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     0,     2,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     0,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     2,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     2,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     0,     2,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     4,     7,     8,     4,     0,     3,     4,     2,
+       2,     3,     3,     5,     4,     6,     4,     3,     3,     3,
+       3,     2,     3,     4,     0,     2,     5,     5,     5,     1,
+       2,     5,     7,     0,     2,     1,     1,     1,     1,     1,
+       2,     0,     2,     1,     1,     1,     1,     2,     2,     2,
+       2,     3,     3,     2,     1,     1,     2,     2,     2,     2,
+       2,     2,     2,     1,     5,     4,     2,     3,     3,     3,
+       0,     4,     0,     5,     0,     5,     0,     5,     2,     1,
+       2,     1,     0,     1,     4,     4,     4,     4,     4,     4,
+       4,     4,     2,     4,     4,     3,     4,     3,     4,     3,
+       4,     1,     2,     1,     2,     1,     1,     2,     2,     2,
+       2,     0,     2,     2,     0,     2,     0,     2,    12,    11,
+      11,    10,     0,     2,     2,     2,     0,     2,     4,     2,
+       0,     2,     0,     1,     1,     1,     1,     0,     3,     2,
+       2,     2,     2,     3,     2,     2,     2,     2,     2,     4,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     3,     2,     1,     1,     2,     2,     2,     0,
+       2,     2,     0,     2,     0,     3,     5,     0,     2,     2,
+       1,     3,     4,     4,     4,     4,     4,     4,     4,     4,
+       4,     4,     7,     6,     6,     9,     0,     2,     0,     3,
+       0,     3,     0,     3,     0,     2,     7,     7,     0,     3,
+       1,     1,     3,     6,     7,     1,     2,     2,     1,     2,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     0,     4,     1,     2,     1,     1,     1,     1,
+       3,     2,     2,     2,     2,     2,     2,     2,     1,     2,
+       1,     9,     6,     1,     2,     1,     1,     1,     1,     6,
+       1,     2,     1,     1,     1,     1,     4,     4,     4,     1,
+       1,     1,     4,     4,     4,     4,     4,     4,     3,     3,
+       1,     1,     1,     1,     1,     9,     6,     0,     1,     1,
+       1,     1,     1,     0,     1,     1,     1,     1,     1,     2,
+       3,     1,     1,     1,     1,     1,     1,     0,     2,     3,
+       0,     2,     3,     0,     6,     6,     6,     8,    10,     7,
+       0,     1,     1,     8,     9,     9,     9,     6,     0,     1,
+       1,     1,     1,     8,     7,     7,     4,     4,     0,     1,
+       9,     6,     8,     8,     8,     8,     2,     0,     2,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint16 yydefact[] =
+{
+       2,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     3,     4,     6,     7,    17,    18,    19,     8,     9,
+      15,    16,    14,    10,    11,    12,    13,    28,    46,    65,
+      83,     0,   113,   124,   140,     0,     0,     0,     0,   159,
+       0,     0,     0,     0,     0,     0,     0,     0,   160,   392,
+       0,     0,     0,     0,     0,   242,     0,     0,     1,     5,
+      20,    21,    22,    23,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    24,    99,   101,   102,   103,   105,
+     106,   104,   107,   108,   392,   365,   109,   110,   111,   112,
+      25,    26,    27,   162,   161,   156,   261,   352,   179,     0,
+     167,   168,   488,   169,   366,     0,     0,     0,   352,   170,
+     174,     0,     0,     0,   507,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    29,    30,    31,    32,    37,
+      38,    33,    34,    35,    36,    39,    40,    41,    42,    43,
+      44,    45,   498,   498,    47,    48,    49,    50,    51,    53,
+      55,    54,    62,    63,    64,    52,    59,    56,    61,    60,
+      57,    58,     0,    66,    67,    68,    69,    70,    71,    73,
+      72,    77,    78,    79,    80,    81,    82,    74,    75,    76,
+       0,    84,    85,    86,    87,    88,    90,    92,    91,    96,
+      97,    98,    89,    93,    94,    95,   272,     0,     0,   255,
+     256,   348,   251,   348,   367,   348,     0,   401,   402,   403,
+     404,   405,   406,   410,   407,   408,   100,     0,     0,   507,
+       0,   114,   115,   116,   117,   118,   119,   120,   121,   122,
+     123,   125,   126,   127,   128,   129,   131,   133,   132,   137,
+     138,   139,   130,   134,   135,   136,     0,   141,   142,   143,
+     144,   146,   145,   147,   148,   149,   150,   151,     0,     0,
+     155,     0,     0,   264,     0,   180,   266,   183,   489,   490,
+     491,   492,   158,   396,   397,   398,   399,     0,   394,   164,
+     166,   282,   174,     0,   171,     0,     0,   372,   388,   371,
+     387,   385,   390,   377,   379,   389,   382,   386,   370,   391,
+     375,   378,   381,   380,   374,   373,   383,   384,   376,     0,
+     368,     0,   152,   234,   235,   236,   237,   239,   238,   240,
+     241,   243,   244,   272,   447,   447,   447,   440,   441,   442,
+     447,   447,     0,   447,   467,   413,   415,   416,   417,   418,
+     447,   480,   447,   480,   447,   499,     0,   499,     0,     0,
+       0,   447,   447,     0,     0,     0,     0,     0,     0,   467,
+       0,     0,     0,   348,   252,   253,   245,   348,   247,   348,
+     249,   400,   409,     0,     0,   362,   447,   429,   430,   431,
+     467,   420,   425,   447,   423,   424,   422,   447,   163,     0,
+     261,   263,   262,     0,   282,     0,     0,   176,   178,   177,
+     395,     0,   286,   283,   284,   285,   280,   172,   175,     0,
+       0,   392,   369,   508,     0,   276,   452,   451,   450,   449,
+     448,     0,     0,     0,     0,     0,   467,   467,     0,     0,
+     414,     0,     0,   481,   482,     0,     0,     0,     0,     0,
+     467,   467,     0,     0,     0,     0,   467,     0,     0,   273,
+       0,   346,   358,     0,   276,     0,     0,     0,   257,   259,
+     258,   260,   254,   246,   248,   250,     0,   392,     0,   421,
+       0,     0,     0,   157,   264,   265,   280,   353,   267,     0,
+       0,     0,     0,   196,     0,   184,   185,   191,   189,   186,
+     204,   205,   187,   188,   165,     0,   173,   393,   392,   507,
+     509,   275,     0,   287,   438,   444,   443,   488,   444,   488,
+       0,     0,     0,     0,   453,   468,     0,     0,   444,   439,
+     467,   467,   467,   467,   467,   467,   453,     0,     0,   467,
+     488,   467,   467,   497,   496,     0,   467,   444,   488,   506,
+       0,   352,     0,   352,   274,   287,     0,     0,   349,   392,
+     507,   444,   488,     0,     0,   350,   282,   181,     0,     0,
+       0,   228,   216,     0,   210,   198,   207,   200,   209,   197,
+     199,   206,   208,   190,     0,     0,   203,   281,   507,   153,
+     279,   277,   282,     0,     0,     0,   352,   314,   315,   433,
+     432,   435,   434,   426,   427,     0,     0,   454,   455,   456,
+     457,   467,   469,   462,   463,   458,   461,     0,   464,   465,
+     473,     0,     0,     0,     0,     0,     0,     0,   467,     0,
+       0,     0,   467,     0,     0,     0,   467,     0,   467,   467,
+     347,   467,   361,   360,     0,   354,   352,     0,   473,   507,
+     363,   437,   436,   473,   428,     0,   467,   280,   217,   218,
+     219,     0,     0,   232,     0,     0,   213,   192,   193,   194,
+     195,   201,   202,   154,   280,   317,   318,   289,   324,     0,
+     292,   304,   303,   294,   295,   300,   301,   298,   290,   305,
+     291,   296,   297,   306,   307,   308,   309,   302,   319,   310,
+     311,     0,   313,   354,   316,   343,   344,     0,   459,     0,
+     412,     0,     0,     0,     0,     0,   467,     0,     0,   446,
+     501,     0,     0,     0,     0,   487,     0,     0,     0,     0,
+       0,   359,     0,   467,   354,   357,   356,   342,   364,   419,
+       0,     0,   182,     0,     0,     0,   232,   231,   221,   229,
+     233,   215,   211,   212,   278,     0,   293,   447,   447,   447,
+     447,   447,   447,   447,   447,   447,   447,   288,   330,     0,
+     322,     0,   312,   467,     0,   460,     0,   473,   473,   473,
+     473,   473,     0,   473,     0,   479,     0,   495,   494,     0,
+     473,     0,     0,     0,   355,     0,   467,   351,     0,   223,
+     225,   227,   214,   230,   327,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   321,   320,     0,   299,
+     329,     0,   473,   470,   470,   470,   502,   503,   504,   505,
+     493,     0,   477,   473,   473,   473,   483,   473,   473,   473,
+       0,     0,   473,     0,     0,   325,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   331,   323,     0,   345,
+       0,     0,     0,     0,   473,   445,   500,   484,   486,   485,
+     271,   473,     0,   411,   327,   328,   332,   333,   334,   335,
+     336,   337,   338,   339,   340,   341,   473,   471,     0,     0,
+       0,     0,   478,   269,   473,   326,   270,   472,   466,   474,
+     475,   476,   268
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,    10,    11,    12,    60,   125,    61,   144,    62,   163,
+      63,   181,    74,    75,    90,   221,    91,   231,    92,   247,
+      13,    14,   260,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,   109,   110,   284,    24,    25,    26,    97,    98,
+     398,   485,   486,   573,   657,   487,   488,   489,   490,   491,
+     492,   658,   659,   660,   493,   652,   733,   734,   735,   738,
+     739,   741,    27,    28,    29,    30,    31,    32,    33,    34,
+      76,    77,    78,   201,   363,   202,   365,   263,   394,   397,
+      79,   130,    80,   357,   454,   415,   503,   496,   406,   586,
+     587,   588,   760,   809,   746,   835,   762,   757,   758,    81,
+     132,   133,   134,   541,   366,   646,   266,   723,    82,   543,
+     634,    83,    84,    85,   309,   310,   114,   277,   278,    86,
+      87,    88,    89,   214,   215,   257,   141,   334,   335,   230,
+     380,   381,   336,   382,   383,   337,   385,   338,   339,   340,
+     507,   155,   421,   601,   609,   610,   889,   431,   851,   700,
+     156,   438,   174,   175,   176,   272,   157,   158,   346,   159,
+     160,   161,   451,   312
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -614
+static const yytype_int16 yypact[] =
+{
+     212,    54,   -58,   -33,   -25,   -23,   -19,   -14,     1,    15,
+     123,   212,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,   260,  -614,  -614,  -614,    37,    33,    77,   102,  -614,
+      82,    92,   110,   122,   131,    32,   142,    59,  -614,   -36,
+      -3,   216,   236,   249,   297,  -614,   278,   304,  -614,  -614,
+     592,    76,   664,   710,     5,   275,   275,   250,   275,   -57,
+     171,   345,   281,   290,   260,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,     3,  -614,  -614,  -614,  -614,  -614,
+     727,   710,   790,   388,  -614,   348,   -17,    18,  -614,   295,
+    -614,  -614,   247,  -614,  -614,   326,   325,   324,   376,    59,
+     257,   233,   270,   638,   424,   412,   415,   312,   421,   423,
+     429,   447,   444,   448,   143,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,     4,   309,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,    11,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+      51,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,   -16,   482,   378,  -614,
+    -614,    -2,  -614,    -2,  -614,    -2,   526,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,   290,  -614,  -614,   361,   638,   424,
+     467,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,   -42,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,   477,   552,
+    -614,   481,    43,   430,   484,  -614,   540,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,   -41,  -614,   446,
+    -614,   271,   257,   396,  -614,   326,   638,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,   357,
+    -614,   510,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,   -18,   132,   132,   132,  -614,  -614,  -614,
+     132,   132,   262,   132,   391,  -614,  -614,  -614,  -614,  -614,
+     132,    73,   132,    39,   132,   378,   439,  -614,   441,   134,
+     425,   132,   132,   463,   529,   581,   440,   591,   545,   548,
+     549,   156,   200,     8,  -614,  -614,  -614,     8,  -614,     8,
+    -614,  -614,  -614,   638,   431,  -614,   132,  -614,  -614,  -614,
+     539,  -614,  -614,   132,  -614,  -614,  -614,   132,  -614,   550,
+     488,  -614,  -614,   568,   271,   502,   572,  -614,   323,  -614,
+    -614,   582,  -614,  -614,  -614,  -614,   520,  -614,  -614,     6,
+     503,   630,  -614,   654,   606,   651,  -614,  -614,  -614,  -614,
+    -614,   601,    42,    55,   602,   603,   548,   548,   604,    48,
+    -614,   697,   163,  -614,  -614,   254,   259,   608,   659,   622,
+     548,   548,   662,   626,   368,   377,   548,   629,   165,  -614,
+     554,   691,   541,   636,   651,   701,   732,   589,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,   566,   630,   244,  -614,
+     739,   649,   655,  -614,   430,  -614,   520,  -614,  -614,    25,
+     663,    64,    85,   355,   460,  -614,  -614,  -614,   218,  -614,
+    -614,  -614,  -614,  -614,  -614,   669,  -614,  -614,   630,   424,
+    -614,  -614,   445,   238,  -614,   665,  -614,   247,   666,   247,
+     667,   674,   755,   768,   315,  -614,   740,   192,  -614,  -614,
+     548,   548,   548,   548,   548,    28,   315,   769,   772,   548,
+     247,   548,   548,  -614,  -614,   775,   397,   678,   247,  -614,
+     684,   376,   299,   376,  -614,   238,   777,   192,  -614,   630,
+     424,   692,   247,   192,   693,   738,   271,  -614,   706,   707,
+     708,   594,   711,   712,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,   347,   713,   715,  -614,  -614,   424,  -614,
+    -614,  -614,   271,   717,   720,   814,   376,   474,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,   192,   192,  -614,  -614,  -614,
+    -614,   548,  -614,  -614,  -614,  -614,  -614,   275,  -614,  -614,
+     805,   809,   811,   813,   816,   817,   722,   818,   548,   192,
+     192,   819,   548,   830,   831,   192,   548,   832,   548,   548,
+    -614,   548,  -614,  -614,   751,   795,   376,   198,   805,   424,
+    -614,  -614,  -614,   805,  -614,   743,   548,   520,   765,   766,
+     767,   770,   779,   838,   776,   780,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,   520,  -614,  -614,  -614,   719,   803,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,   676,  -614,
+    -614,   716,  -614,   795,  -614,  -614,  -614,   855,   170,   865,
+    -614,   192,   192,   192,   192,   192,   548,   192,   866,  -614,
+    -614,   192,   867,   192,   192,  -614,   907,   192,   908,   909,
+     910,  -614,   820,   548,   795,  -614,  -614,  -614,  -614,  -614,
+     763,   913,  -614,   779,   779,   779,   838,  -614,   779,  -614,
+    -614,  -614,  -614,  -614,  -614,   833,  -614,   132,   132,   132,
+     132,   132,   132,   132,   132,   132,   132,   914,  -614,   101,
+     723,   835,  -614,   548,   192,   382,   337,   805,   805,   805,
+     805,   805,   916,   805,   192,  -614,   192,  -614,  -614,   192,
+     805,   192,   192,   192,  -614,   919,   548,  -614,   192,   779,
+     779,   779,  -614,  -614,   -20,   828,   829,   834,   836,   837,
+     839,   840,   841,   842,   843,   803,  -614,  -614,   844,  -614,
+    -614,   923,   805,   845,   845,   845,  -614,  -614,  -614,  -614,
+    -614,   192,  -614,   805,   805,   805,  -614,   805,   805,   805,
+     192,   925,   805,   847,   856,  -614,   848,   849,   850,   851,
+     852,   853,   854,   857,   858,   859,  -614,  -614,   192,  -614,
+      60,   927,   938,   940,   805,  -614,  -614,  -614,  -614,  -614,
+    -614,   805,   192,  -614,   810,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,   805,  -614,   918,   192,
+     192,   192,  -614,  -614,   805,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -614,  -614,  -614,   947,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,   885,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,   860,   679,  -614,  -614,  -614,  -614,   863,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+    -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -185,
+    -483,   226,  -614,  -614,  -614,  -614,  -614,  -614,  -614,  -614,
+     333,   392,   494,   -66,  -199,  -198,  -338,   573,   490,  -614,
+     905,  -614,  -614,  -614,  -614,  -614,   512,  -467,  -384,   422,
+    -614,   381,  -614,  -614,  -614,   106,  -614,  -614,   166,   298,
+    -614,  -614,  -614,  -614,  -157,  -614,  -107,  -613,   506,  -614,
+    -614,   567,   971,  -614,  -204,  -252,   -76,   688,  -249,   578,
+     647,   771,   783,  -614,   760,  -614,  -614,  -614,   641,  -614,
+    -614,   596,  -614,  -614,  -614,  -201,  -614,  -614,  -187,  -614,
+     -86,   137,  -310,   451,  -309,  -478,  -307,  -337,  -272,  -365,
+    -614,   635,  -614,  -614,  -614,  -173,    58,  -614,   846,  -614,
+     154,   292,  -614,  -206
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -227
+static const yytype_int16 yytable[] =
+{
+     203,   281,   205,   364,   367,   364,   369,   364,   219,   557,
+     476,   341,   196,   375,   374,   422,   423,   111,   349,   384,
+     424,   425,   456,   428,   354,   462,   354,   261,   400,   462,
+     432,   462,   439,   386,   443,   115,   414,    50,   116,   833,
+     206,   447,   448,   470,   558,   559,   368,   560,   370,    93,
+     273,   274,   275,   276,   360,   197,   111,   412,   349,   433,
+     434,   616,    51,    35,   360,    36,   468,    37,    38,   638,
+      52,    39,    53,   471,   264,   643,    54,   472,   387,   142,
+     763,    55,   410,   515,    40,    41,   199,   200,    42,   512,
+     513,   565,    43,   433,   434,   877,    56,   273,   274,   275,
+     276,   197,   197,   527,   528,    44,    96,    45,   197,   535,
+      57,   786,   567,   561,   562,    65,    66,   695,   696,   566,
+     177,   193,   412,    58,   834,   429,    94,    44,    67,   198,
+      95,   391,   262,   392,    68,   112,    69,    70,   207,   505,
+     568,   709,   710,   361,   362,   516,    99,   715,   197,   243,
+     323,   506,   508,   361,   362,   342,   343,   878,   412,   726,
+     400,   355,   399,   350,   506,    96,   113,   117,   356,   466,
+     356,   100,   647,   344,   217,   345,   198,   351,   352,   384,
+     732,   101,   198,   611,   612,   613,   614,   615,   617,   806,
+     440,   807,   621,   386,   623,   624,    46,   744,   664,   627,
+     192,    47,   342,   353,    71,   218,   463,   102,   441,   497,
+     464,   103,   465,    72,   412,    73,   178,   194,   435,   436,
+       1,   104,   198,   767,   768,   769,   770,   771,   242,   773,
+     563,   603,   604,   775,   105,   777,   778,   603,   604,   780,
+     197,   437,   574,   605,   458,   244,   575,   576,   143,   605,
+     606,    48,   108,   459,   725,   793,   606,   118,   199,   200,
+     518,   324,   537,    64,   697,   325,   326,   327,   328,   329,
+     583,   584,   506,   727,   506,   330,   331,   119,   729,   435,
+     436,   708,   106,   107,   416,   712,   812,   585,   460,   716,
+     120,   718,   719,   579,   720,   332,   823,   461,   824,    65,
+      66,   825,   437,   827,   828,   829,   793,   793,   793,   731,
+     832,    44,    67,   121,   198,   361,   362,   333,    68,   122,
+      69,    70,     2,     3,     4,     5,     6,     7,     8,     9,
+     417,   418,   419,   420,   590,   499,   592,   509,   479,   480,
+     204,   551,   520,   854,   640,   123,   519,   522,   481,   482,
+     483,   521,   861,   506,   179,   195,   523,   622,   131,   148,
+     167,   185,   538,   199,   200,   629,   208,   607,   608,   772,
+     876,   654,   663,   607,   608,   655,   656,   212,   484,   642,
+     569,   570,   552,   245,   884,   213,   785,   259,    71,   235,
+     251,   550,   267,   126,   145,   164,   182,    72,   258,    73,
+     315,   316,   816,   817,   818,   819,   820,   287,   822,   268,
+     269,   270,   271,   288,   279,   826,   289,   273,   274,   275,
+     276,   280,   578,   222,   232,   248,   811,   462,   402,   403,
+     404,   405,   264,   728,   631,   285,   635,   795,   796,   797,
+     798,   799,   800,   801,   802,   803,   804,   849,   283,   831,
+     426,   427,   127,   146,   165,   183,   531,   532,   855,   856,
+     857,   311,   858,   859,   860,   533,   534,   863,   597,   598,
+     599,   600,   286,   639,   209,   210,   211,   290,   291,   693,
+     347,   287,   223,   233,   249,   571,   572,   288,   429,   882,
+     289,   580,   581,   582,   429,   626,   883,   632,   633,   765,
+     364,   313,   292,   293,   314,   294,   583,   584,   295,   324,
+     317,   886,   318,   325,   326,   327,   328,   329,   319,   892,
+     813,   814,   815,   330,   331,   296,   297,   361,   362,   724,
+     298,   299,   300,   321,   301,   320,   302,   322,   303,   304,
+     358,   698,   852,   853,   305,   306,   307,   308,   789,   790,
+     791,   290,   291,   287,   128,   147,   166,   184,   359,   288,
+     411,   371,   289,   373,   197,   388,   135,   149,   168,   186,
+     888,   888,   888,   890,   891,   389,   292,   293,   390,   294,
+     393,   395,   295,   396,   224,   234,   250,   401,   408,   325,
+     326,   327,   328,   329,   376,   124,   225,   236,   252,   296,
+     297,   377,   378,   379,   298,   299,   300,   413,   301,   444,
+     302,   445,   303,   304,   440,   446,   287,   449,   305,   306,
+     307,   308,   288,   290,   291,   289,   450,   136,   150,   169,
+     187,    65,    66,   452,   467,   453,   429,   262,   137,   151,
+     170,   188,   455,    44,    67,   429,   457,   473,   292,   293,
+      68,   294,    69,    70,   295,   477,   475,   226,   237,   253,
+     478,   325,   326,   327,   328,   329,   376,   162,   227,   238,
+     254,   296,   297,   377,   378,   379,   298,   299,   300,   494,
+     301,   495,   302,   111,   303,   304,   290,   291,   287,   500,
+     305,   306,   307,   308,   288,   501,   502,   289,   504,   510,
+     511,   514,   517,    65,    66,   524,   498,   138,   152,   171,
+     189,   292,   293,   180,   294,    44,    67,   295,   525,   526,
+      71,   529,    68,   530,    69,    70,   536,   540,   542,    72,
+     220,    73,   539,   544,   296,   297,   546,   547,   239,   298,
+     299,   300,   548,   301,   553,   302,   554,   303,   304,    65,
+      66,   564,   555,   305,   306,   307,   308,   577,   290,   291,
+     595,    44,    67,   589,   591,   593,    65,    66,    68,   549,
+      69,    70,   594,   596,   619,   602,   628,   620,    44,    67,
+     625,   630,   637,   292,   293,    68,   294,    69,    70,   295,
+     641,   644,    71,   246,   645,   648,   649,   650,   651,  -220,
+     653,    72,   661,    73,   662,   665,   296,   297,   666,   699,
+     706,   298,   299,   300,   701,   301,   702,   302,   703,   303,
+     304,   704,   705,   707,   711,   305,   306,   307,   308,    65,
+      66,   139,   153,   172,   190,   713,   714,   717,    71,   721,
+     730,    44,    67,   140,   154,   173,   191,    72,    68,    73,
+      69,    70,   722,  -222,  -224,  -226,   740,   745,   736,   761,
+     764,   228,   240,   255,    72,   742,    73,   737,   766,   743,
+     759,   774,   776,   229,   241,   256,   667,   668,   669,   670,
+     671,   672,   673,   674,   675,   676,   677,   678,   679,   680,
+     681,   682,   683,   684,   685,   686,   687,   688,   689,   690,
+     691,   692,   747,   748,   749,   750,   751,   752,   753,   754,
+     755,   756,   779,   781,   782,   783,   787,   784,   788,   808,
+     805,   821,   794,   810,   830,   836,   837,    72,   848,    73,
+     862,   838,   879,   839,   840,   864,   841,   842,   843,   844,
+     845,   847,   850,   880,   865,   881,   866,   867,   868,   869,
+     870,   871,   872,   887,   834,   873,   874,   875,    59,   216,
+     265,   407,   792,   474,   556,   129,   545,   636,   694,   282,
+     885,   846,    49,   409,   372,   430,   469,   618,   442,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   348
+};
+
+static const yytype_int16 yycheck[] =
+{
+      66,   108,    68,   201,   203,   203,   205,   205,    84,   476,
+     394,     7,     7,   219,   218,   325,   326,    53,     7,   220,
+     330,   331,   359,   333,    42,   363,    42,    44,   277,   367,
+     340,   369,   342,   220,   344,    38,    54,    95,    41,    59,
+      97,   351,   352,   380,    19,    20,   203,    22,   205,    12,
+      91,    92,    93,    94,    56,    97,    53,   309,     7,    20,
+      21,    33,    95,     9,    56,    11,   376,    13,    14,   547,
+      95,    17,    95,   383,    56,   553,    95,   387,   120,     3,
+     693,    95,   286,    35,    30,    31,    88,    89,    34,   426,
+     427,    27,    38,    20,    21,    35,    95,    91,    92,    93,
+      94,    97,    97,   440,   441,    51,    88,    53,    97,   446,
+      95,   724,    27,    88,    89,    39,    40,   595,   596,    55,
+      62,    63,   374,     0,   144,    97,    89,    51,    52,   171,
+      97,    88,   149,    90,    58,   171,    60,    61,   195,    97,
+      55,   619,   620,   145,   146,    97,    44,   625,    97,    91,
+       7,   109,    97,   145,   146,   151,   152,    97,   410,   637,
+     409,   177,   203,   152,   109,    88,   202,   170,   186,   373,
+     186,    89,   556,   169,   171,   171,   171,   166,   167,   380,
+     647,    89,   171,   520,   521,   522,   523,   524,   525,    88,
+     151,    90,   529,   380,   531,   532,   142,   664,   582,   536,
+      63,   147,   151,   152,   128,   202,   363,    97,   169,   203,
+     367,    89,   369,   137,   466,   139,    62,    63,   145,   146,
+       8,    90,   171,   701,   702,   703,   704,   705,    91,   707,
+     205,    39,    40,   711,   202,   713,   714,    39,    40,   717,
+      97,   168,    24,    51,    88,    91,    28,    29,   172,    51,
+      58,   197,   193,    97,    56,   738,    58,    41,    88,    89,
+      97,   118,    97,     3,   601,   122,   123,   124,   125,   126,
+      32,    33,   109,   638,   109,   132,   133,    41,   643,   145,
+     146,   618,   140,   141,   152,   622,   764,    49,    88,   626,
+      41,   628,   629,   499,   631,   152,   774,    97,   776,    39,
+      40,   779,   168,   781,   782,   783,   789,   790,   791,   646,
+     788,    51,    52,    16,   171,   145,   146,   174,    58,    41,
+      60,    61,   110,   111,   112,   113,   114,   115,   116,   117,
+     198,   199,   200,   201,   507,   411,   509,   423,    15,    16,
+      90,    97,    88,   821,   550,    41,   432,    88,    25,    26,
+      27,    97,   830,   109,    62,    63,    97,   530,    60,    61,
+      62,    63,   448,    88,    89,   538,   195,   175,   176,   706,
+     848,    24,   578,   175,   176,    28,    29,    96,    55,   552,
+      25,    26,   468,    91,   862,    95,   723,    39,   128,    91,
+      92,   467,    97,    60,    61,    62,    63,   137,    10,   139,
+      88,    89,   767,   768,   769,   770,   771,    50,   773,   162,
+     163,   164,   165,    56,    89,   780,    59,    91,    92,    93,
+      94,    97,   498,    90,    91,    92,   763,   765,   157,   158,
+     159,   160,    56,   639,   541,   202,   543,   747,   748,   749,
+     750,   751,   752,   753,   754,   755,   756,   812,   191,   786,
+     188,   189,    60,    61,    62,    63,    88,    89,   823,   824,
+     825,    37,   827,   828,   829,    88,    89,   832,   153,   154,
+     155,   156,   202,   549,   129,   130,   131,   120,   121,   586,
+     171,    50,    90,    91,    92,    25,    26,    56,    97,   854,
+      59,    46,    47,    48,    97,    98,   861,   198,   199,   698,
+     698,    89,   145,   146,    89,   148,    32,    33,   151,   118,
+      89,   876,    89,   122,   123,   124,   125,   126,    89,   884,
+     183,   184,   185,   132,   133,   168,   169,   145,   146,   636,
+     173,   174,   175,    89,   177,    88,   179,    89,   181,   182,
+      58,   607,   814,   815,   187,   188,   189,   190,   733,   734,
+     735,   120,   121,    50,    60,    61,    62,    63,   180,    56,
+     203,    35,    59,   202,    97,    88,    60,    61,    62,    63,
+     879,   880,   881,   880,   881,    23,   145,   146,    97,   148,
+     150,    97,   151,    43,    90,    91,    92,   141,   192,   122,
+     123,   124,   125,   126,   127,     3,    90,    91,    92,   168,
+     169,   134,   135,   136,   173,   174,   175,    97,   177,   170,
+     179,   170,   181,   182,   151,   190,    50,    88,   187,   188,
+     189,   190,    56,   120,   121,    59,    45,    60,    61,    62,
+      63,    39,    40,   193,   203,    44,    97,   149,    60,    61,
+      62,    63,    97,    51,    52,    97,    97,    97,   145,   146,
+      58,   148,    60,    61,   151,   153,    88,    90,    91,    92,
+      88,   122,   123,   124,   125,   126,   127,     3,    90,    91,
+      92,   168,   169,   134,   135,   136,   173,   174,   175,    97,
+     177,   161,   179,    53,   181,   182,   120,   121,    50,    35,
+     187,   188,   189,   190,    56,    89,    45,    59,    97,    97,
+      97,    97,     5,    39,    40,    97,   203,    60,    61,    62,
+      63,   145,   146,     3,   148,    51,    52,   151,    59,    97,
+     128,    59,    58,    97,    60,    61,    97,    36,   187,   137,
+       3,   139,   178,    97,   168,   169,    35,     5,    91,   173,
+     174,   175,   153,   177,     5,   179,    97,   181,   182,    39,
+      40,    88,    97,   187,   188,   189,   190,    88,   120,   121,
+       5,    51,    52,    98,    98,    98,    39,    40,    58,   203,
+      60,    61,    98,     5,     5,    35,    98,     5,    51,    52,
+       5,    97,     5,   145,   146,    58,   148,    60,    61,   151,
+      98,    98,   128,     3,    56,    89,    89,    89,   204,    88,
+      88,   137,    89,   139,    89,    88,   168,   169,    88,     4,
+      88,   173,   174,   175,     5,   177,     5,   179,     5,   181,
+     182,     5,     5,     5,     5,   187,   188,   189,   190,    39,
+      40,    60,    61,    62,    63,     5,     5,     5,   128,    88,
+      97,    51,    52,    60,    61,    62,    63,   137,    58,   139,
+      60,    61,    57,    88,    88,    88,    18,   138,    88,   143,
+       5,    90,    91,    92,   137,    89,   139,    88,     3,    89,
+     194,     5,     5,    90,    91,    92,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+      86,    87,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,     5,     5,     5,     5,   153,    97,     5,   196,
+       6,     5,    89,    88,     5,    97,    97,   137,     5,   139,
+       5,    97,     5,    97,    97,    88,    97,    97,    97,    97,
+      97,    97,    97,     5,    88,     5,    98,    98,    98,    98,
+      98,    98,    98,    35,   144,    98,    98,    98,    11,    74,
+      97,   282,   736,   390,   474,    60,   454,   545,   587,   109,
+     864,   805,     1,   285,   214,   334,   380,   526,   343,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   143
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint16 yystos[] =
+{
+       0,     8,   110,   111,   112,   113,   114,   115,   116,   117,
+     207,   208,   209,   226,   227,   229,   230,   231,   232,   233,
+     234,   235,   236,   237,   241,   242,   243,   268,   269,   270,
+     271,   272,   273,   274,   275,     9,    11,    13,    14,    17,
+      30,    31,    34,    38,    51,    53,   142,   147,   197,   318,
+      95,    95,    95,    95,    95,    95,    95,    95,     0,   209,
+     210,   212,   214,   216,     3,    39,    40,    52,    58,    60,
+      61,   128,   137,   139,   218,   219,   276,   277,   278,   286,
+     288,   305,   314,   317,   318,   319,   325,   326,   327,   328,
+     220,   222,   224,    12,    89,    97,    88,   244,   245,    44,
+      89,    89,    97,    89,    90,   202,   140,   141,   193,   238,
+     239,    53,   171,   202,   322,    38,    41,   170,    41,    41,
+      41,    16,    41,    41,     3,   211,   276,   277,   278,   286,
+     287,   305,   306,   307,   308,   314,   317,   325,   326,   327,
+     328,   332,     3,   172,   213,   276,   277,   278,   305,   314,
+     317,   325,   326,   327,   328,   347,   356,   362,   363,   365,
+     366,   367,     3,   215,   276,   277,   278,   305,   314,   317,
+     325,   326,   327,   328,   358,   359,   360,   362,   366,   367,
+       3,   217,   276,   277,   278,   305,   314,   317,   325,   326,
+     327,   328,   347,   362,   366,   367,     7,    97,   171,    88,
+      89,   279,   281,   279,    90,   279,    97,   195,   195,   129,
+     130,   131,    96,    95,   329,   330,   219,   171,   202,   322,
+       3,   221,   276,   277,   278,   314,   317,   325,   327,   328,
+     335,   223,   276,   277,   278,   305,   314,   317,   325,   326,
+     327,   328,   347,   362,   366,   367,     3,   225,   276,   277,
+     278,   305,   314,   317,   325,   327,   328,   331,    10,    39,
+     228,    44,   149,   283,    56,   245,   312,    97,   162,   163,
+     164,   165,   361,    91,    92,    93,    94,   323,   324,    89,
+      97,   312,   239,   191,   240,   202,   202,    50,    56,    59,
+     120,   121,   145,   146,   148,   151,   168,   169,   173,   174,
+     175,   177,   179,   181,   182,   187,   188,   189,   190,   320,
+     321,    37,   369,    89,    89,    88,    89,    89,    89,    89,
+      88,    89,    89,     7,   118,   122,   123,   124,   125,   126,
+     132,   133,   152,   174,   333,   334,   338,   341,   343,   344,
+     345,     7,   151,   152,   169,   171,   364,   171,   364,     7,
+     152,   166,   167,   152,    42,   177,   186,   289,    58,   180,
+      56,   145,   146,   280,   281,   282,   310,   280,   310,   280,
+     310,    35,   330,   202,   320,   369,   127,   134,   135,   136,
+     336,   337,   339,   340,   341,   342,   344,   120,    88,    23,
+      97,    88,    90,   150,   284,    97,    43,   285,   246,   203,
+     324,   141,   157,   158,   159,   160,   294,   240,   192,   323,
+     320,   203,   321,    97,    54,   291,   152,   198,   199,   200,
+     201,   348,   348,   348,   348,   348,   188,   189,   348,    97,
+     334,   353,   348,    20,    21,   145,   146,   168,   357,   348,
+     151,   169,   357,   348,   170,   170,   190,   348,   348,    88,
+      45,   368,   193,    44,   290,    97,   353,    97,    88,    97,
+      88,    97,   282,   310,   310,   310,   320,   203,   348,   337,
+     353,   348,   348,    97,   283,    88,   294,   153,    88,    15,
+      16,    25,    26,    27,    55,   247,   248,   251,   252,   253,
+     254,   255,   256,   260,    97,   161,   293,   203,   203,   322,
+      35,    89,    45,   292,    97,    97,   109,   346,    97,   346,
+      97,    97,   353,   353,    97,    35,    97,     5,    97,   346,
+      88,    97,    88,    97,    97,    59,    97,   353,   353,    59,
+      97,    88,    89,    88,    89,   353,    97,    97,   346,   178,
+      36,   309,   187,   315,    97,   292,    35,     5,   153,   203,
+     322,    97,   346,     5,    97,    97,   284,   293,    19,    20,
+      22,    88,    89,   205,    88,    27,    55,    27,    55,    25,
+      26,    25,    26,   249,    24,    28,    29,    88,   322,   369,
+      46,    47,    48,    32,    33,    49,   295,   296,   297,    98,
+     361,    98,   361,    98,    98,     5,     5,   153,   154,   155,
+     156,   349,    35,    39,    40,    51,    58,   175,   176,   350,
+     351,   353,   353,   353,   353,   353,    33,   353,   349,     5,
+       5,   353,   361,   353,   353,     5,    98,   353,    98,   361,
+      97,   312,   198,   199,   316,   312,   295,     5,   351,   322,
+     369,    98,   361,   351,    98,    56,   311,   294,    89,    89,
+      89,   204,   261,    88,    24,    28,    29,   250,   257,   258,
+     259,    89,    89,   369,   294,    88,    88,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,   312,   297,   351,   351,   353,   279,     4,
+     355,     5,     5,     5,     5,     5,    88,     5,   353,   351,
+     351,     5,   353,     5,     5,   351,   353,     5,   353,   353,
+     353,    88,    57,   313,   312,    56,   351,   355,   369,   355,
+      97,   353,   293,   262,   263,   264,    88,    88,   265,   266,
+      18,   267,    89,    89,   293,   138,   300,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   303,   304,   194,
+     298,   143,   302,   313,     5,   280,     3,   351,   351,   351,
+     351,   351,   353,   351,     5,   351,     5,   351,   351,     5,
+     351,     5,     5,     5,    97,   353,   313,   153,     5,   265,
+     265,   265,   267,   266,    89,   348,   348,   348,   348,   348,
+     348,   348,   348,   348,   348,     6,    88,    90,   196,   299,
+      88,   353,   351,   183,   184,   185,   355,   355,   355,   355,
+     355,     5,   355,   351,   351,   351,   355,   351,   351,   351,
+       5,   353,   351,    59,   144,   301,    97,    97,    97,    97,
+      97,    97,    97,    97,    97,    97,   304,    97,     5,   355,
+      97,   354,   354,   354,   351,   355,   355,   355,   355,   355,
+     355,   351,     5,   355,    88,    88,    98,    98,    98,    98,
+      98,    98,    98,    98,    98,    98,   351,    35,    97,     5,
+       5,     5,   355,   355,   351,   301,   355,    35,   350,   352,
+     352,   352,   355
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK (1);						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (YYID (0))
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (YYID (N))                                                    \
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+	break;
+    }
+}
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*-------------------------.
+| yyparse or yypush_parse.  |
+`-------------------------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
+
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack.  Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	yytype_int16 *yyss1 = yyss;
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	yytype_int16 *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 152:
+
+/* Line 1455 of yacc.c  */
+#line 494 "src/p.y"
+    {
+                   mailset.events = Event_All;
+                    addmail((yyvsp[(2) - (4)].string), &mailset, &Run.maillist);
+                  }
+    break;
+
+  case 153:
+
+/* Line 1455 of yacc.c  */
+#line 498 "src/p.y"
+    {
+                    addmail((yyvsp[(2) - (7)].string), &mailset, &Run.maillist);
+                  }
+    break;
+
+  case 154:
+
+/* Line 1455 of yacc.c  */
+#line 501 "src/p.y"
+    {
+                   mailset.events = ~mailset.events;
+                   addmail((yyvsp[(2) - (8)].string), &mailset, &Run.maillist);
+                  }
+    break;
+
+  case 155:
+
+/* Line 1455 of yacc.c  */
+#line 507 "src/p.y"
+    {
+                    if (!Run.isdaemon || ihp.daemon) {
+                      ihp.daemon     = TRUE;
+                      Run.isdaemon   = TRUE;
+                      Run.polltime   = (yyvsp[(3) - (4)].number);
+                      Run.startdelay = (yyvsp[(4) - (4)].number);
+                    }
+                  }
+    break;
+
+  case 156:
+
+/* Line 1455 of yacc.c  */
+#line 517 "src/p.y"
+    { (yyval.number) = START_DELAY; }
+    break;
+
+  case 157:
+
+/* Line 1455 of yacc.c  */
+#line 518 "src/p.y"
+    { (yyval.number) = (yyvsp[(3) - (3)].number); }
+    break;
+
+  case 158:
+
+/* Line 1455 of yacc.c  */
+#line 521 "src/p.y"
+    {
+                    Run.expectbuffer = (yyvsp[(3) - (4)].number) * (yyvsp[(4) - (4)].number);
+                  }
+    break;
+
+  case 159:
+
+/* Line 1455 of yacc.c  */
+#line 526 "src/p.y"
+    {
+                    Run.init = TRUE;
+                  }
+    break;
+
+  case 160:
+
+/* Line 1455 of yacc.c  */
+#line 531 "src/p.y"
+    {
+                  #ifdef OPENSSL_FIPS
+                    Run.fipsEnabled = TRUE;
+                  #endif
+                  }
+    break;
+
+  case 161:
+
+/* Line 1455 of yacc.c  */
+#line 538 "src/p.y"
+    {
+                   if (!Run.logfile || ihp.logfile) {
+                     ihp.logfile = TRUE;
+                     setlogfile((yyvsp[(3) - (3)].string));
+                     Run.use_syslog = FALSE;
+                     Run.dolog =TRUE;
+                   }
+                  }
+    break;
+
+  case 162:
+
+/* Line 1455 of yacc.c  */
+#line 546 "src/p.y"
+    {
+                    setsyslog(NULL);
+                  }
+    break;
+
+  case 163:
+
+/* Line 1455 of yacc.c  */
+#line 549 "src/p.y"
+    {
+                    setsyslog((yyvsp[(5) - (5)].string)); FREE((yyvsp[(5) - (5)].string));
+                  }
+    break;
+
+  case 164:
+
+/* Line 1455 of yacc.c  */
+#line 554 "src/p.y"
+    {
+                    Run.eventlist_dir = (yyvsp[(4) - (4)].string);
+                  }
+    break;
+
+  case 165:
+
+/* Line 1455 of yacc.c  */
+#line 557 "src/p.y"
+    {
+                    Run.eventlist_dir = (yyvsp[(4) - (6)].string);
+                    Run.eventlist_slots = (yyvsp[(6) - (6)].number);
+                  }
+    break;
+
+  case 166:
+
+/* Line 1455 of yacc.c  */
+#line 561 "src/p.y"
+    {
+                    Run.eventlist_dir = Str_dup(MYEVENTLISTBASE);
+                    Run.eventlist_slots = (yyvsp[(4) - (4)].number);
+                  }
+    break;
+
+  case 167:
+
+/* Line 1455 of yacc.c  */
+#line 567 "src/p.y"
+    {
+                    Run.idfile = (yyvsp[(3) - (3)].string);
+                  }
+    break;
+
+  case 168:
+
+/* Line 1455 of yacc.c  */
+#line 572 "src/p.y"
+    {
+                    Run.statefile = (yyvsp[(3) - (3)].string);
+                  }
+    break;
+
+  case 169:
+
+/* Line 1455 of yacc.c  */
+#line 577 "src/p.y"
+    {
+                   if (!Run.pidfile || ihp.pidfile) {
+                     ihp.pidfile = TRUE;
+                     setpidfile((yyvsp[(3) - (3)].string));
+                   }
+                 }
+    break;
+
+  case 173:
+
+/* Line 1455 of yacc.c  */
+#line 592 "src/p.y"
+    {
+                    check_hostname(((yyvsp[(1) - (4)].url))->hostname);
+                    addmmonit((yyvsp[(1) - (4)].url), (yyvsp[(2) - (4)].number), (yyvsp[(3) - (4)].number), (yyvsp[(4) - (4)].string)); 
+                  }
+    break;
+
+  case 175:
+
+/* Line 1455 of yacc.c  */
+#line 599 "src/p.y"
+    {
+                    Run.dommonitcredentials = FALSE;
+                  }
+    break;
+
+  case 176:
+
+/* Line 1455 of yacc.c  */
+#line 604 "src/p.y"
+    {
+                   Run.mailserver_timeout = (yyvsp[(4) - (5)].number);
+                   Run.mail_hostname = (yyvsp[(5) - (5)].string);
+                  }
+    break;
+
+  case 177:
+
+/* Line 1455 of yacc.c  */
+#line 610 "src/p.y"
+    {
+                   Run.MailFormat.from    = mailset.from    ?  mailset.from    : Str_dup(ALERT_FROM);
+                   Run.MailFormat.replyto = mailset.replyto ?  mailset.replyto : NULL;
+                   Run.MailFormat.subject = mailset.subject ?  mailset.subject : Str_dup(ALERT_SUBJECT);
+                   Run.MailFormat.message = mailset.message ?  mailset.message : Str_dup(ALERT_MESSAGE);
+                   reset_mailset();
+                 }
+    break;
+
+  case 178:
+
+/* Line 1455 of yacc.c  */
+#line 619 "src/p.y"
+    {
+                   Run.dohttpd = TRUE;
+                   Run.httpdport = (yyvsp[(4) - (5)].number);
+                 }
+    break;
+
+  case 181:
+
+/* Line 1455 of yacc.c  */
+#line 629 "src/p.y"
+    {
+                    /* Restore the current text overriden by lookahead */
+                    FREE(argyytext);
+                    argyytext = Str_dup((yyvsp[(1) - (5)].string));
+
+                    check_hostname((yyvsp[(1) - (5)].string));
+                    mailserverset.host = (yyvsp[(1) - (5)].string);
+                    mailserverset.username = (yyvsp[(2) - (5)].string);
+                    mailserverset.password = (yyvsp[(3) - (5)].string);
+                    mailserverset.ssl.version = (yyvsp[(4) - (5)].number);
+                    if (mailserverset.ssl.version != SSL_VERSION_NONE) {
+                      mailserverset.ssl.use_ssl = TRUE;
+                      if (mailserverset.ssl.version == SSL_VERSION_SSLV2 ||
+                         mailserverset.ssl.version == SSL_VERSION_SSLV3)
+                         mailserverset.port = PORT_SMTPS;
+                      mailserverset.ssl.certmd5 = (yyvsp[(5) - (5)].string);
+                    }
+                    addmailserver(&mailserverset);
+                  }
+    break;
+
+  case 182:
+
+/* Line 1455 of yacc.c  */
+#line 648 "src/p.y"
+    {
+                    /* Restore the current text overriden by lookahead */
+                    FREE(argyytext);
+                    argyytext = Str_dup((yyvsp[(1) - (7)].string));
+
+                    check_hostname((yyvsp[(1) - (7)].string));
+                    mailserverset.host = (yyvsp[(1) - (7)].string);
+                    mailserverset.port = (yyvsp[(3) - (7)].number);
+                    mailserverset.username = (yyvsp[(4) - (7)].string);
+                    mailserverset.password = (yyvsp[(5) - (7)].string);
+                    mailserverset.ssl.version = (yyvsp[(6) - (7)].number);
+                    if (mailserverset.ssl.version != SSL_VERSION_NONE) {
+                      mailserverset.ssl.use_ssl = TRUE;
+                      mailserverset.ssl.certmd5 = (yyvsp[(7) - (7)].string);
+                    }
+                    addmailserver(&mailserverset);
+                  }
+    break;
+
+  case 189:
+
+/* Line 1455 of yacc.c  */
+#line 677 "src/p.y"
+    { Run.httpdssl = FALSE; }
+    break;
+
+  case 190:
+
+/* Line 1455 of yacc.c  */
+#line 678 "src/p.y"
+    {
+                    Run.httpdssl = TRUE;                   
+                    if (! have_ssl())
+                      yyerror("SSL is not supported");
+                    else if (! Run.httpsslpem)
+                      yyerror("SSL server PEM file is required (pemfile option)");
+                    else if (! file_checkStat(Run.httpsslpem, "SSL server PEM file", S_IRWXU))
+                      yyerror("SSL server PEM file permissions check failed");
+                  }
+    break;
+
+  case 201:
+
+/* Line 1455 of yacc.c  */
+#line 705 "src/p.y"
+    { FREE((yyvsp[(3) - (3)].string)); }
+    break;
+
+  case 202:
+
+/* Line 1455 of yacc.c  */
+#line 706 "src/p.y"
+    { FREE((yyvsp[(3) - (3)].string)); }
+    break;
+
+  case 204:
+
+/* Line 1455 of yacc.c  */
+#line 710 "src/p.y"
+    { Run.httpdsig = TRUE; }
+    break;
+
+  case 205:
+
+/* Line 1455 of yacc.c  */
+#line 711 "src/p.y"
+    { Run.httpdsig = FALSE; }
+    break;
+
+  case 210:
+
+/* Line 1455 of yacc.c  */
+#line 722 "src/p.y"
+    { Run.bind_addr = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 211:
+
+/* Line 1455 of yacc.c  */
+#line 725 "src/p.y"
+    {
+                    Run.httpsslpem = (yyvsp[(2) - (2)].string);
+                  }
+    break;
+
+  case 212:
+
+/* Line 1455 of yacc.c  */
+#line 730 "src/p.y"
+    {
+                    Run.httpsslclientpem = (yyvsp[(2) - (2)].string); 
+                    Run.clientssl = TRUE;
+                    if (!file_checkStat(Run.httpsslclientpem, "SSL client PEM file", S_IRWXU | S_IRGRP | S_IROTH))
+                      yyerror2("SSL client PEM file has too loose permissions");
+                  }
+    break;
+
+  case 213:
+
+/* Line 1455 of yacc.c  */
+#line 738 "src/p.y"
+    {   
+                    Run.allowselfcert = TRUE;
+                  }
+    break;
+
+  case 214:
+
+/* Line 1455 of yacc.c  */
+#line 743 "src/p.y"
+    {
+                    addcredentials((yyvsp[(2) - (5)].string),(yyvsp[(4) - (5)].string), DIGEST_CLEARTEXT, (yyvsp[(5) - (5)].number));
+                  }
+    break;
+
+  case 215:
+
+/* Line 1455 of yacc.c  */
+#line 746 "src/p.y"
+    {
+#ifdef HAVE_LIBPAM
+                    addpamauth((yyvsp[(3) - (4)].string), (yyvsp[(4) - (4)].number));
+#else
+                    yyerror("PAM is not supported");
+                    FREE((yyvsp[(3) - (4)].string));
+#endif
+                  }
+    break;
+
+  case 216:
+
+/* Line 1455 of yacc.c  */
+#line 754 "src/p.y"
+    {
+                    addhtpasswdentry((yyvsp[(2) - (2)].string), NULL, DIGEST_CLEARTEXT);
+                    FREE((yyvsp[(2) - (2)].string));
+                  }
+    break;
+
+  case 217:
+
+/* Line 1455 of yacc.c  */
+#line 758 "src/p.y"
+    {
+                    addhtpasswdentry((yyvsp[(3) - (3)].string), NULL, DIGEST_CLEARTEXT);
+                    FREE((yyvsp[(3) - (3)].string));
+                  }
+    break;
+
+  case 218:
+
+/* Line 1455 of yacc.c  */
+#line 762 "src/p.y"
+    {
+                    addhtpasswdentry((yyvsp[(3) - (3)].string), NULL, DIGEST_MD5);
+                    FREE((yyvsp[(3) - (3)].string));
+                  }
+    break;
+
+  case 219:
+
+/* Line 1455 of yacc.c  */
+#line 766 "src/p.y"
+    {
+                    addhtpasswdentry((yyvsp[(3) - (3)].string), NULL, DIGEST_CRYPT);
+                    FREE((yyvsp[(3) - (3)].string));
+                  }
+    break;
+
+  case 220:
+
+/* Line 1455 of yacc.c  */
+#line 770 "src/p.y"
+    {
+                    htpasswd_file = (yyvsp[(2) - (2)].string);
+                    digesttype = CLEARTEXT;
+                  }
+    break;
+
+  case 221:
+
+/* Line 1455 of yacc.c  */
+#line 774 "src/p.y"
+    {
+                    FREE(htpasswd_file);
+                  }
+    break;
+
+  case 222:
+
+/* Line 1455 of yacc.c  */
+#line 777 "src/p.y"
+    {
+                    htpasswd_file = (yyvsp[(3) - (3)].string);
+                    digesttype = DIGEST_CLEARTEXT;
+                  }
+    break;
+
+  case 223:
+
+/* Line 1455 of yacc.c  */
+#line 781 "src/p.y"
+    {
+                    FREE(htpasswd_file);
+                  }
+    break;
+
+  case 224:
+
+/* Line 1455 of yacc.c  */
+#line 784 "src/p.y"
+    {
+                    htpasswd_file = (yyvsp[(3) - (3)].string);
+                    digesttype = DIGEST_MD5;
+                  }
+    break;
+
+  case 225:
+
+/* Line 1455 of yacc.c  */
+#line 788 "src/p.y"
+    {
+                    FREE(htpasswd_file);
+                  }
+    break;
+
+  case 226:
+
+/* Line 1455 of yacc.c  */
+#line 791 "src/p.y"
+    {
+                    htpasswd_file = (yyvsp[(3) - (3)].string);
+                    digesttype = DIGEST_CRYPT;
+                  }
+    break;
+
+  case 227:
+
+/* Line 1455 of yacc.c  */
+#line 795 "src/p.y"
+    {
+                    FREE(htpasswd_file);
+                  }
+    break;
+
+  case 228:
+
+/* Line 1455 of yacc.c  */
+#line 798 "src/p.y"
+    {
+                    if (! (add_net_allow((yyvsp[(2) - (2)].string)) || add_host_allow((yyvsp[(2) - (2)].string)))) {
+                      yyerror2("erroneous network or host identifier %s", (yyvsp[(2) - (2)].string)); 
+                    }
+                    FREE((yyvsp[(2) - (2)].string));
+                  }
+    break;
+
+  case 231:
+
+/* Line 1455 of yacc.c  */
+#line 810 "src/p.y"
+    { addhtpasswdentry(htpasswd_file, (yyvsp[(1) - (1)].string), digesttype);
+                           FREE((yyvsp[(1) - (1)].string)); }
+    break;
+
+  case 232:
+
+/* Line 1455 of yacc.c  */
+#line 814 "src/p.y"
+    { (yyval.number) = FALSE; }
+    break;
+
+  case 233:
+
+/* Line 1455 of yacc.c  */
+#line 815 "src/p.y"
+    { (yyval.number) = TRUE; }
+    break;
+
+  case 234:
+
+/* Line 1455 of yacc.c  */
+#line 818 "src/p.y"
+    {
+                    createservice(TYPE_PROCESS, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_process);
+                  }
+    break;
+
+  case 235:
+
+/* Line 1455 of yacc.c  */
+#line 821 "src/p.y"
+    {
+                    createservice(TYPE_PROCESS, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_process);
+                  }
+    break;
+
+  case 236:
+
+/* Line 1455 of yacc.c  */
+#line 824 "src/p.y"
+    {
+                    createservice(TYPE_PROCESS, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_process);
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = Str_dup((yyvsp[(4) - (4)].string));
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+    break;
+
+  case 237:
+
+/* Line 1455 of yacc.c  */
+#line 831 "src/p.y"
+    {
+                    createservice(TYPE_PROCESS, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_process);
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = Str_dup((yyvsp[(4) - (4)].string));
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+    break;
+
+  case 238:
+
+/* Line 1455 of yacc.c  */
+#line 840 "src/p.y"
+    {
+                    createservice(TYPE_FILE, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_file);
+                  }
+    break;
+
+  case 239:
+
+/* Line 1455 of yacc.c  */
+#line 845 "src/p.y"
+    {
+                    createservice(TYPE_FILESYSTEM, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_filesystem);
+                  }
+    break;
+
+  case 240:
+
+/* Line 1455 of yacc.c  */
+#line 850 "src/p.y"
+    {
+                    createservice(TYPE_DIRECTORY, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_directory);
+                  }
+    break;
+
+  case 241:
+
+/* Line 1455 of yacc.c  */
+#line 855 "src/p.y"
+    {
+                    check_hostname((yyvsp[(4) - (4)].string)); 
+                    createservice(TYPE_HOST, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_remote_host);
+                  }
+    break;
+
+  case 242:
+
+/* Line 1455 of yacc.c  */
+#line 861 "src/p.y"
+    {
+                    createservice(TYPE_SYSTEM, (yyvsp[(2) - (2)].string), Str_dup(""), check_system);
+                    hassystem = TRUE;
+                  }
+    break;
+
+  case 243:
+
+/* Line 1455 of yacc.c  */
+#line 867 "src/p.y"
+    {
+                    createservice(TYPE_FIFO, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_fifo);
+                  }
+    break;
+
+  case 244:
+
+/* Line 1455 of yacc.c  */
+#line 872 "src/p.y"
+    {
+                        check_exec((yyvsp[(4) - (4)].string));
+                        createservice(TYPE_PROGRAM, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].string), check_program);
+                  }
+    break;
+
+  case 245:
+
+/* Line 1455 of yacc.c  */
+#line 878 "src/p.y"
+    {
+                    addcommand(START, (yyvsp[(3) - (3)].number));
+                  }
+    break;
+
+  case 246:
+
+/* Line 1455 of yacc.c  */
+#line 881 "src/p.y"
+    {
+                    addcommand(START, (yyvsp[(4) - (4)].number));
+                  }
+    break;
+
+  case 247:
+
+/* Line 1455 of yacc.c  */
+#line 886 "src/p.y"
+    {
+                    addcommand(STOP, (yyvsp[(3) - (3)].number));
+                  }
+    break;
+
+  case 248:
+
+/* Line 1455 of yacc.c  */
+#line 889 "src/p.y"
+    {
+                    addcommand(STOP, (yyvsp[(4) - (4)].number));
+                  }
+    break;
+
+  case 249:
+
+/* Line 1455 of yacc.c  */
+#line 895 "src/p.y"
+    {
+                    addcommand(RESTART, (yyvsp[(3) - (3)].number));
+                  }
+    break;
+
+  case 250:
+
+/* Line 1455 of yacc.c  */
+#line 898 "src/p.y"
+    {
+                    addcommand(RESTART, (yyvsp[(4) - (4)].number));
+                  }
+    break;
+
+  case 255:
+
+/* Line 1455 of yacc.c  */
+#line 911 "src/p.y"
+    { addargument((yyvsp[(1) - (1)].string)); }
+    break;
+
+  case 256:
+
+/* Line 1455 of yacc.c  */
+#line 912 "src/p.y"
+    { addargument((yyvsp[(1) - (1)].string)); }
+    break;
+
+  case 257:
+
+/* Line 1455 of yacc.c  */
+#line 915 "src/p.y"
+    { addeuid( get_uid((yyvsp[(2) - (2)].string), 0) ); FREE((yyvsp[(2) - (2)].string)); }
+    break;
+
+  case 258:
+
+/* Line 1455 of yacc.c  */
+#line 916 "src/p.y"
+    { addegid( get_gid((yyvsp[(2) - (2)].string), 0) ); FREE((yyvsp[(2) - (2)].string)); }
+    break;
+
+  case 259:
+
+/* Line 1455 of yacc.c  */
+#line 917 "src/p.y"
+    { addeuid( get_uid(NULL, (yyvsp[(2) - (2)].number)) ); }
+    break;
+
+  case 260:
+
+/* Line 1455 of yacc.c  */
+#line 918 "src/p.y"
+    { addegid( get_gid(NULL, (yyvsp[(2) - (2)].number)) ); }
+    break;
+
+  case 261:
+
+/* Line 1455 of yacc.c  */
+#line 921 "src/p.y"
+    { (yyval.string) = NULL; }
+    break;
+
+  case 262:
+
+/* Line 1455 of yacc.c  */
+#line 922 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 263:
+
+/* Line 1455 of yacc.c  */
+#line 923 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 264:
+
+/* Line 1455 of yacc.c  */
+#line 926 "src/p.y"
+    { (yyval.string) = NULL; }
+    break;
+
+  case 265:
+
+/* Line 1455 of yacc.c  */
+#line 927 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 266:
+
+/* Line 1455 of yacc.c  */
+#line 930 "src/p.y"
+    { (yyval.string) = NULL; }
+    break;
+
+  case 267:
+
+/* Line 1455 of yacc.c  */
+#line 931 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 268:
+
+/* Line 1455 of yacc.c  */
+#line 935 "src/p.y"
+    {
+                    portset.timeout = (yyvsp[(7) - (12)].number);
+                    portset.retry = (yyvsp[(8) - (12)].number);
+                    addeventaction(&(portset).action, (yyvsp[(11) - (12)].number), (yyvsp[(12) - (12)].number));
+                    addport(&portset);
+                  }
+    break;
+
+  case 269:
+
+/* Line 1455 of yacc.c  */
+#line 942 "src/p.y"
+    { 
+                    prepare_urlrequest((yyvsp[(4) - (11)].url));
+                    portset.timeout = (yyvsp[(6) - (11)].number);
+                    portset.retry = (yyvsp[(7) - (11)].number);
+                    addeventaction(&(portset).action, (yyvsp[(10) - (11)].number), (yyvsp[(11) - (11)].number));
+                    addport(&portset);
+                  }
+    break;
+
+  case 270:
+
+/* Line 1455 of yacc.c  */
+#line 952 "src/p.y"
+    {
+                   portset.timeout = (yyvsp[(6) - (11)].number);
+                   portset.retry = (yyvsp[(7) - (11)].number);
+                   addeventaction(&(portset).action, (yyvsp[(10) - (11)].number), (yyvsp[(11) - (11)].number));
+                   addport(&portset);
+                  }
+    break;
+
+  case 271:
+
+/* Line 1455 of yacc.c  */
+#line 961 "src/p.y"
+    {
+                   icmpset.type = (yyvsp[(4) - (10)].number);
+                   icmpset.count = (yyvsp[(5) - (10)].number);
+                   icmpset.timeout = (yyvsp[(6) - (10)].number);
+                   addeventaction(&(icmpset).action, (yyvsp[(9) - (10)].number), (yyvsp[(10) - (10)].number));
+                   addicmp(&icmpset);
+                  }
+    break;
+
+  case 272:
+
+/* Line 1455 of yacc.c  */
+#line 970 "src/p.y"
+    {
+                    if (current->type == TYPE_HOST)
+                      portset.hostname = Str_dup(current->path);
+                    else
+                      portset.hostname = Str_dup(LOCALHOST);
+                  }
+    break;
+
+  case 273:
+
+/* Line 1455 of yacc.c  */
+#line 976 "src/p.y"
+    { check_hostname((yyvsp[(2) - (2)].string)); portset.hostname = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 274:
+
+/* Line 1455 of yacc.c  */
+#line 979 "src/p.y"
+    { portset.port = (yyvsp[(2) - (2)].number); portset.family = AF_INET; }
+    break;
+
+  case 275:
+
+/* Line 1455 of yacc.c  */
+#line 982 "src/p.y"
+    {
+                    portset.pathname = (yyvsp[(2) - (2)].string); portset.family = AF_UNIX;
+                  }
+    break;
+
+  case 276:
+
+/* Line 1455 of yacc.c  */
+#line 987 "src/p.y"
+    {
+                    portset.type = SOCK_STREAM;
+                  }
+    break;
+
+  case 277:
+
+/* Line 1455 of yacc.c  */
+#line 990 "src/p.y"
+    {
+                    portset.type = SOCK_STREAM;
+                  }
+    break;
+
+  case 278:
+
+/* Line 1455 of yacc.c  */
+#line 993 "src/p.y"
+    {
+                    portset.type = SOCK_STREAM;
+                    portset.SSL.use_ssl = TRUE;
+                    portset.SSL.version = (yyvsp[(3) - (4)].number);
+                    if (portset.SSL.version == SSL_VERSION_NONE)
+                      portset.SSL.version = SSL_VERSION_AUTO;
+                    portset.SSL.certmd5 = (yyvsp[(4) - (4)].string);
+                  }
+    break;
+
+  case 279:
+
+/* Line 1455 of yacc.c  */
+#line 1001 "src/p.y"
+    {
+                    portset.type = SOCK_DGRAM;
+                  }
+    break;
+
+  case 280:
+
+/* Line 1455 of yacc.c  */
+#line 1006 "src/p.y"
+    { (yyval.string) = NULL; }
+    break;
+
+  case 281:
+
+/* Line 1455 of yacc.c  */
+#line 1007 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 282:
+
+/* Line 1455 of yacc.c  */
+#line 1010 "src/p.y"
+    { (yyval.number) = SSL_VERSION_NONE; }
+    break;
+
+  case 283:
+
+/* Line 1455 of yacc.c  */
+#line 1011 "src/p.y"
+    { (yyval.number) = SSL_VERSION_SSLV2; }
+    break;
+
+  case 284:
+
+/* Line 1455 of yacc.c  */
+#line 1012 "src/p.y"
+    { (yyval.number) = SSL_VERSION_SSLV3; }
+    break;
+
+  case 285:
+
+/* Line 1455 of yacc.c  */
+#line 1013 "src/p.y"
+    { (yyval.number) = SSL_VERSION_TLS; }
+    break;
+
+  case 286:
+
+/* Line 1455 of yacc.c  */
+#line 1014 "src/p.y"
+    { (yyval.number) = SSL_VERSION_AUTO; }
+    break;
+
+  case 287:
+
+/* Line 1455 of yacc.c  */
+#line 1017 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_DEFAULT);
+                  }
+    break;
+
+  case 288:
+
+/* Line 1455 of yacc.c  */
+#line 1020 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_APACHESTATUS);
+                  }
+    break;
+
+  case 289:
+
+/* Line 1455 of yacc.c  */
+#line 1023 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_DEFAULT);
+                  }
+    break;
+
+  case 290:
+
+/* Line 1455 of yacc.c  */
+#line 1026 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_DNS);
+                  }
+    break;
+
+  case 291:
+
+/* Line 1455 of yacc.c  */
+#line 1029 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_DWP);
+                  }
+    break;
+
+  case 292:
+
+/* Line 1455 of yacc.c  */
+#line 1032 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_FTP);
+                  }
+    break;
+
+  case 293:
+
+/* Line 1455 of yacc.c  */
+#line 1035 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_HTTP);
+                  }
+    break;
+
+  case 294:
+
+/* Line 1455 of yacc.c  */
+#line 1038 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_IMAP);
+                  }
+    break;
+
+  case 295:
+
+/* Line 1455 of yacc.c  */
+#line 1041 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_CLAMAV);
+                  }
+    break;
+
+  case 296:
+
+/* Line 1455 of yacc.c  */
+#line 1044 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_LDAP2);
+                  }
+    break;
+
+  case 297:
+
+/* Line 1455 of yacc.c  */
+#line 1047 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_LDAP3);
+                  }
+    break;
+
+  case 298:
+
+/* Line 1455 of yacc.c  */
+#line 1050 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_MYSQL);
+                  }
+    break;
+
+  case 299:
+
+/* Line 1455 of yacc.c  */
+#line 1053 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_SIP);
+                  }
+    break;
+
+  case 300:
+
+/* Line 1455 of yacc.c  */
+#line 1056 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_NNTP);
+                  }
+    break;
+
+  case 301:
+
+/* Line 1455 of yacc.c  */
+#line 1059 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_NTP3);
+                    portset.type = SOCK_DGRAM;
+                  }
+    break;
+
+  case 302:
+
+/* Line 1455 of yacc.c  */
+#line 1063 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_POSTFIXPOLICY);
+                  }
+    break;
+
+  case 303:
+
+/* Line 1455 of yacc.c  */
+#line 1066 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_POP);
+                  }
+    break;
+
+  case 304:
+
+/* Line 1455 of yacc.c  */
+#line 1069 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_SMTP);
+                  }
+    break;
+
+  case 305:
+
+/* Line 1455 of yacc.c  */
+#line 1072 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_SSH);
+                  }
+    break;
+
+  case 306:
+
+/* Line 1455 of yacc.c  */
+#line 1075 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_RDATE);
+                  }
+    break;
+
+  case 307:
+
+/* Line 1455 of yacc.c  */
+#line 1078 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_RSYNC);
+                  }
+    break;
+
+  case 308:
+
+/* Line 1455 of yacc.c  */
+#line 1081 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_TNS);
+                  }
+    break;
+
+  case 309:
+
+/* Line 1455 of yacc.c  */
+#line 1084 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_PGSQL);
+                  }
+    break;
+
+  case 310:
+
+/* Line 1455 of yacc.c  */
+#line 1087 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_LMTP);
+                  }
+    break;
+
+  case 311:
+
+/* Line 1455 of yacc.c  */
+#line 1090 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_GPS);
+                  }
+    break;
+
+  case 312:
+
+/* Line 1455 of yacc.c  */
+#line 1093 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_RADIUS);
+                  }
+    break;
+
+  case 313:
+
+/* Line 1455 of yacc.c  */
+#line 1096 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_MEMCACHE);
+                  }
+    break;
+
+  case 314:
+
+/* Line 1455 of yacc.c  */
+#line 1099 "src/p.y"
+    {
+                    portset.protocol = Protocol_get(Protocol_GENERIC);
+                  }
+    break;
+
+  case 317:
+
+/* Line 1455 of yacc.c  */
+#line 1108 "src/p.y"
+    { addgeneric(&portset, (yyvsp[(2) - (2)].string), NULL); FREE((yyvsp[(2) - (2)].string));}
+    break;
+
+  case 318:
+
+/* Line 1455 of yacc.c  */
+#line 1109 "src/p.y"
+    { addgeneric(&portset, NULL, (yyvsp[(2) - (2)].string)); FREE((yyvsp[(2) - (2)].string));}
+    break;
+
+  case 320:
+
+/* Line 1455 of yacc.c  */
+#line 1113 "src/p.y"
+    {
+                    portset.request = (yyvsp[(2) - (2)].string);
+                  }
+    break;
+
+  case 321:
+
+/* Line 1455 of yacc.c  */
+#line 1116 "src/p.y"
+    {
+                    portset.request = (yyvsp[(2) - (2)].string);
+                  }
+    break;
+
+  case 323:
+
+/* Line 1455 of yacc.c  */
+#line 1122 "src/p.y"
+    {
+                     portset.maxforward = verifyMaxForward((yyvsp[(2) - (2)].number)); 
+                   }
+    break;
+
+  case 325:
+
+/* Line 1455 of yacc.c  */
+#line 1128 "src/p.y"
+    { 
+                    portset.request = Util_urlEncode((yyvsp[(2) - (3)].string)); 
+                    FREE((yyvsp[(2) - (3)].string)); 
+                  }
+    break;
+
+  case 326:
+
+/* Line 1455 of yacc.c  */
+#line 1132 "src/p.y"
+    {
+                    portset.request = Util_urlEncode((yyvsp[(2) - (5)].string));
+                    FREE((yyvsp[(2) - (5)].string));
+                    portset.request_checksum = (yyvsp[(4) - (5)].string);
+                  }
+    break;
+
+  case 328:
+
+/* Line 1455 of yacc.c  */
+#line 1140 "src/p.y"
+    {
+                    portset.request_hostheader = (yyvsp[(2) - (2)].string);
+                  }
+    break;
+
+  case 329:
+
+/* Line 1455 of yacc.c  */
+#line 1145 "src/p.y"
+    { 
+                    portset.request = (yyvsp[(2) - (2)].string); 
+                  }
+    break;
+
+  case 332:
+
+/* Line 1455 of yacc.c  */
+#line 1154 "src/p.y"
+    { 
+                    portset.ApacheStatus.loglimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.loglimit = (int)(yyvsp[(3) - (4)].number); 
+                  }
+    break;
+
+  case 333:
+
+/* Line 1455 of yacc.c  */
+#line 1158 "src/p.y"
+    { 
+                    portset.ApacheStatus.closelimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.closelimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 334:
+
+/* Line 1455 of yacc.c  */
+#line 1162 "src/p.y"
+    { 
+                    portset.ApacheStatus.dnslimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.dnslimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 335:
+
+/* Line 1455 of yacc.c  */
+#line 1166 "src/p.y"
+    { 
+                    portset.ApacheStatus.keepalivelimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.keepalivelimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 336:
+
+/* Line 1455 of yacc.c  */
+#line 1170 "src/p.y"
+    { 
+                    portset.ApacheStatus.replylimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.replylimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 337:
+
+/* Line 1455 of yacc.c  */
+#line 1174 "src/p.y"
+    { 
+                    portset.ApacheStatus.requestlimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.requestlimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 338:
+
+/* Line 1455 of yacc.c  */
+#line 1178 "src/p.y"
+    { 
+                    portset.ApacheStatus.startlimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.startlimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 339:
+
+/* Line 1455 of yacc.c  */
+#line 1182 "src/p.y"
+    { 
+                    portset.ApacheStatus.waitlimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.waitlimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 340:
+
+/* Line 1455 of yacc.c  */
+#line 1186 "src/p.y"
+    { 
+                    portset.ApacheStatus.gracefullimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.gracefullimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 341:
+
+/* Line 1455 of yacc.c  */
+#line 1190 "src/p.y"
+    { 
+                    portset.ApacheStatus.cleanuplimitOP = (yyvsp[(2) - (4)].number); 
+                    portset.ApacheStatus.cleanuplimit = (int)((yyvsp[(3) - (4)].number)); 
+                  }
+    break;
+
+  case 342:
+
+/* Line 1455 of yacc.c  */
+#line 1196 "src/p.y"
+    {
+                    seteventaction(&(current)->action_NONEXIST, (yyvsp[(6) - (7)].number), (yyvsp[(7) - (7)].number));
+                  }
+    break;
+
+  case 343:
+
+/* Line 1455 of yacc.c  */
+#line 1202 "src/p.y"
+    {
+                    seteventaction(&(current)->action_PID, (yyvsp[(6) - (6)].number), ACTION_IGNORE);
+                  }
+    break;
+
+  case 344:
+
+/* Line 1455 of yacc.c  */
+#line 1207 "src/p.y"
+    {
+                    seteventaction(&(current)->action_PPID, (yyvsp[(6) - (6)].number), ACTION_IGNORE);
+                  }
+    break;
+
+  case 345:
+
+/* Line 1455 of yacc.c  */
+#line 1212 "src/p.y"
+    {
+                    uptimeset.operator = (yyvsp[(3) - (9)].number);
+                    uptimeset.uptime = ((unsigned long long)(yyvsp[(4) - (9)].number) * (yyvsp[(5) - (9)].number));
+                    addeventaction(&(uptimeset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    adduptime(&uptimeset);
+                  }
+    break;
+
+  case 346:
+
+/* Line 1455 of yacc.c  */
+#line 1219 "src/p.y"
+    {
+                   (yyval.number) = ICMP_ATTEMPT_COUNT;
+                  }
+    break;
+
+  case 347:
+
+/* Line 1455 of yacc.c  */
+#line 1222 "src/p.y"
+    {    
+                   (yyval.number) = (yyvsp[(2) - (2)].number);
+                  }
+    break;
+
+  case 348:
+
+/* Line 1455 of yacc.c  */
+#line 1227 "src/p.y"
+    {
+                   (yyval.number) = EXEC_TIMEOUT;
+                  }
+    break;
+
+  case 349:
+
+/* Line 1455 of yacc.c  */
+#line 1230 "src/p.y"
+    {
+                   (yyval.number) = (yyvsp[(2) - (3)].number);
+                  }
+    break;
+
+  case 350:
+
+/* Line 1455 of yacc.c  */
+#line 1235 "src/p.y"
+    {
+                   (yyval.number) = 600; // Default program status check timeout is 5 min
+                  }
+    break;
+
+  case 351:
+
+/* Line 1455 of yacc.c  */
+#line 1238 "src/p.y"
+    {
+                   (yyval.number) = (yyvsp[(2) - (3)].number);
+                  }
+    break;
+
+  case 352:
+
+/* Line 1455 of yacc.c  */
+#line 1243 "src/p.y"
+    {
+                   (yyval.number) = NET_TIMEOUT;
+                  }
+    break;
+
+  case 353:
+
+/* Line 1455 of yacc.c  */
+#line 1246 "src/p.y"
+    {
+                   (yyval.number) = (yyvsp[(2) - (3)].number);
+                  }
+    break;
+
+  case 354:
+
+/* Line 1455 of yacc.c  */
+#line 1251 "src/p.y"
+    {
+                   (yyval.number) = 1;
+                  }
+    break;
+
+  case 355:
+
+/* Line 1455 of yacc.c  */
+#line 1254 "src/p.y"
+    {
+                   (yyval.number) = (yyvsp[(2) - (2)].number);
+                  }
+    break;
+
+  case 356:
+
+/* Line 1455 of yacc.c  */
+#line 1259 "src/p.y"
+    {
+                   actionrateset.count = (yyvsp[(2) - (7)].number);
+                   actionrateset.cycle = (yyvsp[(4) - (7)].number);
+                   addeventaction(&(actionrateset).action, (yyvsp[(7) - (7)].number), ACTION_IGNORE);
+                   addactionrate(&actionrateset);
+                 }
+    break;
+
+  case 357:
+
+/* Line 1455 of yacc.c  */
+#line 1265 "src/p.y"
+    {
+                   actionrateset.count = (yyvsp[(2) - (7)].number);
+                   actionrateset.cycle = (yyvsp[(4) - (7)].number);
+                   addeventaction(&(actionrateset).action, ACTION_UNMONITOR, ACTION_IGNORE);
+                   addactionrate(&actionrateset);
+                 }
+    break;
+
+  case 359:
+
+/* Line 1455 of yacc.c  */
+#line 1274 "src/p.y"
+    {
+                    seturlrequest((yyvsp[(2) - (3)].number), (yyvsp[(3) - (3)].string));
+                    FREE((yyvsp[(3) - (3)].string));
+                  }
+    break;
+
+  case 360:
+
+/* Line 1455 of yacc.c  */
+#line 1280 "src/p.y"
+    { (yyval.number) = OPERATOR_EQUAL; }
+    break;
+
+  case 361:
+
+/* Line 1455 of yacc.c  */
+#line 1281 "src/p.y"
+    { (yyval.number) = OPERATOR_NOTEQUAL; }
+    break;
+
+  case 362:
+
+/* Line 1455 of yacc.c  */
+#line 1284 "src/p.y"
+    {
+                   mailset.events = Event_All;
+                   addmail((yyvsp[(1) - (3)].string), &mailset, &current->maillist);
+                  }
+    break;
+
+  case 363:
+
+/* Line 1455 of yacc.c  */
+#line 1288 "src/p.y"
+    {
+                   addmail((yyvsp[(1) - (6)].string), &mailset, &current->maillist);
+                  }
+    break;
+
+  case 364:
+
+/* Line 1455 of yacc.c  */
+#line 1291 "src/p.y"
+    {
+                   mailset.events = ~mailset.events;
+                   addmail((yyvsp[(1) - (7)].string), &mailset, &current->maillist);
+                  }
+    break;
+
+  case 365:
+
+/* Line 1455 of yacc.c  */
+#line 1295 "src/p.y"
+    {
+                   addmail((yyvsp[(1) - (1)].string), &mailset, &current->maillist);
+                  }
+    break;
+
+  case 366:
+
+/* Line 1455 of yacc.c  */
+#line 1300 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 367:
+
+/* Line 1455 of yacc.c  */
+#line 1303 "src/p.y"
+    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    break;
+
+  case 370:
+
+/* Line 1455 of yacc.c  */
+#line 1310 "src/p.y"
+    { mailset.events |= Event_Action; }
+    break;
+
+  case 371:
+
+/* Line 1455 of yacc.c  */
+#line 1311 "src/p.y"
+    { mailset.events |= Event_Checksum; }
+    break;
+
+  case 372:
+
+/* Line 1455 of yacc.c  */
+#line 1312 "src/p.y"
+    { mailset.events |= Event_Connection; }
+    break;
+
+  case 373:
+
+/* Line 1455 of yacc.c  */
+#line 1313 "src/p.y"
+    { mailset.events |= Event_Content; }
+    break;
+
+  case 374:
+
+/* Line 1455 of yacc.c  */
+#line 1314 "src/p.y"
+    { mailset.events |= Event_Data; }
+    break;
+
+  case 375:
+
+/* Line 1455 of yacc.c  */
+#line 1315 "src/p.y"
+    { mailset.events |= Event_Exec; }
+    break;
+
+  case 376:
+
+/* Line 1455 of yacc.c  */
+#line 1316 "src/p.y"
+    { mailset.events |= Event_Fsflag; }
+    break;
+
+  case 377:
+
+/* Line 1455 of yacc.c  */
+#line 1317 "src/p.y"
+    { mailset.events |= Event_Gid; }
+    break;
+
+  case 378:
+
+/* Line 1455 of yacc.c  */
+#line 1318 "src/p.y"
+    { mailset.events |= Event_Icmp; }
+    break;
+
+  case 379:
+
+/* Line 1455 of yacc.c  */
+#line 1319 "src/p.y"
+    { mailset.events |= Event_Instance; }
+    break;
+
+  case 380:
+
+/* Line 1455 of yacc.c  */
+#line 1320 "src/p.y"
+    { mailset.events |= Event_Invalid; }
+    break;
+
+  case 381:
+
+/* Line 1455 of yacc.c  */
+#line 1321 "src/p.y"
+    { mailset.events |= Event_Nonexist; }
+    break;
+
+  case 382:
+
+/* Line 1455 of yacc.c  */
+#line 1322 "src/p.y"
+    { mailset.events |= Event_Permission; }
+    break;
+
+  case 383:
+
+/* Line 1455 of yacc.c  */
+#line 1323 "src/p.y"
+    { mailset.events |= Event_Pid; }
+    break;
+
+  case 384:
+
+/* Line 1455 of yacc.c  */
+#line 1324 "src/p.y"
+    { mailset.events |= Event_PPid; }
+    break;
+
+  case 385:
+
+/* Line 1455 of yacc.c  */
+#line 1325 "src/p.y"
+    { mailset.events |= Event_Resource; }
+    break;
+
+  case 386:
+
+/* Line 1455 of yacc.c  */
+#line 1326 "src/p.y"
+    { mailset.events |= Event_Size; }
+    break;
+
+  case 387:
+
+/* Line 1455 of yacc.c  */
+#line 1327 "src/p.y"
+    { mailset.events |= Event_Status; }
+    break;
+
+  case 388:
+
+/* Line 1455 of yacc.c  */
+#line 1328 "src/p.y"
+    { mailset.events |= Event_Timeout; }
+    break;
+
+  case 389:
+
+/* Line 1455 of yacc.c  */
+#line 1329 "src/p.y"
+    { mailset.events |= Event_Timestamp; }
+    break;
+
+  case 390:
+
+/* Line 1455 of yacc.c  */
+#line 1330 "src/p.y"
+    { mailset.events |= Event_Uid; }
+    break;
+
+  case 391:
+
+/* Line 1455 of yacc.c  */
+#line 1331 "src/p.y"
+    { mailset.events |= Event_Uptime; }
+    break;
+
+  case 396:
+
+/* Line 1455 of yacc.c  */
+#line 1342 "src/p.y"
+    { mailset.from = (yyvsp[(1) - (1)].string); }
+    break;
+
+  case 397:
+
+/* Line 1455 of yacc.c  */
+#line 1343 "src/p.y"
+    { mailset.replyto = (yyvsp[(1) - (1)].string); }
+    break;
+
+  case 398:
+
+/* Line 1455 of yacc.c  */
+#line 1344 "src/p.y"
+    { mailset.subject = (yyvsp[(1) - (1)].string); }
+    break;
+
+  case 399:
+
+/* Line 1455 of yacc.c  */
+#line 1345 "src/p.y"
+    { mailset.message = (yyvsp[(1) - (1)].string); }
+    break;
+
+  case 400:
+
+/* Line 1455 of yacc.c  */
+#line 1348 "src/p.y"
+    {
+                   current->every.type = EVERY_SKIPCYCLES;
+                   current->every.spec.cycle.number = (yyvsp[(2) - (3)].number);
+                 }
+    break;
+
+  case 401:
+
+/* Line 1455 of yacc.c  */
+#line 1352 "src/p.y"
+    {
+                   current->every.type = EVERY_CRON;
+                   current->every.spec.cron = (yyvsp[(2) - (2)].string);
+                 }
+    break;
+
+  case 402:
+
+/* Line 1455 of yacc.c  */
+#line 1356 "src/p.y"
+    {
+                   current->every.type = EVERY_NOTINCRON;
+                   current->every.spec.cron = (yyvsp[(2) - (2)].string);
+                 }
+    break;
+
+  case 403:
+
+/* Line 1455 of yacc.c  */
+#line 1362 "src/p.y"
+    {
+                    current->mode = MODE_ACTIVE;
+                  }
+    break;
+
+  case 404:
+
+/* Line 1455 of yacc.c  */
+#line 1365 "src/p.y"
+    {
+                    current->mode = MODE_PASSIVE;
+                  }
+    break;
+
+  case 405:
+
+/* Line 1455 of yacc.c  */
+#line 1368 "src/p.y"
+    {
+                    current->mode = MODE_MANUAL;
+                    current->monitor = MONITOR_NOT;
+                  }
+    break;
+
+  case 406:
+
+/* Line 1455 of yacc.c  */
+#line 1374 "src/p.y"
+    { addservicegroup((yyvsp[(2) - (2)].string)); FREE((yyvsp[(2) - (2)].string));}
+    break;
+
+  case 410:
+
+/* Line 1455 of yacc.c  */
+#line 1385 "src/p.y"
+    { adddependant((yyvsp[(1) - (1)].string)); }
+    break;
+
+  case 411:
+
+/* Line 1455 of yacc.c  */
+#line 1388 "src/p.y"
+    {
+                        programset.operator = (yyvsp[(3) - (9)].number);
+                        programset.return_value = (yyvsp[(4) - (9)].number);
+                        programset.timeout = (yyvsp[(5) - (9)].number);
+                        addeventaction(&(programset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                        addprogram(&programset);
+                   }
+    break;
+
+  case 412:
+
+/* Line 1455 of yacc.c  */
+#line 1397 "src/p.y"
+    {
+                     addeventaction(&(resourceset).action, (yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].number));
+                     addresource(&resourceset);
+                   }
+    break;
+
+  case 419:
+
+/* Line 1455 of yacc.c  */
+#line 1413 "src/p.y"
+    {
+                     addeventaction(&(resourceset).action, (yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].number));
+                     addresource(&resourceset);
+                   }
+    break;
+
+  case 426:
+
+/* Line 1455 of yacc.c  */
+#line 1429 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_CPU_PERCENT;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10); 
+                  }
+    break;
+
+  case 427:
+
+/* Line 1455 of yacc.c  */
+#line 1434 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_CPU_PERCENT;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10); 
+                  }
+    break;
+
+  case 428:
+
+/* Line 1455 of yacc.c  */
+#line 1441 "src/p.y"
+    {
+                    resourceset.resource_id = (yyvsp[(1) - (4)].number);
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10); 
+                  }
+    break;
+
+  case 429:
+
+/* Line 1455 of yacc.c  */
+#line 1448 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_CPUUSER; }
+    break;
+
+  case 430:
+
+/* Line 1455 of yacc.c  */
+#line 1449 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_CPUSYSTEM; }
+    break;
+
+  case 431:
+
+/* Line 1455 of yacc.c  */
+#line 1450 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_CPUWAIT; }
+    break;
+
+  case 432:
+
+/* Line 1455 of yacc.c  */
+#line 1453 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_MEM_KBYTE;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = (int) ((yyvsp[(3) - (4)].real) * ((yyvsp[(4) - (4)].number) / 1024.0)); 
+                  }
+    break;
+
+  case 433:
+
+/* Line 1455 of yacc.c  */
+#line 1458 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_MEM_PERCENT;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10); 
+                  }
+    break;
+
+  case 434:
+
+/* Line 1455 of yacc.c  */
+#line 1463 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_MEM_KBYTE;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = (int) ((yyvsp[(3) - (4)].real) * ((yyvsp[(4) - (4)].number) / 1024.0));
+                  }
+    break;
+
+  case 435:
+
+/* Line 1455 of yacc.c  */
+#line 1468 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_TOTAL_MEM_PERCENT;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10);
+                  }
+    break;
+
+  case 436:
+
+/* Line 1455 of yacc.c  */
+#line 1475 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_SWAP_KBYTE;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = (int) ((yyvsp[(3) - (4)].real) * ((yyvsp[(4) - (4)].number) / 1024.0));
+                  }
+    break;
+
+  case 437:
+
+/* Line 1455 of yacc.c  */
+#line 1480 "src/p.y"
+    {
+                    resourceset.resource_id = RESOURCE_ID_SWAP_PERCENT;
+                    resourceset.operator = (yyvsp[(2) - (4)].number);
+                    resourceset.limit = ((yyvsp[(3) - (4)].number) * 10);
+                  }
+    break;
+
+  case 438:
+
+/* Line 1455 of yacc.c  */
+#line 1487 "src/p.y"
+    { 
+                    resourceset.resource_id = RESOURCE_ID_CHILDREN;
+                    resourceset.operator = (yyvsp[(2) - (3)].number);
+                    resourceset.limit = (int) (yyvsp[(3) - (3)].number); 
+                  }
+    break;
+
+  case 439:
+
+/* Line 1455 of yacc.c  */
+#line 1494 "src/p.y"
+    { 
+                    resourceset.resource_id = (yyvsp[(1) - (3)].number);
+                    resourceset.operator = (yyvsp[(2) - (3)].number);
+                    resourceset.limit = (int) ((yyvsp[(3) - (3)].real) * 10.0); 
+                  }
+    break;
+
+  case 440:
+
+/* Line 1455 of yacc.c  */
+#line 1501 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_LOAD1; }
+    break;
+
+  case 441:
+
+/* Line 1455 of yacc.c  */
+#line 1502 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_LOAD5; }
+    break;
+
+  case 442:
+
+/* Line 1455 of yacc.c  */
+#line 1503 "src/p.y"
+    { (yyval.number) = RESOURCE_ID_LOAD15; }
+    break;
+
+  case 443:
+
+/* Line 1455 of yacc.c  */
+#line 1506 "src/p.y"
+    { (yyval.real) = (yyvsp[(1) - (1)].real); }
+    break;
+
+  case 444:
+
+/* Line 1455 of yacc.c  */
+#line 1507 "src/p.y"
+    { (yyval.real) = (float) (yyvsp[(1) - (1)].number); }
+    break;
+
+  case 445:
+
+/* Line 1455 of yacc.c  */
+#line 1510 "src/p.y"
+    {
+                    timestampset.operator = (yyvsp[(3) - (9)].number);
+                    timestampset.time = ((yyvsp[(4) - (9)].number) * (yyvsp[(5) - (9)].number));
+                    addeventaction(&(timestampset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    addtimestamp(&timestampset, FALSE);
+                  }
+    break;
+
+  case 446:
+
+/* Line 1455 of yacc.c  */
+#line 1516 "src/p.y"
+    {
+                    timestampset.test_changes = TRUE;
+                    addeventaction(&(timestampset).action, (yyvsp[(6) - (6)].number), ACTION_IGNORE);
+                    addtimestamp(&timestampset, TRUE);
+                  }
+    break;
+
+  case 447:
+
+/* Line 1455 of yacc.c  */
+#line 1523 "src/p.y"
+    { (yyval.number) = OPERATOR_EQUAL; }
+    break;
+
+  case 448:
+
+/* Line 1455 of yacc.c  */
+#line 1524 "src/p.y"
+    { (yyval.number) = OPERATOR_GREATER; }
+    break;
+
+  case 449:
+
+/* Line 1455 of yacc.c  */
+#line 1525 "src/p.y"
+    { (yyval.number) = OPERATOR_LESS; }
+    break;
+
+  case 450:
+
+/* Line 1455 of yacc.c  */
+#line 1526 "src/p.y"
+    { (yyval.number) = OPERATOR_EQUAL; }
+    break;
+
+  case 451:
+
+/* Line 1455 of yacc.c  */
+#line 1527 "src/p.y"
+    { (yyval.number) = OPERATOR_NOTEQUAL; }
+    break;
+
+  case 452:
+
+/* Line 1455 of yacc.c  */
+#line 1528 "src/p.y"
+    { (yyval.number) = OPERATOR_NOTEQUAL; }
+    break;
+
+  case 453:
+
+/* Line 1455 of yacc.c  */
+#line 1531 "src/p.y"
+    { (yyval.number) = TIME_SECOND; }
+    break;
+
+  case 454:
+
+/* Line 1455 of yacc.c  */
+#line 1532 "src/p.y"
+    { (yyval.number) = TIME_SECOND; }
+    break;
+
+  case 455:
+
+/* Line 1455 of yacc.c  */
+#line 1533 "src/p.y"
+    { (yyval.number) = TIME_MINUTE; }
+    break;
+
+  case 456:
+
+/* Line 1455 of yacc.c  */
+#line 1534 "src/p.y"
+    { (yyval.number) = TIME_HOUR; }
+    break;
+
+  case 457:
+
+/* Line 1455 of yacc.c  */
+#line 1535 "src/p.y"
+    { (yyval.number) = TIME_DAY; }
+    break;
+
+  case 458:
+
+/* Line 1455 of yacc.c  */
+#line 1538 "src/p.y"
+    { (yyval.number) = ACTION_ALERT; }
+    break;
+
+  case 459:
+
+/* Line 1455 of yacc.c  */
+#line 1539 "src/p.y"
+    { (yyval.number) = ACTION_EXEC; }
+    break;
+
+  case 460:
+
+/* Line 1455 of yacc.c  */
+#line 1540 "src/p.y"
+    { (yyval.number) = ACTION_EXEC; }
+    break;
+
+  case 461:
+
+/* Line 1455 of yacc.c  */
+#line 1541 "src/p.y"
+    { (yyval.number) = ACTION_RESTART; }
+    break;
+
+  case 462:
+
+/* Line 1455 of yacc.c  */
+#line 1542 "src/p.y"
+    { (yyval.number) = ACTION_START; }
+    break;
+
+  case 463:
+
+/* Line 1455 of yacc.c  */
+#line 1543 "src/p.y"
+    { (yyval.number) = ACTION_STOP; }
+    break;
+
+  case 464:
+
+/* Line 1455 of yacc.c  */
+#line 1544 "src/p.y"
+    { (yyval.number) = ACTION_UNMONITOR; }
+    break;
+
+  case 465:
+
+/* Line 1455 of yacc.c  */
+#line 1547 "src/p.y"
+    {
+                    (yyval.number) = (yyvsp[(1) - (1)].number);
+                    if ((yyvsp[(1) - (1)].number) == ACTION_EXEC && command) {
+                      command1 = command;
+                      command = NULL;
+                    }
+                  }
+    break;
+
+  case 466:
+
+/* Line 1455 of yacc.c  */
+#line 1556 "src/p.y"
+    {
+                    (yyval.number) = (yyvsp[(1) - (1)].number);
+                    if ((yyvsp[(1) - (1)].number) == ACTION_EXEC && command) {
+                      command2 = command;
+                      command = NULL;
+                    }
+                  }
+    break;
+
+  case 468:
+
+/* Line 1455 of yacc.c  */
+#line 1566 "src/p.y"
+    {
+                    rate1.count  = (yyvsp[(1) - (2)].number);
+                    rate1.cycles = (yyvsp[(1) - (2)].number);
+                    if (rate1.cycles < 1 || rate1.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                  }
+    break;
+
+  case 469:
+
+/* Line 1455 of yacc.c  */
+#line 1572 "src/p.y"
+    {
+                    rate1.count  = (yyvsp[(1) - (3)].number);
+                    rate1.cycles = (yyvsp[(2) - (3)].number);
+                    if (rate1.cycles < 1 || rate1.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                    if (rate1.count < 1 || rate1.count > rate1.cycles)
+                      yyerror2("the number of events must be bigger then 0 and less than poll cycles");
+                  }
+    break;
+
+  case 471:
+
+/* Line 1455 of yacc.c  */
+#line 1583 "src/p.y"
+    {
+                    rate2.count  = (yyvsp[(1) - (2)].number);
+                    rate2.cycles = (yyvsp[(1) - (2)].number);
+                    if (rate2.cycles < 1 || rate2.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                  }
+    break;
+
+  case 472:
+
+/* Line 1455 of yacc.c  */
+#line 1589 "src/p.y"
+    {
+                    rate2.count  = (yyvsp[(1) - (3)].number);
+                    rate2.cycles = (yyvsp[(2) - (3)].number);
+                    if (rate2.cycles < 1 || rate2.cycles > BITMAP_MAX)
+                      yyerror2("the number of cycles must be between 1 and %d", BITMAP_MAX);
+                    if (rate2.count < 1 || rate2.count > rate2.cycles)
+                      yyerror2("the number of events must be bigger then 0 and less than poll cycles");
+                  }
+    break;
+
+  case 473:
+
+/* Line 1455 of yacc.c  */
+#line 1599 "src/p.y"
+    {
+                    (yyval.number) = ACTION_ALERT;
+                  }
+    break;
+
+  case 474:
+
+/* Line 1455 of yacc.c  */
+#line 1602 "src/p.y"
+    {
+                    (yyval.number) = (yyvsp[(6) - (6)].number);
+                  }
+    break;
+
+  case 475:
+
+/* Line 1455 of yacc.c  */
+#line 1605 "src/p.y"
+    {
+                    (yyval.number) = (yyvsp[(6) - (6)].number);
+                  }
+    break;
+
+  case 476:
+
+/* Line 1455 of yacc.c  */
+#line 1608 "src/p.y"
+    {
+                    (yyval.number) = (yyvsp[(6) - (6)].number);
+                  }
+    break;
+
+  case 477:
+
+/* Line 1455 of yacc.c  */
+#line 1613 "src/p.y"
+    {
+                    addeventaction(&(checksumset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    addchecksum(&checksumset);
+                  }
+    break;
+
+  case 478:
+
+/* Line 1455 of yacc.c  */
+#line 1618 "src/p.y"
+    {
+                    snprintf(checksumset.hash, sizeof(checksumset.hash), "%s", (yyvsp[(6) - (10)].string));
+                    FREE((yyvsp[(6) - (10)].string));
+                    addeventaction(&(checksumset).action, (yyvsp[(9) - (10)].number), (yyvsp[(10) - (10)].number));
+                    addchecksum(&checksumset);
+                  }
+    break;
+
+  case 479:
+
+/* Line 1455 of yacc.c  */
+#line 1624 "src/p.y"
+    {
+                    checksumset.test_changes = TRUE;
+                    addeventaction(&(checksumset).action, (yyvsp[(7) - (7)].number), ACTION_IGNORE);
+                    addchecksum(&checksumset);
+                  }
+    break;
+
+  case 480:
+
+/* Line 1455 of yacc.c  */
+#line 1630 "src/p.y"
+    { checksumset.type = HASH_UNKNOWN; }
+    break;
+
+  case 481:
+
+/* Line 1455 of yacc.c  */
+#line 1631 "src/p.y"
+    { checksumset.type = HASH_MD5; }
+    break;
+
+  case 482:
+
+/* Line 1455 of yacc.c  */
+#line 1632 "src/p.y"
+    { checksumset.type = HASH_SHA1; }
+    break;
+
+  case 483:
+
+/* Line 1455 of yacc.c  */
+#line 1635 "src/p.y"
+    {
+                    filesystemset.resource = RESOURCE_ID_INODE;
+                    filesystemset.operator = (yyvsp[(3) - (8)].number);
+                    filesystemset.limit_absolute = (yyvsp[(4) - (8)].number);
+                    addeventaction(&(filesystemset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    addfilesystem(&filesystemset);
+                  }
+    break;
+
+  case 484:
+
+/* Line 1455 of yacc.c  */
+#line 1642 "src/p.y"
+    {
+                    filesystemset.resource = RESOURCE_ID_INODE;
+                    filesystemset.operator = (yyvsp[(3) - (9)].number);
+                    filesystemset.limit_percent = (int)((yyvsp[(4) - (9)].number) * 10);
+                    addeventaction(&(filesystemset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    addfilesystem(&filesystemset);
+                  }
+    break;
+
+  case 485:
+
+/* Line 1455 of yacc.c  */
+#line 1651 "src/p.y"
+    {
+                    if (!filesystem_usage(current->inf, current->path))
+                      yyerror2("cannot read usage of filesystem %s", current->path);
+                    filesystemset.resource = RESOURCE_ID_SPACE;
+                    filesystemset.operator = (yyvsp[(3) - (9)].number);
+                    filesystemset.limit_absolute = (int)((float)(yyvsp[(4) - (9)].real) / (float)current->inf->priv.filesystem.f_bsize * (float)(yyvsp[(5) - (9)].number));
+                    addeventaction(&(filesystemset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    addfilesystem(&filesystemset);
+                  }
+    break;
+
+  case 486:
+
+/* Line 1455 of yacc.c  */
+#line 1660 "src/p.y"
+    {
+                    filesystemset.resource = RESOURCE_ID_SPACE;
+                    filesystemset.operator = (yyvsp[(3) - (9)].number);
+                    filesystemset.limit_percent = (int)((yyvsp[(4) - (9)].number) * 10);
+                    addeventaction(&(filesystemset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    addfilesystem(&filesystemset);
+                  }
+    break;
+
+  case 487:
+
+/* Line 1455 of yacc.c  */
+#line 1669 "src/p.y"
+    {
+                    seteventaction(&(current)->action_FSFLAG, (yyvsp[(6) - (6)].number), ACTION_IGNORE);
+                  }
+    break;
+
+  case 488:
+
+/* Line 1455 of yacc.c  */
+#line 1674 "src/p.y"
+    { (yyval.number) = UNIT_BYTE; }
+    break;
+
+  case 489:
+
+/* Line 1455 of yacc.c  */
+#line 1675 "src/p.y"
+    { (yyval.number) = UNIT_BYTE; }
+    break;
+
+  case 490:
+
+/* Line 1455 of yacc.c  */
+#line 1676 "src/p.y"
+    { (yyval.number) = UNIT_KILOBYTE; }
+    break;
+
+  case 491:
+
+/* Line 1455 of yacc.c  */
+#line 1677 "src/p.y"
+    { (yyval.number) = UNIT_MEGABYTE; }
+    break;
+
+  case 492:
+
+/* Line 1455 of yacc.c  */
+#line 1678 "src/p.y"
+    { (yyval.number) = UNIT_GIGABYTE; }
+    break;
+
+  case 493:
+
+/* Line 1455 of yacc.c  */
+#line 1681 "src/p.y"
+    {
+                    permset.perm = check_perm((yyvsp[(4) - (8)].number));
+                    addeventaction(&(permset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    addperm(&permset);
+                  }
+    break;
+
+  case 494:
+
+/* Line 1455 of yacc.c  */
+#line 1688 "src/p.y"
+    {
+                    matchset.ignore = FALSE;
+                    matchset.match_path = (yyvsp[(4) - (7)].string);
+                    matchset.match_string = NULL;
+                    addmatchpath(&matchset, (yyvsp[(7) - (7)].number));
+                    FREE((yyvsp[(4) - (7)].string)); 
+                  }
+    break;
+
+  case 495:
+
+/* Line 1455 of yacc.c  */
+#line 1695 "src/p.y"
+    {
+                    matchset.ignore = FALSE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = (yyvsp[(4) - (7)].string);
+                    addmatch(&matchset, (yyvsp[(7) - (7)].number), 0);
+                  }
+    break;
+
+  case 496:
+
+/* Line 1455 of yacc.c  */
+#line 1701 "src/p.y"
+    {
+                    matchset.ignore = TRUE;
+                    matchset.match_path = (yyvsp[(4) - (4)].string);
+                    matchset.match_string = NULL;
+                    addmatchpath(&matchset, ACTION_IGNORE);
+                    FREE((yyvsp[(4) - (4)].string)); 
+                  }
+    break;
+
+  case 497:
+
+/* Line 1455 of yacc.c  */
+#line 1708 "src/p.y"
+    {
+                    matchset.ignore = TRUE;
+                    matchset.match_path = NULL;
+                    matchset.match_string = (yyvsp[(4) - (4)].string);
+                    addmatch(&matchset, ACTION_IGNORE, 0);
+                  }
+    break;
+
+  case 498:
+
+/* Line 1455 of yacc.c  */
+#line 1716 "src/p.y"
+    {
+                    matchset.not = FALSE;
+                  }
+    break;
+
+  case 499:
+
+/* Line 1455 of yacc.c  */
+#line 1719 "src/p.y"
+    {
+                    matchset.not = TRUE;
+                  }
+    break;
+
+  case 500:
+
+/* Line 1455 of yacc.c  */
+#line 1725 "src/p.y"
+    {
+                    sizeset.operator = (yyvsp[(3) - (9)].number);
+                    sizeset.size = ((unsigned long long)(yyvsp[(4) - (9)].number) * (yyvsp[(5) - (9)].number));
+                    addeventaction(&(sizeset).action, (yyvsp[(8) - (9)].number), (yyvsp[(9) - (9)].number));
+                    addsize(&sizeset);
+                  }
+    break;
+
+  case 501:
+
+/* Line 1455 of yacc.c  */
+#line 1731 "src/p.y"
+    {
+                    sizeset.test_changes = TRUE;
+                    addeventaction(&(sizeset).action, (yyvsp[(6) - (6)].number), ACTION_IGNORE);
+                    addsize(&sizeset);
+                  }
+    break;
+
+  case 502:
+
+/* Line 1455 of yacc.c  */
+#line 1738 "src/p.y"
+    {
+                    uidset.uid = get_uid((yyvsp[(4) - (8)].string), 0);
+                    addeventaction(&(uidset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    adduid(&uidset);
+                    FREE((yyvsp[(4) - (8)].string));
+                  }
+    break;
+
+  case 503:
+
+/* Line 1455 of yacc.c  */
+#line 1744 "src/p.y"
+    {
+                    uidset.uid = get_uid(NULL, (yyvsp[(4) - (8)].number));
+                    addeventaction(&(uidset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    adduid(&uidset);
+                  }
+    break;
+
+  case 504:
+
+/* Line 1455 of yacc.c  */
+#line 1751 "src/p.y"
+    {
+                    gidset.gid = get_gid((yyvsp[(4) - (8)].string), 0);
+                    addeventaction(&(gidset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    addgid(&gidset);
+                    FREE((yyvsp[(4) - (8)].string));
+                  }
+    break;
+
+  case 505:
+
+/* Line 1455 of yacc.c  */
+#line 1757 "src/p.y"
+    {
+                    gidset.gid = get_gid(NULL, (yyvsp[(4) - (8)].number));
+                    addeventaction(&(gidset).action, (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].number));
+                    addgid(&gidset);
+                  }
+    break;
+
+  case 506:
+
+/* Line 1455 of yacc.c  */
+#line 1764 "src/p.y"
+    { (yyval.number) = ICMP_ECHO; }
+    break;
+
+  case 507:
+
+/* Line 1455 of yacc.c  */
+#line 1767 "src/p.y"
+    { mailset.reminder = 0; }
+    break;
+
+  case 508:
+
+/* Line 1455 of yacc.c  */
+#line 1768 "src/p.y"
+    { mailset.reminder = (yyvsp[(2) - (2)].number); }
+    break;
+
+  case 509:
+
+/* Line 1455 of yacc.c  */
+#line 1769 "src/p.y"
+    { mailset.reminder = (yyvsp[(2) - (3)].number); }
+    break;
+
+
+
+/* Line 1455 of yacc.c  */
+#line 5584 "src/y.tab.c"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
+	      YYSTACK_FREE (yymsg);
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
+	      goto yyexhaustedlab;
+	  }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+	{
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+	}
+      else
+	{
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+
+/* Line 1675 of yacc.c  */
+#line 1772 "src/p.y"
+
+
+
+/* -------------------------------------------------------- Parser interface */
+
+
+/**
+ * Syntactic error routine
+ *
+ * This routine is automatically called by the lexer!
+ */
+void yyerror(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogError("%s:%i: Error: %s '%s'\n", currentfile, lineno, msg, yytext);
+  cfg_errflag++;
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Syntactical warning routine
+ */
+void yywarning(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogWarning("%s:%i: Warning: %s '%s'\n", currentfile, lineno, msg, yytext);
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Argument error routine
+ */
+void yyerror2(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogError("%s:%i: Error: %s '%s'\n", argcurrentfile, arglineno, msg, argyytext);
+  cfg_errflag++;
+ 
+  FREE(msg);
+  
+}
+
+/**
+ * Argument warning routine
+ */
+void yywarning2(const char *s, ...) {
+  va_list ap;
+  char *msg = NULL;
+
+  ASSERT(s);
+  
+  va_start(ap,s);
+  msg = Str_vcat(s, ap);
+  va_end(ap);
+  
+  LogWarning("%s:%i: Warning: %s '%s'\n", argcurrentfile, arglineno, msg, argyytext);
+ 
+  FREE(msg);
+  
+}
+
+/*
+ * The Parser hook - start parsing the control file
+ * Returns TRUE if parsing succeeded, otherwise FALSE
+ */
+int parse(char *controlfile) {
+
+  ASSERT(controlfile);
+
+  servicelist = tail = current = NULL;
+
+  /*
+   * Secure check the monitrc file. The run control file must have the
+   * same uid as the REAL uid of this process, it must have permissions
+   * no greater than 700 and it must not be a symbolic link.
+   */
+  if (! file_checkStat(controlfile, "control file", S_IRUSR|S_IWUSR|S_IXUSR))
+    return FALSE;
+
+  if ((yyin = fopen(controlfile,"r")) == (FILE *)NULL) {
+    LogError("%s: Error: cannot open the control file '%s' -- %s\n", prog, controlfile, STRERROR);
+    return FALSE;
+  }
+
+  currentfile = Str_dup(controlfile);
+
+  /* 
+   * Creation of the global service list is synchronized  
+   */
+  LOCK(Run.mutex)
+    preparse();
+    yyparse();
+    fclose(yyin);
+    /* Add the default general system service if not specified explicitly */
+    if (!hassystem) {
+      char *name = Str_cat("system_%s", Run.localhostname);
+      if (Util_existService(name) || (current && IS(name, current->name))) {
+        LogError("'check system' not defined in control file, failed to add automatic configuration (service name %s is used already) -- please add 'check system <name>' manually\n", name, name);
+        FREE(name);
+        cfg_errflag++;
+      } else {
+        createservice(TYPE_SYSTEM, name, Str_dup(""), check_system);
+      }
+    }
+    /* If defined - add the last service to the service list */
+    if (current) {
+      addservice(current);
+      FREE(current);
+    }
+    postparse();
+  END_LOCK;
+
+  FREE(currentfile);
+
+  if (argyytext != NULL)
+    FREE(argyytext);
+
+  return(cfg_errflag == 0);
+}
+
+
+/* ----------------------------------------------------------------- Private */
+
+
+/**
+ * Initialize objects used by the parser.
+ */
+static void preparse() {
+  int i;
+  char localhost[STRLEN];
+
+  /*
+   * Get the localhost name
+   */
+  if (Util_getfqdnhostname(localhost, sizeof(localhost)))
+    snprintf(localhost, STRLEN, "%s", LOCALHOST);
+
+  /* Set instance incarnation ID */
+  time(&Run.incarnation);
+  /* Reset lexer */
+  buffer_stack_ptr        = 0;
+  lineno                  = 1;
+  arglineno               = 1;
+  argcurrentfile          = NULL;
+  argyytext               = NULL;
+  /* Reset parser */
+  Run.stopped             = FALSE;
+  Run.dolog               = FALSE;
+  Run.dohttpd             = FALSE;
+  Run.doaction            = FALSE;
+  Run.httpdsig            = TRUE;
+  Run.dommonitcredentials = TRUE;
+  Run.mmonitcredentials   = NULL;
+  Run.credentials         = NULL;
+  Run.httpdssl            = FALSE;
+  Run.httpsslpem          = NULL;
+  Run.httpsslclientpem    = NULL;
+  Run.clientssl           = FALSE;
+  Run.allowselfcert       = FALSE; 
+  Run.mailserver_timeout  = NET_TIMEOUT;
+  Run.bind_addr           = NULL;
+  Run.eventlist           = NULL;
+  Run.eventlist_dir       = NULL;
+  Run.eventlist_slots     = -1;
+  Run.system              = NULL;
+  Run.expectbuffer        = STRLEN;
+  Run.mmonits             = NULL;
+  Run.maillist            = NULL;
+  Run.mailservers         = NULL;
+  Run.MailFormat.from     = NULL;
+  Run.MailFormat.replyto  = NULL;
+  Run.MailFormat.subject  = NULL;
+  Run.MailFormat.message  = NULL;
+  Run.localhostname       = Str_dup(localhost);
+  depend_list             = NULL;
+  Run.handler_init        = TRUE;
+#ifdef OPENSSL_FIPS  
+  Run.fipsEnabled         = FALSE;
+#endif
+  for (i = 0; i <= HANDLER_MAX; i++)
+    Run.handler_queue[i] = 0;
+  /* 
+   * Initialize objects
+   */
+  reset_uidset();
+  reset_programset();
+  reset_gidset();
+  reset_sizeset();
+  reset_mailset();
+  reset_mailserverset();
+  reset_portset();
+  reset_permset();
+  reset_icmpset();
+  reset_rateset();
+  reset_filesystemset();
+  reset_resourceset();
+  reset_checksumset();
+  reset_timestampset();
+  reset_actionrateset();
+}
+
+
+/*
+ * Check that values are reasonable after parsing
+ */
+static void postparse() {
+        Service_T s;
+        
+        if (cfg_errflag || ! servicelist)
+                return;
+        
+        /* Check the sanity of any dependency graph */
+        check_depend();
+        
+        /* Check that we do not start monit in daemon mode without having a
+         * poll time */
+        if (!Run.polltime && (Run.isdaemon || Run.init)) {
+                LogError("%s: Error: Poll time not defined. Please define poll time in the\n control file or use the -d option when starting monit\n", prog);
+                cfg_errflag++;
+        }
+        
+        if (Run.logfile)
+                Run.dolog = TRUE;
+
+        for (s = servicelist; s; s = s->next) {
+                /* Set the general system service shortcut */
+                if (s->type == TYPE_SYSTEM)
+                        Run.system = s;
+                else if (s->type == TYPE_HOST) {
+                        /* Verify that a remote service has a port or an icmp list */
+                        if (!s->portlist && !s->icmplist) {
+                                LogError("%s: Error: 'check host' statement is incomplete; Please specify a port number to test\n or an icmp test at the remote host: '%s'\n", prog, s->name);
+                                cfg_errflag++;
+                        }
+                }
+                else if (s->type == TYPE_PROGRAM) {
+                        /* Verify that a program test has a status test */
+                        if (! s->program) {
+                                LogError("%s: Error: 'check program %s' is incomplete; Please add an 'if status != n' test\n", prog, s->name);
+                                cfg_errflag++;
+                        }
+                }
+        }
+        
+        if (Run.mmonits) {
+                if (Run.dohttpd) {
+                        if (Run.dommonitcredentials) {
+                                Auth_T c;
+                                for (c = Run.credentials; c; c = c->next) {
+                                        if (c->digesttype == DIGEST_CLEARTEXT && ! c->is_readonly) {
+                                                Run.mmonitcredentials = c;
+                                                break;
+                                        }
+                                }
+                                if (! Run.mmonitcredentials)
+                                LogWarning("%s: Warning: M/Monit registration with credentials enabled, but no suitable credentials found in monit configuration file -- please add 'allow user:password' option to 'set httpd' statement\n", prog);
+                        }
+                } else
+                LogWarning("%s: Warning: M/Monit enabled but no httpd allowed -- please add 'set httpd' statement\n", prog);
+        }
+}
+
+
+/*
+ * Create a new service object and add any current objects to the
+ * service list.
+ */
+static void createservice(int type, char *name, char *value, int (*check)(Service_T s)) {
+
+  ASSERT(name);
+  ASSERT(value);
+
+  check_name(name);
+
+  if (current) {
+    addservice(current);
+    memset(current, 0, sizeof(*current));
+  } else {
+    NEW(current);
+  }
+
+  current->type = type;
+
+  NEW(current->inf);
+  Util_resetInfo(current);
+
+  /* Set default values */
+  current->monitor = MONITOR_INIT;
+  current->mode    = MODE_ACTIVE;
+  current->name    = name;
+  current->check   = check;
+  current->path    = value;
+
+  /* Initialize general event handlers */
+  addeventaction(&(current)->action_DATA,     ACTION_ALERT,     ACTION_ALERT);
+  addeventaction(&(current)->action_EXEC,     ACTION_ALERT,     ACTION_ALERT);
+  addeventaction(&(current)->action_INVALID,  ACTION_RESTART,   ACTION_ALERT);
+  addeventaction(&(current)->action_NONEXIST, ACTION_RESTART,   ACTION_ALERT);
+  addeventaction(&(current)->action_PID,      ACTION_ALERT,     ACTION_IGNORE);
+  addeventaction(&(current)->action_PPID,     ACTION_ALERT,     ACTION_IGNORE);
+  addeventaction(&(current)->action_FSFLAG,   ACTION_ALERT,     ACTION_IGNORE);
+
+  /* Initialize internal event handlers */
+  addeventaction(&(current)->action_MONIT_START,  ACTION_START, ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_STOP,   ACTION_STOP,  ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_RELOAD, ACTION_START, ACTION_IGNORE);
+  addeventaction(&(current)->action_ACTION,       ACTION_ALERT, ACTION_IGNORE);
+  
+  gettimeofday(&current->collected, NULL);
+}
+
+
+/*
+ * Add a service object to the servicelist
+ */
+static void addservice(Service_T s) {
+  Service_T n;
+
+  ASSERT(s);
+ 
+  NEW(n);
+  memcpy(n, s, sizeof(*s));
+  /* Add the service to the end of the service list */
+  if (tail != NULL) {
+    tail->next = n;
+    tail->next_conf = n;
+  } else {
+    servicelist = n;
+    servicelist_conf = n;
+  }
+  tail = n;
+}
+
+
+/* 
+ * Add entry to service group list
+ */
+static void addservicegroup(char *name) {
+  ServiceGroup_T g;
+  ServiceGroupMember_T m;
+
+  ASSERT(name);
+ 
+  /* Check if service group with the same name is defined already */
+  for (g = servicegrouplist; g; g = g->next)
+    if (! strcasecmp(g->name, name))
+      break;
+
+  if (! g) {
+    NEW(g);
+    g->name = Str_dup(name);
+    g->next = servicegrouplist;
+    servicegrouplist = g;
+  }
+
+  NEW(m);
+  m->name = Str_dup(current->name);
+  m->next = g->members;
+  g->members = m;
+}
+
+
+/* 
+ * Add a dependant entry to the current service dependant list
+ *
+ */
+static void adddependant(char *dependant) {
+  Dependant_T d; 
+
+  ASSERT(dependant);
+  
+  NEW(d);
+  
+  if (current->dependantlist != NULL)
+    d->next = current->dependantlist;
+
+  d->dependant = dependant;
+  current->dependantlist = d;
+
+}
+
+
+/*
+ * Add the given mailaddress with the appropriate alert notification
+ * values and mail attributes to the given mailinglist.
+ */
+static void addmail(char *mailto, Mail_T f, Mail_T *l) {
+  Mail_T m;
+
+  ASSERT(mailto);
+
+  NEW(m);
+  m->to       = mailto;
+  m->from     = f->from;
+  m->subject  = f->subject;
+  m->message  = f->message;
+  m->events   = f->events;
+  m->reminder = f->reminder;
+  
+  m->next = *l;
+  *l = m;
+
+  reset_mailset();
+}
+
+
+/*
+ * Add the given portset to the current service's portlist
+ */
+static void addport(Port_T port) {
+  Port_T p;
+  
+  ASSERT(port);
+
+  NEW(p);
+  p->port               = port->port;
+  p->type               = port->type;
+  p->socket             = port->socket;
+  p->family             = port->family;
+  p->action             = port->action;
+  p->timeout            = port->timeout;
+  p->retry              = port->retry;
+  p->request            = port->request;
+  p->generic            = port->generic;
+  p->protocol           = port->protocol;
+  p->pathname           = port->pathname;
+  p->hostname           = port->hostname;
+  p->url_request        = port->url_request;
+  p->request_checksum   = port->request_checksum;
+  p->request_hostheader = port->request_hostheader;
+  memcpy(&p->ApacheStatus, &port->ApacheStatus, sizeof(struct apache_status));
+
+  if (p->request_checksum) {
+    cleanup_hash_string(p->request_checksum);
+    if (strlen(p->request_checksum) == 32)
+      p->request_hashtype = HASH_MD5;
+    else if (strlen(p->request_checksum) == 40)
+      p->request_hashtype = HASH_SHA1;
+    else
+      yyerror2("invalid checksum [%s]", p->request_checksum);
+  } else
+    p->request_hashtype = 0;
+
+  if (port->SSL.use_ssl == TRUE) {
+    if (!have_ssl()) {
+      yyerror("ssl check cannot be activated. SSL is not supported");
+    } else {
+      if (port->SSL.certmd5 != NULL) {
+	p->SSL.certmd5 = port->SSL.certmd5;
+	cleanup_hash_string(p->SSL.certmd5);
+      }
+      p->SSL.use_ssl = TRUE;
+      p->SSL.version = port->SSL.version;
+    }
+  }
+  p->maxforward = port->maxforward;
+  p->next = current->portlist;
+  current->portlist = p;
+  
+  reset_portset();
+
+}
+
+
+/*
+ * Add a new resource object to the current service resource list
+ */
+static void addresource(Resource_T rr) {
+  Resource_T r;
+
+  ASSERT(rr);
+
+  NEW(r);
+  if (! Run.doprocess)
+    yyerror("Cannot activate service check. The process status engine was disabled. On certain systems you must run monit as root to utilize this feature)\n");
+  r->resource_id = rr->resource_id;
+  r->limit       = rr->limit;
+  r->action      = rr->action;
+  r->operator    = rr->operator;
+  r->next        = current->resourcelist;
+
+  current->resourcelist = r;
+  reset_resourceset();
+}
+
+
+/*
+ * Add a new file object to the current service timestamp list
+ */
+static void addtimestamp(Timestamp_T ts, int notime) {
+  Timestamp_T t;
+
+  ASSERT(ts);
+
+  NEW(t);
+  t->operator     = ts->operator;
+  t->time         = ts->time;
+  t->action       = ts->action;
+  t->test_changes = ts->test_changes;
+  
+  if (t->test_changes || notime) {
+    if (! file_exist(current->path)) {
+      DEBUG("%s: Debug: the path '%s' used in the TIMESTAMP statement refer to a non-existing object\n", prog, current->path);
+    } else if (!(t->timestamp = file_getTimestamp(current->path, S_IFDIR|S_IFREG))) {
+      yyerror2("cannot get the timestamp for '%s'", current->path);
+    }
+  }
+  
+  t->next = current->timestamplist;
+  current->timestamplist = t;
+
+  reset_timestampset();
+}
+
+
+/*
+ * Add a new object to the current service actionrate list
+ */
+static void addactionrate(ActionRate_T ar) {
+  ActionRate_T a;
+
+  ASSERT(ar);
+
+  if (ar->count > ar->cycle)
+    yyerror2("the number of restarts must be less than poll cycles");
+  if (ar->count <= 0 || ar->cycle <= 0)
+    yyerror2("zero or negative values not allowed in a action rate statement");
+
+  NEW(a);
+  a->count  = ar->count;
+  a->cycle  = ar->cycle;
+  a->action = ar->action;
+
+  a->next = current->actionratelist;
+  current->actionratelist = a;
+
+  reset_actionrateset();
+}
+
+
+
+/*
+ * Add a new Size object to the current service size list
+ */
+static void addsize(Size_T ss) {
+  Size_T s;
+  struct stat buf;
+
+  ASSERT(ss);
+
+  NEW(s);
+  s->operator     = ss->operator;
+  s->size         = ss->size;
+  s->action       = ss->action;
+  s->test_changes = ss->test_changes;
+  /* Get the initial size for future comparision, if the file exists */
+  if (s->test_changes) {
+    s->test_changes_ok = !stat(current->path, &buf);
+    if (s->test_changes_ok)
+      s->size = (unsigned long long)buf.st_size;
+  }
+ 
+  s->next = current->sizelist;
+  current->sizelist = s;
+
+  reset_sizeset();
+}
+
+
+/*
+ * Add a new Uptime object to the current service uptime list
+ */
+static void adduptime(Uptime_T uu) {
+  Uptime_T u;
+
+  ASSERT(uu);
+
+  NEW(u);
+  u->operator = uu->operator;
+  u->uptime = uu->uptime;
+  u->action = uu->action;
+
+  u->next = current->uptimelist;
+  current->uptimelist = u;
+
+  reset_uptimeset();
+}
+
+
+/*
+ * Set Checksum object in the current service
+ */
+static void addchecksum(Checksum_T cs) {
+
+  int len;
+  Checksum_T c;
+
+  ASSERT(cs);
+
+  cs->test_changes_ok = TRUE;
+
+  if (! *cs->hash) {
+    if (cs->type == HASH_UNKNOWN)
+      cs->type = DEFAULT_HASH;
+    if ( !(Util_getChecksum(current->path, cs->type, cs->hash, sizeof(cs->hash)))) {
+      if (cs->test_changes == TRUE) {
+        /* If the file doesn't exist and we're checking for checksum changes, set dummy value */
+        cs->test_changes_ok = FALSE;
+        snprintf(cs->hash, sizeof(cs->hash), "00000000000000000000000000000000");
+      } else {
+        yyerror2("cannot compute a checksum for file %s", current->path);
+        reset_checksumset();
+        return;
+      }
+    }
+  }
+
+  len = cleanup_hash_string(cs->hash);
+
+  if (cs->type == HASH_UNKNOWN) {
+    if (len == 32) {
+      cs->type = HASH_MD5;
+    } else if (len == 40) {
+      cs->type = HASH_SHA1;
+    } else {
+      yyerror2("invalid checksum [%s] for file %s", cs->hash, current->path);
+      reset_checksumset();
+      return;
+    }
+  } else if (( cs->type == HASH_MD5 && len!=32 ) || ( cs->type == HASH_SHA1 && len != 40 )) {
+    yyerror2("invalid checksum [%s] for file %s", cs->hash, current->path);
+    reset_checksumset();
+    return;
+  }
+
+  NEW(c);
+
+  c->type            = cs->type;
+  c->test_changes    = cs->test_changes;
+  c->test_changes_ok = cs->test_changes_ok;
+  c->action          = cs->action;
+  snprintf(c->hash, sizeof(c->hash), "%s", cs->hash);
+ 
+  current->checksum = c;
+
+  reset_checksumset();
+
+}
+
+
+/*
+ * Set Perm object in the current service
+ */
+static void addperm(Perm_T ps) {
+  Perm_T p;
+
+  ASSERT(ps);
+
+  NEW(p);
+  p->perm       = ps->perm;
+  p->action     = ps->action;
+  current->perm = p;
+  reset_permset();
+
+}
+
+
+static void appendmatch(Match_T *list, Match_T item) {
+  if (*list) {
+    /* Find the end of the list (keep the same patterns order as in the config file) */
+    Match_T last;
+    for (last = *list; last->next; last = last->next)
+      ;
+    last->next = item;
+  } else {
+    *list = item;
+  }
+}
+
+
+/*
+ * Set Match object in the current service
+ */
+static void addmatch(Match_T ms, int actionnumber, int linenumber) {
+  Match_T m;
+  int     reg_return;
+  
+  ASSERT(ms);
+
+  NEW(m);
+#ifdef HAVE_REGEX_H
+  NEW(m->regex_comp);
+#endif
+
+  m->match_string = ms->match_string;
+  m->match_path   = ms->match_path ? Str_dup(ms->match_path) : NULL;
+  m->action       = ms->action;
+  m->not          = ms->not;
+  m->ignore       = ms->ignore;
+  m->next         = NULL;
+
+  addeventaction(&(m->action), actionnumber, ACTION_IGNORE);
+
+#ifdef HAVE_REGEX_H
+  reg_return = regcomp(m->regex_comp, ms->match_string, REG_NOSUB|REG_EXTENDED);
+
+  if (reg_return != 0) {
+    char errbuf[STRLEN];
+    regerror(reg_return, ms->regex_comp, errbuf, STRLEN);
+    if (m->match_path != NULL) 
+      yyerror2("regex parsing error:%s on line %i of", errbuf, linenumber);
+    else
+      yyerror2("regex parsing error:%s", errbuf);
+  }
+#endif
+  appendmatch(m->ignore ? &current->matchignorelist : &current->matchlist, m);
+}
+
+
+static void addmatchpath(Match_T ms, int actionnumber) {
+
+  FILE *handle;
+  command_t savecommand = NULL;
+  char buf[2048];
+  int linenumber = 0;
+
+  ASSERT(ms->match_path);
+
+  handle = fopen(ms->match_path, "r");
+  if (handle == NULL) {
+    yyerror2("cannot read regex match file (%s)", ms->match_path);
+    return;
+  }
+  
+  while (!feof(handle)) {
+    size_t len;
+
+    linenumber++;
+    
+    if (! fgets(buf, 2048, handle))
+      continue;
+
+    len = strlen(buf);
+
+    if (len == 0 || buf[0] == '\n')
+      continue;
+
+    if (buf[len-1] == '\n')
+      buf[len-1] = 0;
+
+    ms->match_string = Str_dup(buf);
+
+    /* The addeventaction() called from addmatch() will reset the
+     * command1 to NULL, but we need to duplicate the command for
+     * each line, thus need to save it here */
+    if (actionnumber == ACTION_EXEC) {
+      if (command1 == NULL) {
+        ASSERT(savecommand);
+        command1 = savecommand;
+      }
+      savecommand = copycommand(command1);
+    }
+
+    addmatch(ms, actionnumber, linenumber);
+  }
+
+  if (actionnumber == ACTION_EXEC && savecommand)
+    gccmd(&savecommand);
+
+  fclose(handle);
+}
+
+
+/*
+ * Set program object in the current service
+ */
+static void addprogram(Program_T program) {
+        Program_T p;
+        ASSERT(program);
+        NEW(p);
+        p->return_value = program->return_value;
+        p->operator = program->operator;
+        p->action = program->action;
+        p->timeout = program->timeout;
+        p->C = program->C;
+        current->program = p;
+        reset_programset();
+}
+
+
+/*
+ * Set Uid object in the current service
+ */
+static void adduid(Uid_T us) {
+  Uid_T u;
+
+  ASSERT(us);
+
+  NEW(u);
+  u->uid       = us->uid;
+  u->action    = us->action;
+  current->uid = u;
+  reset_uidset();
+}
+
+
+/*
+ * Set Gid object in the current service
+ */
+static void addgid(Gid_T gs) {
+  Gid_T g;
+
+  ASSERT(gs);
+
+  NEW(g);
+  g->gid       = gs->gid;
+  g->action    = gs->action;
+  current->gid = g;
+  reset_gidset();
+}
+
+
+/*
+ * Add a new filesystem to the current service's filesystem list
+ */
+static void addfilesystem(Filesystem_T ds) {
+  Filesystem_T dev;
+
+  ASSERT(ds);
+  
+  NEW(dev);
+  dev->resource           = ds->resource;
+  dev->operator           = ds->operator;
+  dev->limit_absolute     = ds->limit_absolute;
+  dev->limit_percent      = ds->limit_percent;
+  dev->action             = ds->action;
+
+  dev->next               = current->filesystemlist;
+  current->filesystemlist = dev;
+
+  reset_filesystemset();
+
+}
+
+
+/*
+ * Add a new icmp object to the current service's icmp list
+ */
+static void addicmp(Icmp_T is) {
+  Icmp_T icmp;
+
+  ASSERT(is);
+
+  NEW(icmp);
+  icmp->type         = is->type;      
+  icmp->count        = is->count;
+  icmp->timeout      = is->timeout;
+  icmp->action       = is->action;
+  icmp->is_available = FALSE;
+  icmp->response     = -1;
+  
+  icmp->next         = current->icmplist;
+  current->icmplist  = icmp;
+
+  reset_icmpset();
+}
+
+
+/*
+ * Set EventAction object
+ */
+static void addeventaction(EventAction_T *_ea, int failed, int succeeded) {
+  EventAction_T ea;
+
+  ASSERT(_ea);
+
+  NEW(ea);
+  NEW(ea->failed);
+  NEW(ea->succeeded);
+
+  ea->failed->id     = failed;
+  ea->failed->count  = rate1.count;
+  ea->failed->cycles = rate1.cycles;
+  if (failed == ACTION_EXEC) {
+    ASSERT(command1);
+    ea->failed->exec = command1;
+    command1 = NULL;
+  }
+
+  ea->succeeded->id     = succeeded;
+  ea->succeeded->count  = rate2.count;
+  ea->succeeded->cycles = rate2.cycles;
+  if (succeeded == ACTION_EXEC) {
+    ASSERT(command2);
+    ea->succeeded->exec = command2;
+    command2 = NULL;
+  }
+  *_ea = ea;
+  reset_rateset();
+}
+
+
+/*
+ * Redefine EventAction object (used for default action overloading)
+ */
+static void seteventaction(EventAction_T *_ea, int failed, int succeeded) {
+  EventAction_T ea = *_ea;
+
+  ASSERT(ea);
+  ASSERT(ea->failed);
+  ASSERT(ea->succeeded);
+
+  ea->failed->id     = failed;
+  ea->failed->count  = rate1.count;
+  ea->failed->cycles = rate1.cycles;
+  if (failed == ACTION_EXEC) {
+    ASSERT(command1);
+    ea->failed->exec = command1;
+    command1 = NULL;
+  }
+
+  ea->succeeded->id     = succeeded;
+  ea->succeeded->count  = rate2.count;
+  ea->succeeded->cycles = rate2.cycles;
+  if (succeeded == ACTION_EXEC) {
+    ASSERT(command2);
+    ea->succeeded->exec = command2;
+    command2 = NULL;
+  }
+}
+
+
+/*
+ * Add a generic protocol handler to 
+ */
+static void addgeneric(Port_T port, char *send, char *expect) {
+  Generic_T g = port->generic;
+  
+  if (g == NULL) {
+    NEW(g);
+    port->generic = g;
+  } else {
+    while (g->next != NULL)
+      g = g->next;
+    NEW(g->next);
+    g = g->next;
+  }
+  
+  if (send != NULL) {
+    g->send = Str_dup(send);
+    g->expect = NULL;
+  } else if (expect != NULL) {
+#ifdef HAVE_REGEX_H
+    
+    int   reg_return;
+    NEW(g->expect);
+    reg_return = regcomp(g->expect, expect, REG_NOSUB|REG_EXTENDED);
+    if (reg_return != 0) {
+      char errbuf[STRLEN];
+      regerror(reg_return, g->expect, errbuf, STRLEN);
+      yyerror2("regex parsing error:%s", errbuf);
+    }
+#else
+    g->expect = Str_dup(expect);
+#endif
+    g->send = NULL;
+  } 
+}
+
+
+/*
+ * Add the current command object to the current service object's
+ * start or stop program.
+ */
+static void addcommand(int what, unsigned timeout) {
+
+  switch(what) {
+          case START:   current->start = command; break;
+          case STOP:    current->stop = command; break;
+          case RESTART: current->restart = command; break;
+  }
+
+  command->timeout = timeout;
+  
+  command = NULL;
+  
+}
+
+  
+/*
+ * Add a new argument to the argument list
+ */
+static void addargument(char *argument) {
+
+  ASSERT(argument);
+
+  if (! command) {
+    
+    NEW(command);
+    check_exec(argument);
+    
+  }
+  
+  command->arg[command->length++] = argument;
+  command->arg[command->length] = NULL;
+  
+  if (command->length >= ARGMAX)
+    yyerror("exceeded maximum number of program arguments");
+  
+}
+
+
+/*
+ * Setup a url request for the current port object
+ */
+static void prepare_urlrequest(URL_T U) {
+
+  ASSERT(U);
+  
+  portset.protocol = Protocol_get(Protocol_HTTP);
+
+  if (urlrequest == NULL)
+    NEW(urlrequest);
+  urlrequest->url = U;
+  portset.hostname = Str_dup(U->hostname);
+  check_hostname(portset.hostname);
+  portset.port = U->port;
+  portset.url_request = urlrequest;
+  portset.type = SOCK_STREAM;
+  portset.request = Str_cat("%s%s%s", U->path, U->query ? "?" : "", U->query ? U->query : "");
+  /* Only the HTTP protocol is supported for URLs.
+     See also the lexer if this is to be changed in
+     the future */
+  portset.protocol = Protocol_get(Protocol_HTTP);
+  if (IS(U->protocol, "https"))
+    portset.SSL.use_ssl = TRUE;
+  
+}
+
+
+/*
+ * Set the url request for a port
+ */
+static void  seturlrequest(int operator, char *regex) {
+  
+  ASSERT(regex);
+
+  if (! urlrequest)
+    NEW(urlrequest);
+  urlrequest->operator = operator;
+#ifdef HAVE_REGEX_H
+  {    
+    int reg_return;
+    NEW(urlrequest->regex);
+    reg_return = regcomp(urlrequest->regex, regex, REG_NOSUB|REG_EXTENDED);
+    if (reg_return != 0) {
+      char errbuf[STRLEN];
+      regerror(reg_return, urlrequest->regex, errbuf, STRLEN);
+      yyerror2("regex parsing error: %s", errbuf);
+    }
+  }
+#else
+  urlrequest->regex = Str_dup(regex);
+#endif
+
+}
+
+
+/*
+ * Add a new data recipient server to the mmonit server list
+ */
+static void addmmonit(URL_T url, int timeout, int sslversion, char *certmd5) {
+  Mmonit_T c;
+  
+  ASSERT(url);
+
+  NEW(c);
+  c->url = url;
+  if (!strcmp(c->url->protocol, "https")) {
+    if (!have_ssl()) {
+      yyerror("ssl check cannot be activated. SSL is not supported");
+    } else {
+      c->ssl.use_ssl = TRUE;
+      c->ssl.version = (sslversion == SSL_VERSION_NONE) ? SSL_VERSION_AUTO : sslversion;
+      if (certmd5) {
+	c->ssl.certmd5 = certmd5;
+	cleanup_hash_string(c->ssl.certmd5);
+      }
+    }
+  }
+  c->timeout = timeout;
+  c->next = NULL;
+
+  if (Run.mmonits) {
+    Mmonit_T C;
+    for (C = Run.mmonits; C->next; C = C->next)
+      /* Empty */ ;
+    C->next = c;
+  } else {
+    Run.mmonits = c;
+  }
+}
+
+
+/*
+ * Add a new smtp server to the mail server list
+ */
+static void addmailserver(MailServer_T mailserver) {
+
+  MailServer_T s;
+  
+  ASSERT(mailserver->host);
+
+  NEW(s);
+  s->host        = mailserver->host;
+  s->port        = mailserver->port;
+  s->username    = mailserver->username;
+  s->password    = mailserver->password;
+  s->ssl.use_ssl = mailserver->ssl.use_ssl;
+  s->ssl.version = mailserver->ssl.version;
+  s->ssl.certmd5 = mailserver->ssl.certmd5;
+
+  s->next = NULL;
+
+  if (Run.mailservers) {
+    MailServer_T l;
+    for (l = Run.mailservers; l->next; l = l->next) /* empty */;
+    l->next = s;
+  } else {
+    Run.mailservers = s;
+  }
+  
+  reset_mailserverset();
+}
+
+
+/*
+ * Return uid if found on the system. If the parameter user is NULL
+ * the uid parameter is used for looking up the user id on the system,
+ * otherwise the user parameter is used.
+ */
+static uid_t get_uid(char *user, uid_t uid) {
+  struct passwd *pwd;
+
+  if (user) {
+    pwd = getpwnam(user);
+
+    if (pwd == NULL) {
+      yyerror2("requested user not found on the system");
+      return(0);
+    }
+
+  } else {
+
+    if ( (pwd = getpwuid(uid)) == NULL ) {
+      yyerror2("requested uid not found on the system");
+      return(0);
+    }
+  }
+
+  return(pwd->pw_uid);
+
+}
+
+
+/*
+ * Return gid if found on the system. If the parameter group is NULL
+ * the gid parameter is used for looking up the group id on the system,
+ * otherwise the group parameter is used.
+ */
+static gid_t get_gid(char *group, gid_t gid) {
+  struct group *grd;
+
+  if (group) {
+    grd = getgrnam(group);
+
+    if (grd == NULL) {
+      yyerror2("requested group not found on the system");
+      return(0);
+    }
+
+  } else {
+
+    if ( (grd = getgrgid(gid)) == NULL ) {
+      yyerror2("requested gid not found on the system");
+      return(0);
+    }
+
+  }
+
+  return(grd->gr_gid);
+
+}
+
+
+/*
+ * Add a new user id to the current command object.
+ */
+static void addeuid(uid_t uid) {
+  if (!getuid()) {
+    command->has_uid = TRUE;
+    command->uid = uid;
+  } else
+    yyerror("uid statement requires root privileges");
+}
+
+
+/*
+ * Add a new group id to the current command object.
+ */
+static void addegid(gid_t gid) {
+  if (!getuid()) {
+    command->has_gid = TRUE;
+    command->gid = gid;
+  } else
+    yyerror("gid statement requires root privileges");
+}
+
+
+/*
+ * Reset the logfile if changed
+ */
+static void setlogfile(char *logfile) {
+  if (Run.logfile) {
+    if (IS(Run.logfile, logfile)) {
+      FREE(logfile);
+      return;
+    } else
+      FREE(Run.logfile);
+  }
+  Run.logfile = logfile;
+}
+
+
+/*
+ * Reset the pidfile if changed
+ */
+static void setpidfile(char *pidfile) {
+  if (Run.pidfile) {
+    if (IS(Run.pidfile, pidfile)) {
+      FREE(pidfile);
+      return;
+    } else
+      FREE(Run.pidfile);
+  }
+  Run.pidfile = pidfile;
+}
+
+
+/*
+ * Read a apache htpasswd file and add credentials found for username
+ */
+static void addhtpasswdentry(char *filename, char *username, int dtype) {
+  char *ht_username = NULL;
+  char *ht_passwd = NULL;
+  char buf[STRLEN];
+  FILE *handle = NULL;
+  int credentials_added = 0;
+  
+  ASSERT(filename);
+
+  handle = fopen(filename, "r");
+
+  if ( handle == NULL ) {
+    if (username != NULL)
+      yyerror2("cannot read htpasswd (%s)", filename);
+    else
+      yyerror2("cannot read htpasswd", filename);
+    return;
+  }
+  
+  while (!feof(handle)) {
+    char *colonindex = NULL;
+    int i;
+    
+    if (! fgets(buf, STRLEN, handle))
+      continue;
+
+    /* strip trailing non visible characters */
+    for (i = (int)strlen(buf)-1; i >= 0; i--) {
+      if ( buf[i] == ' '  || buf[i] == '\r' || buf[i] == '\n' || buf[i] == '\t' )
+        buf[i] ='\0';
+      else
+        break;
+    }
+
+    if ( NULL == (colonindex = strchr(buf, ':')))
+      continue;
+
+    ht_passwd = Str_dup(colonindex+1);
+    *colonindex = '\0';
+
+    /* In case we have a file in /etc/passwd or /etc/shadow style we
+     *  want to remove ":.*$" and Crypt and MD5 hashed dont have a colon
+     */ 
+    
+    if ( (NULL != (colonindex = strchr(ht_passwd, ':'))) && ( dtype != DIGEST_CLEARTEXT) )
+      *colonindex = '\0';
+
+    ht_username = Str_dup(buf);
+
+    if (username == NULL) {
+      if (addcredentials(ht_username, ht_passwd, dtype, FALSE))
+        credentials_added++;
+    } else if (strcmp(username, ht_username) == 0)  {
+      if (addcredentials(ht_username, ht_passwd, dtype, FALSE))
+        credentials_added++;
+    } else {
+      FREE(ht_passwd);
+      FREE(ht_username);
+    }
+  }
+
+  if (credentials_added == 0) {
+    if ( username == NULL )
+      yywarning2("htpasswd file (%s) has no usable credentials", filename);
+    else
+      yywarning2("htpasswd file (%s) has no usable credentials for user %s", filename, username);
+  }
+  fclose(handle);
+}
+
+
+#ifdef HAVE_LIBPAM
+static void addpamauth(char* groupname, int readonly) {
+  Auth_T c = NULL;
+  Auth_T prev = NULL;
+
+  ASSERT(groupname);
+
+  if (Run.credentials == NULL)
+    NEW(Run.credentials);
+
+  c = Run.credentials;
+  do {
+    if (c->groupname != NULL && IS(c->groupname, groupname)) {
+      yywarning2("PAM group %s was added already, entry ignored", groupname);
+      FREE(groupname);
+      return;
+    }
+    prev = c;
+    c = c->next;
+  } while (c != NULL);
+
+  NEW(prev->next);
+  c = prev->next;
+
+  c->next        = NULL;
+  c->uname       = NULL;
+  c->passwd      = NULL;
+  c->groupname   = groupname;
+  c->digesttype  = DIGEST_PAM;
+  c->is_readonly = readonly;
+  
+  DEBUG("%s: Adding PAM group '%s'.\n", prog, groupname); 
+
+  return;
+}
+#endif
+
+
+/*
+ * Add Basic Authentication credentials
+ */
+static int addcredentials(char *uname, char *passwd, int dtype, int readonly) {
+  Auth_T c;
+
+  ASSERT(uname);
+  ASSERT(passwd);
+
+  if (Run.credentials == NULL) {
+    NEW(Run.credentials);
+    c = Run.credentials;
+  } else {
+
+    if (Util_getUserCredentials(uname) != NULL) {
+      yywarning2("credentials for user %s were already added, entry ignored", uname);
+      FREE(uname);
+      FREE(passwd);
+      return FALSE;
+    }
+
+    c = Run.credentials;
+
+    while ( c->next != NULL )
+      c = c->next;
+
+    NEW(c->next);
+    c = c->next;
+        
+  }
+  
+  c->next        = NULL;
+  c->uname       = uname;
+  c->passwd      = passwd;
+  c->groupname   = NULL;
+  c->digesttype  = dtype;
+  c->is_readonly = readonly;
+  
+  DEBUG("%s: Debug: Adding credentials for user '%s'.\n", prog, uname); 
+  
+  return TRUE;
+  
+}
+
+
+/*
+ * Set the syslog and the facilities to be used
+ */
+static void setsyslog(char *facility) {
+
+  if (!Run.logfile || ihp.logfile) {
+    ihp.logfile = TRUE;
+    setlogfile(Str_dup("syslog"));
+    Run.use_syslog = TRUE;
+    Run.dolog = TRUE;
+  }
+
+  if (facility) {
+    if (IS(facility,"log_local0"))
+      Run.facility = LOG_LOCAL0;
+    else if (IS(facility, "log_local1"))
+      Run.facility = LOG_LOCAL1;
+    else if (IS(facility, "log_local2"))
+      Run.facility = LOG_LOCAL2;
+    else if (IS(facility, "log_local3"))
+      Run.facility = LOG_LOCAL3;
+    else if (IS(facility, "log_local4"))
+      Run.facility = LOG_LOCAL4;
+    else if (IS(facility, "log_local5"))
+      Run.facility = LOG_LOCAL5;
+    else if (IS(facility, "log_local6"))
+      Run.facility = LOG_LOCAL6;
+    else if (IS(facility, "log_local7"))
+      Run.facility = LOG_LOCAL7;
+    else if (IS(facility, "log_daemon"))
+      Run.facility = LOG_DAEMON;
+    else
+      yyerror2("invalid syslog facility");
+  } else {
+    Run.facility = LOG_USER;
+  }
+  
+}
+
+
+/*
+ * Reset the current mailset for reuse
+ */
+static void reset_mailset() {
+  memset(&mailset, 0, sizeof(struct mymail));
+}
+
+
+/*
+ * Reset the mailserver set to default values
+ */
+static void reset_mailserverset() {
+  memset(&mailserverset, 0, sizeof(struct mymailserver));
+  mailserverset.port = PORT_SMTP;
+  mailserverset.ssl.use_ssl = FALSE;
+  mailserverset.ssl.version = SSL_VERSION_AUTO;
+}
+
+
+/*
+ * Reset the Port set to default values
+ */
+static void reset_portset() {
+  memset(&portset, 0, sizeof(struct myport));
+  portset.socket = -1;
+  portset.type = SOCK_STREAM;
+  portset.family = AF_INET;
+  portset.SSL.version = SSL_VERSION_AUTO;
+  portset.timeout = NET_TIMEOUT;
+  portset.retry = 1;
+  portset.maxforward = 70;
+  urlrequest = NULL;
+}
+
+
+/*
+ * Reset the Proc set to default values
+ */
+static void reset_resourceset() {
+  resourceset.resource_id = 0;
+  resourceset.limit = 0;
+  resourceset.action = NULL;
+  resourceset.operator = OPERATOR_EQUAL;
+}
+
+
+/*
+ * Reset the Timestamp set to default values
+ */
+static void reset_timestampset() {
+  timestampset.operator = OPERATOR_EQUAL;
+  timestampset.time = 0;
+  timestampset.test_changes = FALSE;
+  timestampset.action = NULL;
+}
+
+
+/*
+ * Reset the ActionRate set to default values
+ */
+static void reset_actionrateset() {
+  actionrateset.count = 0;
+  actionrateset.cycle = 0;
+  actionrateset.action = NULL;
+}
+
+
+/*
+ * Reset the Size set to default values
+ */
+static void reset_sizeset() {
+  sizeset.operator = OPERATOR_EQUAL;
+  sizeset.size = 0;
+  sizeset.test_changes = FALSE;
+  sizeset.action = NULL;
+}
+
+
+/*
+ * Reset the Uptime set to default values
+ */
+static void reset_uptimeset() {
+  uptimeset.operator = OPERATOR_EQUAL;
+  uptimeset.uptime = 0;
+  uptimeset.action = NULL;
+}
+
+
+/*
+ * Reset the Checksum set to default values
+ */
+static void reset_checksumset() {
+  checksumset.type         = HASH_UNKNOWN;
+  checksumset.test_changes = FALSE;
+  checksumset.action       = NULL;
+  *checksumset.hash        = 0;
+}
+
+
+/*
+ * Reset the Perm set to default values
+ */
+static void reset_permset() {
+  permset.perm = 0;
+  permset.action = NULL;
+}
+
+
+/*
+ * Reset the Status set to default values
+ */
+static void reset_programset() {
+        programset.return_value = 0;
+        programset.operator = OPERATOR_EQUAL;
+        programset.action = NULL;
+        programset.timeout = EXEC_TIMEOUT;
+        programset.started = 0;
+        programset.P = NULL;
+        programset.C = NULL;
+}
+
+
+/*
+ * Reset the Uid set to default values
+ */
+static void reset_uidset() {
+  uidset.uid = 0;
+  uidset.action = NULL;
+}
+
+
+/*
+ * Reset the Gid set to default values
+ */
+static void reset_gidset() {
+  gidset.gid = 0;
+  gidset.action = NULL;
+}
+
+
+/*
+ * Reset the Filesystem set to default values
+ */
+static void reset_filesystemset() {
+  filesystemset.resource = 0;
+  filesystemset.operator = OPERATOR_EQUAL;
+  filesystemset.limit_absolute = -1;
+  filesystemset.limit_percent = -1;
+  filesystemset.action = NULL;
+}
+
+
+/*
+ * Reset the ICMP set to default values
+ */
+static void reset_icmpset() {
+  icmpset.type = ICMP_ECHO;
+  icmpset.count = ICMP_ATTEMPT_COUNT;
+  icmpset.timeout = NET_TIMEOUT;
+  icmpset.action = NULL;
+}
+
+
+/*
+ * Reset the Rate set to default values
+ */
+static void reset_rateset() {
+  rate1.count  = 1;
+  rate1.cycles = 1;
+
+  rate2.count  = 1;
+  rate2.cycles = 1;
+}
+
+
+/* ---------------------------------------------------------------- Checkers */
+
+
+/*
+ * Check for unique service name
+ */
+static void check_name(char *name) {
+  ASSERT(name);
+
+  if (Util_existService(name) || (current && IS(name, current->name)))
+    yyerror2("service name conflict, %s already defined", name);
+  if (name && *name == '/')		
+          yyerror2("service name '%s' must not start with '/' -- ", name);	
+}
+
+
+/*
+ * Permission statement semantic check
+ */
+static int check_perm(int perm) {
+  int result;
+  char *status;
+  char buf[STRLEN];
+
+  snprintf(buf, STRLEN, "%d", perm);
+
+  result = (int)strtol(buf, &status, 8);
+
+  if ( *status != '\0' || result < 0 || result > 07777 )
+    yyerror2("permission statements must have an octal value between 0 and 7777");
+
+  return result;
+}
+
+
+/*
+ * Check hostname 
+ */
+static void check_hostname(char *hostname) {
+
+  ASSERT(hostname);
+
+  if (!check_host(hostname))
+    yywarning2("hostname did not resolve");
+}
+
+/*
+ * Check the dependency graph for errors
+ * by doing a topological sort, thereby finding any cycles.
+ * Assures that graph is a Directed Acyclic Graph (DAG).
+ */
+static void check_depend() {
+  Service_T s;
+  Service_T depends_on = NULL;
+  Service_T* dlt = &depend_list; /* the current tail of it                                 */
+  int done;                      /* no unvisited nodes left?                               */
+  int found_some;                /* last iteration found anything new ?                    */
+  depend_list = NULL;            /* depend_list will be the topological sorted servicelist */
+
+  do { 
+    done = TRUE;
+    found_some = FALSE; 
+    for (s = servicelist; s; s = s->next) {
+        Dependant_T d;
+      if (s->visited)
+	  continue;
+      done = FALSE; // still unvisited nodes
+      depends_on = NULL;
+      for (d = s->dependantlist; d; d = d->next) {
+        Service_T dp = Util_getService(d->dependant);
+        if (!dp) {
+          LogError("%s: Error: Depend service '%s' is not defined in the control file\n", prog, d->dependant);
+          exit(1);
+        }
+        if (!dp->visited) {
+          depends_on = dp;
+        }
+      }
+
+      if (!depends_on) {
+        s->visited = TRUE;
+        found_some = TRUE;
+        *dlt = s;
+        dlt = &s->next_depend;
+      }
+    }
+  } while (found_some && !done);
+	
+  if (!done) {
+        ASSERT(depends_on);
+	LogError("%s: Error: Found a depend loop in the control file involving the service '%s'\n", prog, depends_on->name);
+	exit(1);
+   } 
+
+  ASSERT(depend_list);
+  servicelist = depend_list;
+    
+  for (s = depend_list; s; s = s->next_depend)
+    s->next = s->next_depend;
+    
+  reset_depend();
+}
+
+
+/*
+ * Check if the executable exist
+ */
+static void check_exec(char *exec) {
+        if (! File_exist(exec))
+                yywarning2("Program does not exist:");
+        else if (! File_isExecutable(exec))
+                yywarning2("Program is not executable:");
+}
+ 
+ 
+/* Return a valid max forward value for SIP header */
+static int verifyMaxForward(int mf) { 
+  int max = 70;
+  
+  if (mf >= 0 && mf <= 255)
+    max = mf;
+  else
+    yywarning2("SIP max forward is outside the range [0..255]. Setting max forward to 70");
+  
+  return max;
+}
+
+
+/* -------------------------------------------------------------------- Misc */
+
+
+/*
+ * Cleans up an md5 string, tolower and remove byte separators
+ */
+static int cleanup_hash_string(char *hashstring) {
+  int i = 0, j = 0;
+
+  ASSERT(hashstring);
+
+  while (hashstring[i] != '\0') {
+    if (isxdigit((int) hashstring[i])) {
+      hashstring[j] = tolower((int)hashstring[i]);
+      j++;
+    } 
+    i++;
+  }
+  hashstring[j] = '\0';
+  return j;
+}
+
+
+/* Return deep copy of the command */
+static command_t copycommand(command_t source) {
+  int i;
+  command_t copy = NULL;
+
+  NEW(copy);
+  copy->length = source->length;
+  copy->has_uid = source->has_uid;
+  copy->uid = source->uid;
+  copy->has_gid = source->has_gid;
+  copy->gid = source->gid;
+  copy->timeout = source->timeout;
+  for (i = 0; i < copy->length; i++)
+     copy->arg[i] = Str_dup(source->arg[i]);
+  copy->arg[copy->length] = NULL;
+
+  return copy;
+}
+
+
diff --git a/monit.patches/monit-50.description b/monit.patches/monit-50.description
new file mode 100644
index 0000000..16b2b97
--- /dev/null
+++ b/monit.patches/monit-50.description
@@ -0,0 +1 @@
+This patch prints out a human reabable string indicating why the preceding fork call failed.
diff --git a/monit.patches/monit-50.patch b/monit.patches/monit-50.patch
new file mode 100644
index 0000000..8fb8b7c
--- /dev/null
+++ b/monit.patches/monit-50.patch
@@ -0,0 +1,12 @@
+diff -aruN a/src/spawn.c b/src/spawn.c
+--- a/src/spawn.c	2012-05-06 02:40:45.000000000 -0700
++++ b/src/spawn.c	2013-03-16 16:31:41.808861381 -0700
+@@ -157,7 +157,7 @@
+         
+         pid= fork();
+         if(pid < 0) {
+-                LogError("Cannot fork a new process\n");  
++                LogError("Cannot fork a new process: %s\n", strerror(errno));  
+                 exit(1); 
+         }
+         
diff --git a/monit.tar.gz b/monit.tar.gz
new file mode 100644
index 0000000..adaafb1
--- /dev/null
+++ b/monit.tar.gz
Binary files differ
diff --git a/monit.url b/monit.url
new file mode 100644
index 0000000..70bfc2f
--- /dev/null
+++ b/monit.url
@@ -0,0 +1 @@
+http://mmonit.com/monit/dist/monit-5.4.tar.gz
diff --git a/monit.version b/monit.version
new file mode 100644
index 0000000..37c2d99
--- /dev/null
+++ b/monit.version
@@ -0,0 +1 @@
+5.4
