diff --git a/core/org.eclipse.ptp.doc.isv/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.doc.isv/META-INF/MANIFEST.MF
index 6f32944..2bb7991 100644
--- a/core/org.eclipse.ptp.doc.isv/META-INF/MANIFEST.MF
+++ b/core/org.eclipse.ptp.doc.isv/META-INF/MANIFEST.MF
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ptp.doc.isv;singleton:=true
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Bundle-Localization: plugin
 Bundle-Vendor: %providerName
diff --git a/core/org.eclipse.ptp.doc.isv/pom.xml b/core/org.eclipse.ptp.doc.isv/pom.xml
index cedb73b..a0da85e 100644
--- a/core/org.eclipse.ptp.doc.isv/pom.xml
+++ b/core/org.eclipse.ptp.doc.isv/pom.xml
@@ -7,12 +7,12 @@
 	<parent>
 		<groupId>org.eclipse.ptp</groupId>
 		<artifactId>ptp-parent</artifactId>
-		<version>9.3.0-SNAPSHOT</version>
+		<version>9.3.1-SNAPSHOT</version>
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>org.eclipse.ptp.doc.isv</artifactId>
-	<version>9.3.0-SNAPSHOT</version>
+	<version>9.3.1-SNAPSHOT</version>
 	<packaging>eclipse-plugin</packaging>
 
 	<build>
diff --git a/core/org.eclipse.ptp.proxy/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.proxy/META-INF/MANIFEST.MF
index f2ab0b2..c79ac64 100644
--- a/core/org.eclipse.ptp.proxy/META-INF/MANIFEST.MF
+++ b/core/org.eclipse.ptp.proxy/META-INF/MANIFEST.MF
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ptp.proxy
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Bundle-Vendor: %pluginProvider
 Bundle-Localization: plugin
diff --git a/core/org.eclipse.ptp.proxy/pom.xml b/core/org.eclipse.ptp.proxy/pom.xml
index 05dd035..b63fff8 100644
--- a/core/org.eclipse.ptp.proxy/pom.xml
+++ b/core/org.eclipse.ptp.proxy/pom.xml
@@ -6,12 +6,12 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp.proxy</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   
     <build>
diff --git a/core/org.eclipse.ptp.utils/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.utils/META-INF/MANIFEST.MF
index cef7221..0e92afb 100644
--- a/core/org.eclipse.ptp.utils/META-INF/MANIFEST.MF
+++ b/core/org.eclipse.ptp.utils/META-INF/MANIFEST.MF
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ptp.utils
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Bundle-Vendor: %pluginProvider
 Bundle-Localization: plugin
diff --git a/core/org.eclipse.ptp.utils/pom.xml b/core/org.eclipse.ptp.utils/pom.xml
index f9252a1..9a0cac4 100644
--- a/core/org.eclipse.ptp.utils/pom.xml
+++ b/core/org.eclipse.ptp.utils/pom.xml
@@ -6,12 +6,12 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp.utils</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   
     <build>
diff --git a/core/pom.xml b/core/pom.xml
index 676e678..6bf1129 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>core-parent</artifactId>
diff --git a/debug/org.eclipse.ptp.debug.sdm/META-INF/MANIFEST.MF b/debug/org.eclipse.ptp.debug.sdm/META-INF/MANIFEST.MF
index e599f9e..af844fa 100644
--- a/debug/org.eclipse.ptp.debug.sdm/META-INF/MANIFEST.MF
+++ b/debug/org.eclipse.ptp.debug.sdm/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ptp.debug.sdm
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Bundle-Vendor: %pluginProvider
 Require-Bundle: org.eclipse.ptp.proxy,
  org.eclipse.ptp.utils
diff --git a/debug/org.eclipse.ptp.debug.sdm/pom.xml b/debug/org.eclipse.ptp.debug.sdm/pom.xml
index dfc9a29..0ad3351 100644
--- a/debug/org.eclipse.ptp.debug.sdm/pom.xml
+++ b/debug/org.eclipse.ptp.debug.sdm/pom.xml
@@ -6,12 +6,12 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp.debug.sdm</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   
   	<build>
diff --git a/debug/pom.xml b/debug/pom.xml
index 5103190..43c0f31 100644
--- a/debug/pom.xml
+++ b/debug/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>debug-parent</artifactId>
diff --git a/pom.xml b/pom.xml
index 9001c68..6a11929 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
 
 	<groupId>org.eclipse.ptp</groupId>
 	<artifactId>ptp-parent</artifactId>
-	<version>9.3.0-SNAPSHOT</version>
+	<version>9.3.1-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>PTP Parent</name>
 
@@ -186,7 +186,7 @@
 						<artifact>
 							<groupId>org.eclipse.ptp</groupId>
 							<artifactId>org.eclipse.ptp.target</artifactId>
-							<version>9.3.0-SNAPSHOT</version>
+							<version>9.3.1-SNAPSHOT</version>
 							<classifier>photon</classifier>
 						</artifact>
 					</target>
diff --git a/rdt/pom.xml b/rdt/pom.xml
index 2ced01a..1fa688d 100644
--- a/rdt/pom.xml
+++ b/rdt/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>rdt-parent</artifactId>
diff --git a/releng/org.eclipse.ptp-feature/feature.xml b/releng/org.eclipse.ptp-feature/feature.xml
index 0d8286e..7844e7c 100644
--- a/releng/org.eclipse.ptp-feature/feature.xml
+++ b/releng/org.eclipse.ptp-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp-feature/pom.xml b/releng/org.eclipse.ptp-feature/pom.xml
index 5d62635..a4001df 100644
--- a/releng/org.eclipse.ptp-feature/pom.xml
+++ b/releng/org.eclipse.ptp-feature/pom.xml
@@ -6,12 +6,12 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
   <groupId>org.eclipse.ptp.features</groupId>
 </project>
diff --git a/releng/org.eclipse.ptp.aix/META-INF/MANIFEST.MF b/releng/org.eclipse.ptp.aix/META-INF/MANIFEST.MF
index aa5785c..7012afd 100644
--- a/releng/org.eclipse.ptp.aix/META-INF/MANIFEST.MF
+++ b/releng/org.eclipse.ptp.aix/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %fragmentName
 Bundle-SymbolicName: org.eclipse.ptp.aix;singleton:=true
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Fragment-Host: org.eclipse.ptp.core;bundle-version="2.0.0"
 Bundle-Localization: plugin
 Bundle-Vendor: %pluginProvider
diff --git a/releng/org.eclipse.ptp.cdt.compilers-feature/feature.xml b/releng/org.eclipse.ptp.cdt.compilers-feature/feature.xml
index d25488d..d70c81d 100644
--- a/releng/org.eclipse.ptp.cdt.compilers-feature/feature.xml
+++ b/releng/org.eclipse.ptp.cdt.compilers-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.cdt.compilers"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.core-feature/feature.xml b/releng/org.eclipse.ptp.core-feature/feature.xml
index 8c4d4ea..a53f467 100644
--- a/releng/org.eclipse.ptp.core-feature/feature.xml
+++ b/releng/org.eclipse.ptp.core-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.core"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.core.source-feature/feature.xml b/releng/org.eclipse.ptp.core.source-feature/feature.xml
index dc92eab..c5c6ced 100644
--- a/releng/org.eclipse.ptp.core.source-feature/feature.xml
+++ b/releng/org.eclipse.ptp.core.source-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.core.source"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"      
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.etfw-feature/feature.xml b/releng/org.eclipse.ptp.etfw-feature/feature.xml
index 0c96957..90215a9 100644
--- a/releng/org.eclipse.ptp.etfw-feature/feature.xml
+++ b/releng/org.eclipse.ptp.etfw-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.etfw"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.etfw.feedback.perfsuite-feature/feature.xml b/releng/org.eclipse.ptp.etfw.feedback.perfsuite-feature/feature.xml
index f3762db..c9dc7d7 100644
--- a/releng/org.eclipse.ptp.etfw.feedback.perfsuite-feature/feature.xml
+++ b/releng/org.eclipse.ptp.etfw.feedback.perfsuite-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.etfw.feedback.perfsuite"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.etfw.tau-feature/feature.xml b/releng/org.eclipse.ptp.etfw.tau-feature/feature.xml
index 2dd228f..21ba680 100644
--- a/releng/org.eclipse.ptp.etfw.tau-feature/feature.xml
+++ b/releng/org.eclipse.ptp.etfw.tau-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.etfw.tau"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.etfw.tau.fortran-feature/feature.xml b/releng/org.eclipse.ptp.etfw.tau.fortran-feature/feature.xml
index 9eb1b7e..56ca5f5 100644
--- a/releng/org.eclipse.ptp.etfw.tau.fortran-feature/feature.xml
+++ b/releng/org.eclipse.ptp.etfw.tau.fortran-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.etfw.tau.fortran"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.fortran-feature/feature.xml b/releng/org.eclipse.ptp.fortran-feature/feature.xml
index 65e5f66..0f2c61f 100644
--- a/releng/org.eclipse.ptp.fortran-feature/feature.xml
+++ b/releng/org.eclipse.ptp.fortran-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.fortran"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.gem-feature/.project b/releng/org.eclipse.ptp.gem-feature/.project
deleted file mode 100644
index 36a70cf..0000000
--- a/releng/org.eclipse.ptp.gem-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.gem-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.gem-feature/build.properties b/releng/org.eclipse.ptp.gem-feature/build.properties
deleted file mode 100644
index bb3da8d..0000000
--- a/releng/org.eclipse.ptp.gem-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               epl-v10.html
diff --git a/releng/org.eclipse.ptp.gem-feature/eclipse_update_120.jpg b/releng/org.eclipse.ptp.gem-feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/releng/org.eclipse.ptp.gem-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/releng/org.eclipse.ptp.gem-feature/epl-v10.html b/releng/org.eclipse.ptp.gem-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.gem-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.gem-feature/feature.properties b/releng/org.eclipse.ptp.gem-feature/feature.properties
deleted file mode 100644
index d2817d7..0000000
--- a/releng/org.eclipse.ptp.gem-feature/feature.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# "featureName" property - name of the feature
-featureName=PTP Graphical Explorer of MPI Programs (GEM)
-
-# "providerName" property - name of the company that provides the feature
-featureProvider=Eclipse PTP
-
-# "description" property - description of the feature
-description=GEM is a tool for deadlock detection and other formal analyses in MPI C/C++ applications. \n
-GEM serves as a graphical front end for In-situ Partial Order (ISP), \n\
-a dynamic formal verification tool for MPI developed at the School of Computing, University of Utah. \n\
-Whether you are new to MPI or are an advanced user, GEM will help you debug your MPI programs, \n\
-and graphically show many valuable facts, including all the possible send/receive matches, \n\
-and synchronizations. GEM also includes features to help users understand and debug the program across \n\
-all platforms on which it may be run (e.g. highlighting deadlocks that may occur due to differing \n\
-communication buffer allocations). For a given test harness, GEM  will allow you to explore only \n\
-the relevant process interleavings, which are much smaller than the number of total feasible interleavings. \n
-GEM also guarantees to discover and explore all non-deterministic matches at runtime.
-
-# copyright
-copyright=\
-Copyright (c) 2009 University of Utah School of Computing\
-50 S Central Campus Dr. 3190 Salt Lake City, UT 84112\
-http://www.cs.utah.edu/formal_verification/\
-\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
diff --git a/releng/org.eclipse.ptp.gem-feature/feature.xml b/releng/org.eclipse.ptp.gem-feature/feature.xml
deleted file mode 100644
index 9dce454..0000000
--- a/releng/org.eclipse.ptp.gem-feature/feature.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.gem"
-      label="%featureName"
-      version="9.3.0.qualifier"
-      provider-name="%featureProvider"
-      license-feature="org.eclipse.license"
-      license-feature-version="0.0.0">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright url="http://www.example.com/copyright">
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.console"/>
-      <import plugin="org.eclipse.osgi" version="3.4.3" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.gem"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.gem.help"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.linux/META-INF/MANIFEST.MF b/releng/org.eclipse.ptp.linux/META-INF/MANIFEST.MF
index 6e0d229..1aa3bb5 100644
--- a/releng/org.eclipse.ptp.linux/META-INF/MANIFEST.MF
+++ b/releng/org.eclipse.ptp.linux/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %fragmentName
 Bundle-SymbolicName: org.eclipse.ptp.linux;singleton:=true
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Fragment-Host: org.eclipse.ptp.core;bundle-version="2.0.0"
 Bundle-Localization: plugin
 Bundle-Vendor: %pluginProvider
diff --git a/releng/org.eclipse.ptp.macosx/META-INF/MANIFEST.MF b/releng/org.eclipse.ptp.macosx/META-INF/MANIFEST.MF
index d0f6944..5066eb3 100644
--- a/releng/org.eclipse.ptp.macosx/META-INF/MANIFEST.MF
+++ b/releng/org.eclipse.ptp.macosx/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %fragmentName
 Bundle-SymbolicName: org.eclipse.ptp.macosx;singleton:=true
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Fragment-Host: org.eclipse.ptp.core;bundle-version="2.0.0"
 Bundle-Localization: plugin
 Bundle-Vendor: %pluginProvider
diff --git a/releng/org.eclipse.ptp.pldt-feature/feature.xml b/releng/org.eclipse.ptp.pldt-feature/feature.xml
index a699a70..195ce31 100644
--- a/releng/org.eclipse.ptp.pldt-feature/feature.xml
+++ b/releng/org.eclipse.ptp.pldt-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.pldt"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.pldt.fortran-feature/feature.xml b/releng/org.eclipse.ptp.pldt.fortran-feature/feature.xml
index 22b03f7..b3233c8 100644
--- a/releng/org.eclipse.ptp.pldt.fortran-feature/feature.xml
+++ b/releng/org.eclipse.ptp.pldt.fortran-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.pldt.fortran"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.pldt.upc-feature/feature.xml b/releng/org.eclipse.ptp.pldt.upc-feature/feature.xml
index e5139e2..5995914 100644
--- a/releng/org.eclipse.ptp.pldt.upc-feature/feature.xml
+++ b/releng/org.eclipse.ptp.pldt.upc-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.pldt.upc"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rdt.sync-feature/feature.xml b/releng/org.eclipse.ptp.rdt.sync-feature/feature.xml
index df48032..04e4cbc 100644
--- a/releng/org.eclipse.ptp.rdt.sync-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rdt.sync-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rdt.sync"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rdt.sync.cdt-feature/feature.xml b/releng/org.eclipse.ptp.rdt.sync.cdt-feature/feature.xml
index 7e62232..f871c7e 100644
--- a/releng/org.eclipse.ptp.rdt.sync.cdt-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rdt.sync.cdt-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rdt.sync.cdt"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rdt.sync.fortran-feature/feature.xml b/releng/org.eclipse.ptp.rdt.sync.fortran-feature/feature.xml
index fe3594a..cfa1ec5 100644
--- a/releng/org.eclipse.ptp.rdt.sync.fortran-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rdt.sync.fortran-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rdt.sync.fortran"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.remote-feature/feature.xml b/releng/org.eclipse.ptp.remote-feature/feature.xml
index 2446813..e2e2540 100644
--- a/releng/org.eclipse.ptp.remote-feature/feature.xml
+++ b/releng/org.eclipse.ptp.remote-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.remote"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.remote.terminal-feature/feature.xml b/releng/org.eclipse.ptp.remote.terminal-feature/feature.xml
index b46ef31..397acb4 100644
--- a/releng/org.eclipse.ptp.remote.terminal-feature/feature.xml
+++ b/releng/org.eclipse.ptp.remote.terminal-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.remote.terminal"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.repo/pom.xml b/releng/org.eclipse.ptp.repo/pom.xml
index f8eb366..8371302 100644
--- a/releng/org.eclipse.ptp.repo/pom.xml
+++ b/releng/org.eclipse.ptp.repo/pom.xml
@@ -7,12 +7,12 @@
 	<parent>
 		<groupId>org.eclipse.ptp</groupId>
 		<artifactId>ptp-parent</artifactId>
-		<version>9.3.0-SNAPSHOT</version>
+		<version>9.3.1-SNAPSHOT</version>
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>org.eclipse.ptp.repo</artifactId>
-	<version>9.3.0-SNAPSHOT</version>
+	<version>9.3.1-SNAPSHOT</version>
 	<packaging>eclipse-repository</packaging>
 	<profiles>
 		<profile>
diff --git a/releng/org.eclipse.ptp.rm.ibm.ll-feature/feature.xml b/releng/org.eclipse.ptp.rm.ibm.ll-feature/feature.xml
index 4a9359b8..31007ac 100644
--- a/releng/org.eclipse.ptp.rm.ibm.ll-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rm.ibm.ll-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rm.ibm.ll"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rm.ibm.pe-feature/feature.xml b/releng/org.eclipse.ptp.rm.ibm.pe-feature/feature.xml
index e517d46..061efda 100644
--- a/releng/org.eclipse.ptp.rm.ibm.pe-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rm.ibm.pe-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rm.ibm.pe"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rm.ibm.platform.lsf-feature/feature.xml b/releng/org.eclipse.ptp.rm.ibm.platform.lsf-feature/feature.xml
index 7764eda..4453bc0 100644
--- a/releng/org.eclipse.ptp.rm.ibm.platform.lsf-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rm.ibm.platform.lsf-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rm.ibm.platform.lsf"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rm.jaxb.contrib-feature/feature.xml b/releng/org.eclipse.ptp.rm.jaxb.contrib-feature/feature.xml
index 9e3e3f1..57396d5 100644
--- a/releng/org.eclipse.ptp.rm.jaxb.contrib-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rm.jaxb.contrib-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rm.jaxb.contrib"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.rm.slurm-feature/feature.xml b/releng/org.eclipse.ptp.rm.slurm-feature/feature.xml
index fef3931..3696277 100644
--- a/releng/org.eclipse.ptp.rm.slurm-feature/feature.xml
+++ b/releng/org.eclipse.ptp.rm.slurm-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.rm.slurm"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.sci-feature/.project b/releng/org.eclipse.ptp.sci-feature/.project
deleted file mode 100644
index e470749..0000000
--- a/releng/org.eclipse.ptp.sci-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.sci-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.sci-feature/build.properties b/releng/org.eclipse.ptp.sci-feature/build.properties
deleted file mode 100644
index bb3da8d..0000000
--- a/releng/org.eclipse.ptp.sci-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               epl-v10.html
diff --git a/releng/org.eclipse.ptp.sci-feature/eclipse_update_120.jpg b/releng/org.eclipse.ptp.sci-feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/releng/org.eclipse.ptp.sci-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/releng/org.eclipse.ptp.sci-feature/epl-v10.html b/releng/org.eclipse.ptp.sci-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.sci-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.sci-feature/feature.properties b/releng/org.eclipse.ptp.sci-feature/feature.properties
deleted file mode 100644
index dfbcb9a..0000000
--- a/releng/org.eclipse.ptp.sci-feature/feature.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-
-
-# "featureName" property - name of the feature
-featureName=PTP Scalable Communication Infrastructure (SCI)
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse PTP
-
-# "description" property - description of the feature
-description=Parallel Tools Platform components that implements the Scalable Communication Infrastructure (SCI)
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Parallel Tools Platform Updates
-
-# copyright
-copyright=\
-Copyright (c) 2010 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
diff --git a/releng/org.eclipse.ptp.sci-feature/feature.xml b/releng/org.eclipse.ptp.sci-feature/feature.xml
deleted file mode 100644
index a5ad7ff..0000000
--- a/releng/org.eclipse.ptp.sci-feature/feature.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.sci"
-      label="%featureName"
-      version="9.3.0.qualifier"
-      provider-name="%providerName"
-      license-feature="org.eclipse.license"
-      license-feature-version="0.0.0">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <plugin
-         id="org.eclipse.ptp.sci"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.sci-feature/pom.xml b/releng/org.eclipse.ptp.sci-feature/pom.xml
deleted file mode 100644
index 88fb814..0000000
--- a/releng/org.eclipse.ptp.sci-feature/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.eclipse.ptp</groupId>
-    <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
-    <relativePath>../../pom.xml</relativePath>
-  </parent>
-
-  <artifactId>org.eclipse.ptp.sci</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
-  <packaging>eclipse-feature</packaging>
-  <groupId>org.eclipse.ptp.features</groupId>
-</project>
diff --git a/releng/org.eclipse.ptp.sdk-feature/feature.xml b/releng/org.eclipse.ptp.sdk-feature/feature.xml
index 6e3516f..ecc9c9a 100644
--- a/releng/org.eclipse.ptp.sdk-feature/feature.xml
+++ b/releng/org.eclipse.ptp.sdk-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.sdk"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.sdm-feature/feature.xml b/releng/org.eclipse.ptp.sdm-feature/feature.xml
index e3ae148..b6848fd 100644
--- a/releng/org.eclipse.ptp.sdm-feature/feature.xml
+++ b/releng/org.eclipse.ptp.sdm-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.ptp.debug.sdm"
       label="%featureName"
-      version="9.3.0.qualifier"
+      version="9.3.1.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/releng/org.eclipse.ptp.sdm-feature/pom.xml b/releng/org.eclipse.ptp.sdm-feature/pom.xml
index fb9586d..7f94678 100644
--- a/releng/org.eclipse.ptp.sdm-feature/pom.xml
+++ b/releng/org.eclipse.ptp.sdm-feature/pom.xml
@@ -6,12 +6,12 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp.debug.sdm</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
   <groupId>org.eclipse.ptp.features</groupId>
 </project>
diff --git a/releng/org.eclipse.ptp.target/pom.xml b/releng/org.eclipse.ptp.target/pom.xml
index 3dd84fb..4c2d7f7 100644
--- a/releng/org.eclipse.ptp.target/pom.xml
+++ b/releng/org.eclipse.ptp.target/pom.xml
@@ -7,7 +7,7 @@
 	<parent>
 	    <groupId>org.eclipse.ptp</groupId>
 	    <artifactId>ptp-parent</artifactId>
-	    <version>9.3.0-SNAPSHOT</version>
+	    <version>9.3.1-SNAPSHOT</version>
 	    <relativePath>../../pom.xml</relativePath>
 	</parent>
 
diff --git a/releng/org.eclipse.ptp/META-INF/MANIFEST.MF b/releng/org.eclipse.ptp/META-INF/MANIFEST.MF
index 4d344ff..96b24a5 100644
--- a/releng/org.eclipse.ptp/META-INF/MANIFEST.MF
+++ b/releng/org.eclipse.ptp/META-INF/MANIFEST.MF
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ptp;singleton:=true
-Bundle-Version: 9.3.0.qualifier
+Bundle-Version: 9.3.1.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/releng/org.eclipse.ptp/pom.xml b/releng/org.eclipse.ptp/pom.xml
index 33c2b51..4cc40b7 100644
--- a/releng/org.eclipse.ptp/pom.xml
+++ b/releng/org.eclipse.ptp/pom.xml
@@ -6,11 +6,11 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>org.eclipse.ptp</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
+  <version>9.3.1-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/releng/pom.xml b/releng/pom.xml
index 83093ed..7de5d86 100644
--- a/releng/pom.xml
+++ b/releng/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>releng-parent</artifactId>
diff --git a/rms/org.eclipse.ptp.rm.ibm.pe.doc.user/pom.xml b/rms/org.eclipse.ptp.rm.ibm.pe.doc.user/pom.xml
index ae5796a..6c25e88 100644
--- a/rms/org.eclipse.ptp.rm.ibm.pe.doc.user/pom.xml
+++ b/rms/org.eclipse.ptp.rm.ibm.pe.doc.user/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/rms/org.eclipse.ptp.rm.lml.da.server/pom.xml b/rms/org.eclipse.ptp.rm.lml.da.server/pom.xml
index 51cabe9..414c6de 100644
--- a/rms/org.eclipse.ptp.rm.lml.da.server/pom.xml
+++ b/rms/org.eclipse.ptp.rm.lml.da.server/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/rms/pom.xml b/rms/pom.xml
index dcfbe55..47a4ba8 100644
--- a/rms/pom.xml
+++ b/rms/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>rms-parent</artifactId>
diff --git a/tools/cdt/pom.xml b/tools/cdt/pom.xml
index 0a79d4f..bea3e8d 100644
--- a/tools/cdt/pom.xml
+++ b/tools/cdt/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/tools/etfw/pom.xml b/tools/etfw/pom.xml
index dc55e4e..7bf7551 100644
--- a/tools/etfw/pom.xml
+++ b/tools/etfw/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/tools/gem/org.eclipse.ptp.gem.help/.project b/tools/gem/org.eclipse.ptp.gem.help/.project
deleted file mode 100644
index 74f4d75..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.gem.help</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/META-INF/MANIFEST.MF b/tools/gem/org.eclipse.ptp.gem.help/META-INF/MANIFEST.MF
deleted file mode 100644
index a9e716b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.gem.help;singleton:=true
-Bundle-Version: 1.3.0.qualifier
-Bundle-Vendor: %pluginProvider
-Bundle-Localization: plugin
diff --git a/tools/gem/org.eclipse.ptp.gem.help/about.html b/tools/gem/org.eclipse.ptp.gem.help/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/build.properties b/tools/gem/org.eclipse.ptp.gem.help/build.properties
deleted file mode 100644
index 2008329..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = META-INF/,\
-               plugin.xml,\
-               html/,\
-               toc.xml,\
-               about.html,\
-               plugin.properties
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/analyzerView.html b/tools/gem/org.eclipse.ptp.gem.help/html/analyzerView.html
deleted file mode 100644
index 2fdb70e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/analyzerView.html
+++ /dev/null
@@ -1,219 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>Analyzer View</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Analyzer View</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h2>Using the Analyzer View</h2>
-<p>
-Before formally verifying an MPI C/C++ application, the number of processes needs to be set
-for the verification run. You will also need to know how to run GEM itself. The links below
-detail these processes:
-</p>
-
-<ul>
-    <li>
-        <a href="gettingStarted.html">Getting Started</a>
-    </li>
-    <li>
-        <a href="setNumProcs.html">Setting the Number of Processes</a>
-    </li>
-    <li>
-        <a href="gettingStarted.html#rungem">Running GEM</a>.
-    </li>
-</ul>
-
-<p>
-When GEM has finished the verification of your MPI C/C++ application, the Console, Browser and Analyzer Views will all be
-opened and depending on what is specified in the <a href="preferences.html#gemprefs">GEM Preference Page</a>, 
-one of these views will be brought to the foreground and given the active focus.
-</p>
-
-<h2>Analyzer Overview</h2>
-<p>
-This unique user interface visually displays the output from the log file that was generated
-at runtime by highlighting lines representing match sets (p2p and collective send-recv matches) in the source file. 
-It shows both the current MPI call, and any matching point-to-point or collective operation. It also allows the 
-user to examine MPI calls for a particular rank with an easy to use <b>Rank Lock</b> feature. In addition, it 
-has a feature to browse calls by rank and by interleaving, as well as launch the
-<a href="happensBeforeViewer.html">Happens Before (HB) Viewer</a>.
-</p>
-
-<p>
-<i>The image below shows what the Analyzer View might look like followed by an explanation of its components.</i>
-</p>
-
-<img src="images/analyzerIntegration.png" width="990" height="682"/>
-
-<h2 id="runtimeInfo">Runtime Information</h2>
-<p>
-On the far left is a label that explains how the program terminated, whether by a deadlock, assertion violation, 
-or without error. The text is green if the nothing is wrong and red when GEM is reporting a problem.
-</p>
-
-<h3 id="hbviewer">Button Explanations</h3>
-<p>
-<img height="20" src="images/setNumProcsCombo.gif" width="47" /> The drop down combo-box shows the current number of
-processes and lets the user conveniently choose a new value for the next GEM run.
-</p>
-
-<p>
-<img height="16" src="images/trident.gif" width="12" /> This will re-run GEM on the current MPI project. This is
-equivalent to choosing &#34;Formally Verify MPI Program&#34; from the toolbar button drop-down and is provided for convenience.
-</p>
-
-<p>
-<img height="17" src="images/hpv-trident.gif" width="15" /> This button will launch the 
-<a href="happensBeforeViewer.html">Happens Before (HB) Viewer</a>, a graphical tool
-for examining all processes at once and their interactions on a more global level.
-</p>
-
-<p>
-<img height="16" src="images/browse.gif" width="16" /> <b>Browse MPI Calls</b><br>
-This opens a new window that shows all MPI Calls and groups them first by the rank that issued
-them and then by the Interleaving they are found in.<br>
-</p>
-
-<ul>
-    <li>
-        Blue highlighted lines represent calls that are currently highlighted in the code windows.
-    </li>
-    <li>
-        Red highlighted lines represent calls that did NOT complete due to an error.
-    </li>
-</ul>
-<img src="images/callBrowser.png">
-
-<br/><br/><br/>
-<hr/>
-
-<h2>Transitions</h2>
-<p>
-A transition is essentially an abstraction of an MPI call along with information regarding how the call
-effects the state of the system. The top left section (aptly titled &quot;Transitions&quot;) lets
-the user change which transition is currently being viewed.
-</p>
-
-The buttons from left to right let the user navigate to the: 
-<ul>
-    <li><img height="16" src="images/first-item.gif" width="16" /> first transition</li>
-    <li><img height="16" src="images/prev-item.gif" width="16" /> previous transition</li>
-    <li><img height="16" src="images/next-item.gif" width="16" /> next transition</li>
-    <li><img height="16" src="images/last-item.gif" width="16" /> last transition</li>
-</ul>
-
-<p>
-Just to the right of the transition/interleaving buttons is a drop down menu that lets the user lock a 
-rank. The Lock Rank option also allows the user to only step to the previous and next call of a specific
-rank, instead of all the ranks  If no ranks are locked then the calls will be stepped through in internal 
-issue order or program order (depending on your selection in the <a href="#steporder">Step Order Section</a>).
-</p>
-
-<br/><br/>
-<hr/>
-
-<h2>Interleavings</h2>
-<p>
-An interleaving is a schedule of transitions, or in other words a possible 
-ordering of MPI calls issued by the scheduler. The top right section (titled &quot;Interleavings&quot;)
-lets the user change which interleaving is being viewed. Doing this will automatically 
-move to the first transition of the new interleaving. These buttons let the user choose which
-interleaving is currently being navigated.
-</p>
-
-The buttons from left to right let the user navigate to the: 
-<ul>
-    <li><img height="16" src="images/first-item.gif" width="16" /> first interleaving</li>
-    <li><img height="16" src="images/prev-item.gif" width="16" /> previous interleaving</li>
-    <li><img height="16" src="images/next-item.gif" width="16" /> next interleaving</li>
-    <li><img height="16" src="images/last-item.gif" width="16" /> last interleaving</li>
-</ul>
-
-<br/><br/>
-<hr/>
-
-<h2><a name="steporder">Step Order for MPI Calls</a></h2>
-
-<p>
-This is the order in which the <a href="#codewindows">Code Windows</a> will display transistions.
-</p>
-
-The radio buttons from left to right do the following:
-<ul>
-    <li><b>Internal Issue Order:</b> Step through MPI calls in the order they were issued to the MPI runtime by the ISP Scheduler.</li>
-    <li><b>Program Order:</b> Step through MPI calls in the order they appear in the code.</li>
-</ul>
-
-<br/><br/>
-<hr/>
-
-<h2><a name="codewindows">Code Windows</a></h2>
-<p>
-At the top of this section are two labels that explain the MPI Call(s) currently being viewed. 
-On the left is the originating MPI call and on the right is the explanation of the matching MPI
-call (for example an MPI Send may match with an MPI Recv and in such a situation the Send will be 
-described on the left and the Recv on the right). Some MPI Calls, such as collective operations do not
-match with anything (like Barrier or Finalize for example) in this situation the label on the right 
-will be blank or simply list the processes involved with the coolective operation.
-</p>
-
-<p>
-These labels have two lines of information. From top to bottom they are:
-Rank (aka process id), and then the file and line number where the MPI call
-is found in the source file.
-</p>
-
-<p>
-Below these two labels are two windows that both hold complete copies of the 
-source file. These are used to visually show where the calls came from and how 
-they match. In the left window the originating call is highlighted and on 
-the right the matching call is highlighted.
-</p>
-
-<br/><br/>
-<hr/>
-
-<h2>Menu &#38; Toolbar Options</h2>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/terminate.gif" height="16"  width="16">
-Terminate Operation - Forcibly terminates the current GEM operation.
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/help-contents.gif" height="16"  width="16">
-Get Analyzer Help - Opens the Eclipse help topic related to the Analyzer View page.<br/>
-
-<p>
-<b>Note:</b> This same functionality can be obtained through the Analyzer View context and pull-down menus.
-</p>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/browserView.html b/tools/gem/org.eclipse.ptp.gem.help/html/browserView.html
deleted file mode 100644
index 3f79ce5..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/browserView.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>Browser View</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Browser View</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h2>Using the Browser View</h2>
-<p>
-Before formally verifying an MPI C/C++ application, the number of processes needs to be set
-for the verification run. You will also need to know how to run GEM itself. The links below
-detail these processes:
-</p>
-
-<ul>
-    <li>
-        <a href="gettingStarted.html">Getting Started</a>
-    </li>
-    <li>
-        <a href="setNumProcs.html">Setting the Number of Processes</a>
-    </li>
-    <li>
-        <a href="gettingStarted.html#rungem">Running GEM</a>.
-    </li>
-</ul>
-
-<p>
-When GEM has finished the verification of your MPI C/C++ application, the Console, Browser and Analyzer Views will all be
-opened and depending on what is specified in the <a href="preferences.html#gemprefs">GEM Preference Page</a>, 
-one of these views will be brought to the foreground and given the active focus.
-</p>
-
-<h2>Browser Overview</h2>
-<p>
-This highly functional view summarizes and categorically groups all of the errors and warnings found
-by GEM for a particular MPI verification run. The summary label (just above the tabs) gives the user a quick
-overview of problems found. Errors and warnings are mapped to the corresponding source code lines in 
-the Eclipse editor. The Browser View&#39;s tabs help the user to quickly localize and fix MPI errors
-and warnings flagged by GEM within their source code.
-</p>
-
-<p>
-<i>The image below shows what the Browser View might look like followed by an explanation of its components.</i>
-</p>
-
-<img src="images/browserIntegration.png" width="900" height="680"/>
-
-<h2>Browser View Tabs</h2>
-
-<p>
-Below the GEM Browser View&#39;s summary label (the line above the tabs) is a section containing a tab for 
-each category of error or warning that was found by GEM at runtime. By selecting a particular tab, 
-the user is given detailed information on each occurrence of this error or warning in their MPI code. 
-Clicking on any of these occurrences takes the user to the offending line of source code within the Eclipse 
-editor. If there are no instances of the problem, then there is a short message indicating such. Furthermore, a 
-user is shown which types of errors are presented via the icons of the tab (see icons directly below).
-</p>
-
-<p>
-The following is a listing of all errors and warnings summarized by the GEM Browser View, 
-each with a detailed description. 
-</p>
-
-<ul>
-	<li>
-		<img src="images/no-error.gif">
-		Indicates that there are no instances of this particular error&#47;problem.
-	</li>
-	<li>
-		<img src="images/magnified-trident.gif">
-		Tells the user that this error&#47;problem is present in their code.
-	</li>
-</ul>
-
-<h3>Deadlocks Tab</h3>
-This tab allows the user to visit all calls that did not complete due to a detected deadlock.
-
-<h3>Assertion Violations Tab</h3>
-This tab lists all local assertion violations found. Clicking any one of these will take the user to the line of 
-source code with the failed assertion.
-
-<h3>Leaks Tab</h3>
-Clicking any of these will take the user to the line of source code where the corresponding un-freed MPI 
-resource was allocated (these are usually MPI communicators and MPI DataTypes).
-
-<h3>Irrelevant Barriers Tab</h3>
-This tab is reserved for Functionally Irrelevant Barriers. Clicking any these will take the user to the corresponding
-MPI_Barrier call itself, which can then be safely removed without changing the runtime behavior of the MPI application.
-This could potentially speed the application up with the absence of unnecessary synchronization.
-
-<h3>Type Mismatches Tab</h3>
-These are warnings about the send type not matching the receive type. 
-In some cases this may be intentional, but often times it is a programming mistake.
-
-<br/><br/>
-<hr/>
-
-<h2>Button Explanations</h2>
-<p>
-<img height="20" src="images/setNumProcsCombo.gif" width="47" /> The drop down combo-box shows the current number of
-processes and lets the user conveniently choose a new value for the next GEM run.
-</p>
-
-<p>
-<img height="16" src="images/trident.gif" width="12" /> This will re-run GEM on the current MPI project. This is
-equivalent to choosing &#34;Formally Verify MPI Program&#34; from the toolbar button drop-down and is provided 
-for convenience.
-</p>
-
-<br/><br/>
-<hr/>
-
-<h2>Menu &#38; Toolbar Options</h2>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/terminate.gif">
-Terminate Operation - Forcibly terminates the current GEM operation
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/save-file.gif">
-Save to File - Saves a listing of all results to a local text file.
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/help-contents.gif">
-Get Browser Help - Opens the Eclipse help topic related to the Browser View page.
-
-<p>
-<b>Note:</b> This same functionality can be obtained through the Browser View context and pull-down menus.
-</p>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-
-</center>
-
-</body>
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/consoleView.html b/tools/gem/org.eclipse.ptp.gem.help/html/consoleView.html
deleted file mode 100644
index bda271e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/consoleView.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Console View</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Console View</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h2>Using the Console View</h2>
-
-<p>
-Before formally verifying an MPI C/C++ application, the number of processes needs to be set
-for the verification run. You will also need to know how to run GEM itself. The links below
-detail these processes:
-</p>
-
-<ul>
-    <li>
-        <a href="gettingStarted.html">Getting Started</a>
-    </li>
-    <li>
-        <a href="setNumProcs.html">Setting the Number of Processes</a>
-    </li>
-    <li>
-        <a href="gettingStarted.html#rungem">Running GEM</a>.
-    </li>
-</ul>
-
-<h2>Console Overview</h2>
-<p>
-When GEM has finished the verification of your MPI C/C++ application, the Console, Browser and 
-Analyzer Views will all be opened and depending on what is specified in the 
-<a href="preferences.html#gemprefs">GEM Preference Page</a>, one of these views will be 
-brought to the foreground and given the active focus.
-</p>
-
-<p>
-The Console View serves as an informal progress monitor while GEM is running &nbsp;&#8212;&nbsp;a status bar of sorts.
-The actual time to formally verify any MPI application is essentially unknown and hence no actual Progress Monitor object.
-It may be useful to see <b>STDOUT</b> &#38; <b>STDERR</b> to know when a verification run is complete. The Console 
-View also gives the user the opportunity to cancel stalled or long-running operations with the standard Eclipse  
-cancel button <img src="images/terminate.gif">.
-</p>
-
-<h3>Understanding Output</h3>
-Please reference the <a href="output.html">Understanding GEM Console Output</a>  help page.
-
-<p>
-<i>The image below shows what the Console View might look like followed by an explanation of its components.</i>
-</p>
-
-<img src="images/consoleIntegration.png" width="800" height="607"/>
-
-<p>
-<b>Note:</b>&nbsp; On the <a href="preferences.html#gemprefs">GEM Preference Page</a>, you can specify whether you 
-want new output to replace the older, or if new output should be appended to the older output.
-</p>
-
-<br/><br/>
-<hr/>
-
-<h2>Menu &#38; Toolbar Options</h2>
-&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/terminate.gif">
-Terminate Operation - Forcibly terminates the current GEM operation
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img height="16" src="images/clear-console.gif" width="16">
-Clear Console - Removes all entries from the consoles, leaving it blank.
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img height="16" src="images/save-file.gif" width="16">
-Save Output to File - Launches a window that lets you save the current contents as a .txt file anywhere you want.
-<br/>
-&nbsp;&nbsp;&nbsp;&nbsp;<img height="16" src="images/help-contents.gif" width="16">
-Get GEM Console Help - Opens the Eclipse help topic related to the GEM Console View.
-
-<p>
-<b>Note:</b> This same functionality can be obtained through the Console View context and pull-down menus.
-</p>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/gettingStarted.html b/tools/gem/org.eclipse.ptp.gem.help/html/gettingStarted.html
deleted file mode 100644
index 053507b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/gettingStarted.html
+++ /dev/null
@@ -1,212 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>Getting Started</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Getting Started</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h3>This page serves to get the new GEM user up and running.</h3>
-
-<p>
-To help get the new GEM user started, this page will walk through examples of how to use GEM 
-to formally verify a MPI Managed-Build project as well as a larger MPI Makefile project. Please
-note that when we say <b>&#34;formally verify&#34;</b>, we mean <b>&#34;check the correctness&#34;</b>
-of your MPI application.
-</p>
-
-For Example - GEM will check your MPI application for the presence of:
-<ul>
-    <li>Deadlocks</li>
-    <li>Functionally Irrelevant Barriers</li>
-    <li>MPI Object Leaks</li>
-    <li>Local Assertion Violations</li>
-    <li>MPI Type Mismatches</li>
-</ul>
-
-<p>
-Some of these errors and problems are <b>extremely difficult</b> to detect and find with traditional 
-debugging tools and practices.
-</p>
-
-<p>
-Remember that no code instrumentation is necessary. At compile time, GEM will link in its profiler library
-which takes care of everything for you automatically (using the PMPI mechanism). GEM offers push-button formal
-verification for MPI C/C++ applications. Fortran support is planned in the future.
-</p>
-
-<p>
-The main idea here is to illustrate just how easy it is to do verification on your MPI application <b>throughout</b>
-your project&#39;s life-cycle. A developer can create, edit, compile, verify, parallel debug (for standard logic errors) 
-and launch your MPI apps all from the comfort of the Eclipse IDE. 
-</p>
-
-<br/>
-<hr/>
-
-<h2>Verifying a MPI <ins>Managed Build</ins> Project</h2>
-
-<h3>STEP - 1:&nbsp;&nbsp;&nbsp;Make Sure all Prerequisites are Satisfied</h3>
-Please see the <a href="prereqs.html">GEM Prerequisites Page</a>. Particularly important, is the installation
-of <a href="http://www.cs.utah.edu/formal_verification/ISP-release/">In-situ Partial Order (ISP)</a>, the underlying
-formal verification engine GEM serves as a front-end for.
-
-<h3>STEP - 2:&nbsp;&nbsp;&nbsp;Set ISP Command Line Options</h3>
-You'll need to tell GEM where ISP and its scripts (both local and remote) are installed and which of its command line 
-options you would like to use. Please see the <a href="preferences.html#ispPrefs">ISP Preference Page</a> for detailed 
-instructions (image below).
-
-<h3>STEP - 3:&nbsp;&nbsp;&nbsp;Set the Number of Processes to Verify With</h3>
-<i>(the same number of processes that you would run your MPI application with normally</i><br/>
-To do this, please consult the help page detailing <a href="setNumProcs.html">Setting the number of processes</a>
-
-<h3>STEP - 4:&nbsp;&nbsp;&nbsp;Set Preference for Command Line Arguments Prompt</h3>
-
-Depending on whether or not this preference is set, a dialog (figure 1 below) may be opened prior to verification 
-(e.g. when GEM is run) to collect this information. Please see the <a href="preferences.html#gemPrefs">GEM Preference Page</a> 
-for this (figure 2 below).
-
-<br/><br/>
-<b>figure 1</b><br/><br/>
-<img src="images/comandLineArgsDialog.png">
-<br/><br/>
-
-<br/><br/>
-<b>figure 2</b><br/><br/>
-<img src="images/gemPrefsCmdArgs.png">
-<br/><br/>
-
-<h3>STEP - 5:&nbsp;&nbsp;&nbsp;Choose Project to Formally Verify</h3>
-In this example, we&#39;ll verify the simple <tt><b>MPI Pi C</b></tt> project that you can create with the CDT New
-MPI Project Wizard.<br/>
-<i>NOTE: GEM&#39;s views may not be visible at first, but will be opened when a verification run is started.</i><br/><br/>
-
-Your C/C++ perspective might look something like the image below (notice the <tt><b>Pi.c</b></tt> file open in the Eclipse editor).<br/><br/>
-<img src="images/gemPiExample.png">
-
-<h3><a name="rungem">Running GEM</a></h3>
-<p>
-When you formally verify an MPI C/C++ application, the Console, Browser and Analyzer Views will both be
-opened and depending on what is specified in preferences, one of these views will be brought to the foreground
-and given the active focus.
-</p>
-
-<p>
-There are three initial ways to start GEM&#39;s verification process on your MPI application. These three methods 
-are for smaller projects, e.g. the program entry point <tt><b>main</b></tt> and all of the MPI is in a single file.
-</p>
-
-<p>
-For using GEM on larger Makefile projects, please see the section below on
-<a href="#makefileproject">Verifying a MPI Makefile Build Project</a>.
-
-<ol>
-    <li>
-        Open the source code file in the Eclipse editor window and select
-        <img height="16" src="images/trident.gif" width="13" /><b>Formally Verify MPI Program</b>
-        from the trident pull-down icon on the Eclipse toolbar.
-		<br/><br/> 
-		<img src="images/runVerify.png">
-		<br/><br/> 
-    </li>
-    <li>
-        From the Project Explorer window, right click on the <tt><b>Pi.c</b></tt> source code file and select
-        <img height="16" src="images/trident.gif" width="13" /><b>Formally Verify MPI Program</b>
-        from the GEM context menu (see image below).
-    </li>
-    <li>
-        Open the source code file in the Eclipse editor window, right click on the <tt><b>Pi.c</b></tt>
-        source code file in the editor window and select
-        <img height="16" src="images/trident.gif" width="13" /><b>Formally Verify MPI Program</b>
-        from the GEM context menu (see image below).
-        <br/><br/>
-        <img src="images/sourceCodePopUp.png">
-        <br/><br/>
-    </li>
-</ol>
-
-<a name="step6"></a>
-<h3>STEP - 6:&nbsp;&nbsp;&nbsp;Use GEM Views to Locate and Correct MPI Errors &#47; Problems</h3>
-
-<p>
-
-</p>
-
-<p>
-Once verification starts you will see the three GEM Views open (if they weren&#39;t already). Terminal output will 
-be posted as it occurs in the <a href="consoleView.html">Console View</a>, <b>STDOUT</b> in black and <b>STDERR</b> in red. This output serves
-to inform the user of forward progress, a status bar of sorts, as there is now way to determine exactly how long a 
-verification run will take (hence no actual Progress Monitor object).
-</p>
-
-<img src="images/gemConsole.png">
-<br/><br/>
-
-<ol>
-	<li>
-		The <b>Analyzer View</b> will help you walk through the execution of your MPI application
-		and understand MPI runtime behavior. GEM is a dynamic formal verification tool and tracks the actual events 
-		e.g. p2p send-recv matches as they occurred at runtime.
-		<br/><br/>
-		For detailed coverage of the <b>Analyzer View</b> and how to use it, please refer to the
-		 <a href="analyzerView.html"><b>Analyzer View Documentation</b></a>.
-		 <br/><br/>
-		<img src="images/analyzer.png">
-		<br/><br/>
-	</li>
-	<li>
-		The <b>Browser View</b> summarizes and categorically groups all of the errors and warnings found 
-		by GEM for a particular MPI verification run. The summary label (just above the tabs) gives the 
-		user a quick overview of problems found. Errors and warnings are mapped to the corresponding 
-		source code lines in the Eclipse editor. The Browser View's tabs help the user to quickly locate 
-		and fix MPI errors flagged by GEM in their source code.
-		<br/><br/>
-		For detailed coverage of the <b>Browser View</b> and how to use it, please refer to the
-		 <a href="browserView.html"><b>Browser View Documentation</b></a>.	
-		<br/><br/>	
-		<img src="images/browser.png">
-		<br/><br/>
-	</li>
-	<li>
-		The <b>Console View</b> is described and shown at the beginning of <a href="#step6">step 6</a>.
-		<br/>
-		For detailed coverage of the <b>Console View</b> and how to use it, please refer to the
-		 <a href="consoleView.html"><b>Console View Documentation</b></a>.
-		 <br/><br/>		
-	</li>
-</ol>
-
-<h2><a name="makefileproject">Verifying a MPI <ins>Makefile Build</ins> Project</a></h2>
-
-The process for verifying a <b>Makefile</b> Project differs only slightly and is detailed in
-the <a href="makefileSupport.html"><b>Makefile Support Documentation</b></a>.
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/happensBeforeViewer.html b/tools/gem/org.eclipse.ptp.gem.help/html/happensBeforeViewer.html
deleted file mode 100644
index 6d8f54b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/happensBeforeViewer.html
+++ /dev/null
@@ -1,162 +0,0 @@
-﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Happens Before Viewer</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Happens Before Viewer</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h2>Running the Happens Before Viewer</h2>
-<p>
-The Happens Before Viewer is actually an external tool and is launched from within the 
-<a href="analyzerView.html#hbviewer">Analyzer View</a> or on a pre-existing log file (generated 
-at runtime by GEM) directly. This is done via context menus as shown in the image below.
-</p>
-
-<p>
-<i> Note: The log file and profiled executable generated by GEM will be in a directory named <b>&#34;gem&#34;</b> at
-the top level of the current project.</i>
-</p>
-<ul>
-    <li>
-        From the Analyzer View, simply click the <b>HB Viewer</b> button after GEM has been run.
-    </li>
-    <li>
-        From the Project Explorer window, right click on the generated log file
-        and select <img height="16" src="images/hpv-trident.gif" width="13" />
-        <b>Launch Happens Before Viewer</b> from the GEM context menu.
-    </li>
-    
-</ul>
-
-<br>
-<center>
-<img src="images/hpvPopUp.png">
-</center>
-<br><br>
-
-<h2>Understanding What You See</h2><br>
-<ul>
-    <li>
-        <b>Showing Interleaving:</b>&nbsp;&nbsp;indicates which interleaving is currently being shown and 
-        the total number of interleavings GEM examined.
-    </li>
-    <li>
-        <b>Deadlock:</b>&nbsp;&nbsp;Is either followed by <font COLOR="#00ff00">no </font>or 
-        <font COLOR="#ff0000">yes</font>, and indicates if any of the interleavings contain a deadlock.
-    </li>
-    <li>
-        <b>Red Bordered DEADLOCK:</b>&nbsp;&nbsp;At the bottom of the window indicates that at this point the currently selected
-        interleaving is deadlocked. Calls above this will be issued and calls that would come afterward are not shown.
-    </li>
-    <li>
-        <b>Process[Number]:</b>&nbsp;&nbsp;This specifies which Process the calls below it belong to (Where Number is the number
-        of the process in question). The color of the border around this text is arbitrary and serves only to help
-        the human eye distinguish the various columns and return to a column of interest more quickly.
-    </li>
-    <li>
-        <b>Blue Arrows:</b>&nbsp;&nbsp;Show CB (Completes Before) edges that connect intra-process MPI calls
-        (calls within the same MPI process). A CB edge is a guarantee that the source must complete before 
-        the destination. For example a Barrier will always have a CB edge connecting it to the next call in 
-        the same process because the next call cannot complete before the barrier is finished. It is 
-        important to note though that there is only a CB edge to each call blocked by the call in
-        question. As an example lets imagine that a Barrier is followed by a second Barrier and then a Send. There
-        is a CB edge between the first and second Barrier and between the second Barrier and the Send, but none
-        between the first Barrier and the Send because it the second Barriers that directly blocks the send. The
-        CB edges are by default not shown, but the <a href="#changing">Changing What You See</a> section
-        below will show you how to make them appear.
-    </li>
-    <li>
-        <b>Red Arrows:</b>&nbsp;&nbsp;Show CB edges that connect inter-process MPI calls (calls between different processes).
-    </li>
-    <li>
-        <b>Black Arrows:</b>&nbsp;&nbsp;Connect MPI calls that match. For example a Send will have a Black Arrow pointing to the
-        Receive that picks up its message.
-    </li>
-    <li>
-        <b>Dotted Black Arrows:</b>&nbsp;&nbsp;Like solid Block Arrows these connect calls that match. The only difference
-        is that these connect a Red Bordered call.
-    </li>
-    <li>
-        <b>Red Borders:</b>&nbsp;&nbsp;Indicates that this call is the source of a different interleaving and is
-        the cause of the non-determinism (most likely some type of Recv with an MPI_ANY_SOURCE). In other words 
-        what is currently being displayed is one potential match for the Red Bordered call, but that another 
-        possible match exists and can be viewed by changing which interleaving is being shown.
-    </li>
-</ul>
-
-<br>
-<img alt="" src="images/hpv.png">
-<br><br>
-
-<h2><a name="changing">Changing What You See</a></h2>
-
-<ul>
-    <li>
-        To change which Interleaving you are viewing you can click on the &lt; or &gt; buttons or click “Goto”
-        after providing the desired interleaving number in the text box next to it.
-    </li>
-    <li>
-        To toggle whether or not you want matches to shown use the check box next to “Show Matches”.
-    </li>
-    <li>
-        To reset the view back to how it was before you made changes click the “Clear” button.
-    </li>
-    <li>
-        To see the source file that generated the log click on “Show Source”.
-    </li>
-    <li>
-        To add Completes-Before (CB) Edges, there are several choices. 
-        For a given call, process or some subset of either (e.g. you can select all processes and all calls or 
-        some subset therein)
-        <ol>
-            <li>
-                right click the call and select either View InterCB, View IntraCB or View Both as desired.
-            </li>
-            <li>
-                Lastly you will need to indicate whether you want to view the edgesin: the <b>Root Window</b> 
-                or in a <b>Separate Window</b> (see images below). A separate window with IntraCB Edges is 
-                shown below.
-            </li>
-        </ol>
-        <img src="images/cbChoices.png"><br><br>
-        <br><br>
-        <img src="images/process-intracb.png"><br><br>
-    </li>
-</ul>
-
-<p>
-You may also change which log file you are viewing by clicking: File -&gt; Open Trace and navigate to the desired file.
-</p>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/help.css b/tools/gem/org.eclipse.ptp.gem.help/html/help.css
deleted file mode 100644
index 6f5a78c..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/help.css
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Adapted from PTP help plugin */
-
-body, h1, h2, h3, h4, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-family: Arial, sans-serif; color: #000000}
-pre			 { font-family: Courier, monospace}
-
-body, h1, h2, h3, h4, p, table, td, caption, th, ul, ol, dl, li, dd, dt {font-size: 10pt; }
-pre		     { font-size: 10pt}
-
-
-/* body and headings decls */
-body	     { background: #FFFFFF}
-h1           { font-size: 18pt; margin-top: 5; margin-bottom: 1 }	
-h2           { font-size: 14pt; margin-top: 25; margin-bottom: 3 }
-h3           { font-size: 11pt; margin-top: 20; margin-bottom: 3 }
-h4           { font-size: 10pt; margin-top: 20; margin-bottom: 3; font-style: italic }
-p 	         { font-size: 10pt; }
-pre	         { margin-left: 6; font-size: 9pt }
-
-
-/* anchor decls */
-a:link       { color: #006699 }
-a:visited    { color: #996699 }
-a:hover      { color: #006699 }
-
-
-/* list and formatting decls */
-ul	         { margin-top: 0; margin-bottom: 10 }
-li	         { margin-top: 0; margin-bottom: 0 } 
-li p         { margin-top: 0; margin-bottom: 0 } 
-ol	         { margin-top: 0; margin-bottom: 10 }
-dl	         { margin-top: 0; margin-bottom: 10 }
-dt	         { margin-top: 0; margin-bottom: 0; font-weight: bold }
-dd	         { margin-top: 0; margin-bottom: 0 }
-strong	     { font-weight: bold}
-em	         { font-style: italic}
-var	         { font-style: italic}
-div.revision { border-left-style: solid; border-left-width: thin; border-left-color: #7B68EE; padding-left:5 }
-th	         { font-weight: bold }
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/ISP-diagram.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/ISP-diagram.gif
deleted file mode 100644
index 04e5042..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/ISP-diagram.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzer.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzer.png
deleted file mode 100644
index 27a3abd..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzer.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerIntegration.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerIntegration.png
deleted file mode 100644
index 0914be5..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerIntegration.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerSetProcs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerSetProcs.png
deleted file mode 100644
index 9719dac..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/analyzerSetProcs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/browse.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/browse.gif
deleted file mode 100644
index 2344861..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/browse.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/browser.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/browser.png
deleted file mode 100644
index b67899b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/browser.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/browserIntegration.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/browserIntegration.png
deleted file mode 100644
index b410ca1..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/browserIntegration.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/browserSetProcs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/browserSetProcs.png
deleted file mode 100644
index c32a355..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/browserSetProcs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/callBrowser.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/callBrowser.png
deleted file mode 100644
index b5143eb..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/callBrowser.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/cbChoices.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/cbChoices.png
deleted file mode 100644
index b170d96..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/cbChoices.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/clear-console.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/clear-console.gif
deleted file mode 100644
index af30a42..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/clear-console.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/comandLineArgsDialog.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/comandLineArgsDialog.png
deleted file mode 100644
index a8193d1..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/comandLineArgsDialog.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/consoleIntegration.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/consoleIntegration.png
deleted file mode 100644
index ffbbd9c6..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/consoleIntegration.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/deadlock.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/deadlock.gif
deleted file mode 100644
index 0556c29..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/deadlock.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/executablePopUp.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/executablePopUp.png
deleted file mode 100644
index 59a014e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/executablePopUp.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/first-item.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/first-item.gif
deleted file mode 100644
index 328e97e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/first-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemConsole.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/gemConsole.png
deleted file mode 100644
index 7b84ce2..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemConsole.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemExtension.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/gemExtension.png
deleted file mode 100644
index dc4b2e3..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemExtension.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPiExample.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPiExample.png
deleted file mode 100644
index fc2e105..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPiExample.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefs.png
deleted file mode 100644
index 8ce62b1..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefsCmdArgs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefsCmdArgs.png
deleted file mode 100644
index b4258fb..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/gemPrefsCmdArgs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/help-contents.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/help-contents.gif
deleted file mode 100644
index 9d70301..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/help-contents.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv-trident.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv-trident.gif
deleted file mode 100644
index 203374a..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv.png
deleted file mode 100644
index ca16cdd..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpv.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpvPopUp.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/hpvPopUp.png
deleted file mode 100644
index 4de195d..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/hpvPopUp.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/invalidExecutable.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/invalidExecutable.png
deleted file mode 100644
index 67cf3f2..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/invalidExecutable.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/ispPrefs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/ispPrefs.png
deleted file mode 100644
index f36c9ea..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/ispPrefs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/last-item.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/last-item.gif
deleted file mode 100644
index c39cf62..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/last-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/magnified-trident.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/magnified-trident.gif
deleted file mode 100644
index 849a0c0..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/magnified-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/makeTargets.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/makeTargets.png
deleted file mode 100644
index ceeabb4..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/makeTargets.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/match-call.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/match-call.gif
deleted file mode 100644
index 059caec..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/match-call.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/next-item.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/next-item.gif
deleted file mode 100644
index e2f8c3e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/next-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/no-error.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/no-error.gif
deleted file mode 100644
index 3d9b4e8..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/no-error.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/numProcsDialog.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/numProcsDialog.png
deleted file mode 100644
index 50bd1d6..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/numProcsDialog.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/prev-item.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/prev-item.gif
deleted file mode 100644
index 4c22b59..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/prev-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/process-intracb.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/process-intracb.png
deleted file mode 100644
index 86125a5..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/process-intracb.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/processes.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/processes.gif
deleted file mode 100644
index 828a539..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/processes.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/runNumProcs.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/runNumProcs.png
deleted file mode 100644
index 695c226..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/runNumProcs.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/runVerify.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/runVerify.png
deleted file mode 100644
index 2d72d45..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/runVerify.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/save-file.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/save-file.gif
deleted file mode 100644
index 499dd0c..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/save-file.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/setNumProcsCombo.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/setNumProcsCombo.gif
deleted file mode 100644
index 94f021c..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/setNumProcsCombo.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/source-call.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/source-call.gif
deleted file mode 100644
index 695e5a5..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/source-call.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/sourceCodePopUp.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/sourceCodePopUp.png
deleted file mode 100644
index b73f89a..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/sourceCodePopUp.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/terminate.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/terminate.gif
deleted file mode 100644
index dc47edf..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/terminate.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/trident.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/trident.gif
deleted file mode 100644
index e5feb64..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/trident_transparent.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/trident_transparent.png
deleted file mode 100644
index 7cbaab8..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/trident_transparent.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/triple-trident.gif b/tools/gem/org.eclipse.ptp.gem.help/html/images/triple-trident.gif
deleted file mode 100644
index c7e244d..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/triple-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/images/unknownCommand.png b/tools/gem/org.eclipse.ptp.gem.help/html/images/unknownCommand.png
deleted file mode 100644
index 5a7b535..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/images/unknownCommand.png
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/makefileSupport.html b/tools/gem/org.eclipse.ptp.gem.help/html/makefileSupport.html
deleted file mode 100644
index fb5e80c..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/makefileSupport.html
+++ /dev/null
@@ -1,138 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Makefile Support</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Makefile Support</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p>
-GEM supports CDT C and C++ Makefile projects with a minimum effort required on the part of the programmer.
-With some minor modifications to your MPI project's Makefiles, you'll be able to use GEM with your Makefile 
-Projects as well as your Managed Build Projects.
-</p>
-
-<h2>Makefile Modification Steps</h2>
-
-<p>
-The following are the necessary steps to modify your CDT MPI Makefile Project so that it can be formally
-verified by GEM. If you are creating a project from scratch, make sure to start with a new <b>Makefile Project</b>
-and not a <b>Managed-Build Project</b>!
-</p>
-
-<ul>
-    <li>
-       	Change the compiler to <tt><b>ispcc</b></tt> for C or <tt><b>ispCC</b></tt> for C++. These are wrappers for 
-       	<tt><b>mpicc</b></tt> and <tt><b>mpicxx</b></tt> that allow GEM to intercept MPI calls at runtime with an
-       	interposition layer (the PMPI mechanism).
-	        <pre>
-	        # Which compiler to use
-	        # CC = mpicc  &#60;-- comment this out
-	        
-	        # For MPI C applications
-	        CC = ispcc    &#60;-- add this for C compilation (ispcc is a wrapper for mpicc)
-	        
-	        # For MPI C++ applications
-	        CXX = ispCC   &#60;-- add this for C++ compilation (ispCC is a wrapper for mpicxx)
-	        </pre>
-    </li>
-    <li>
-        GEM requires the fully qualified path to all source code files in order to know how to locate errors
-        and problems in your code. ISP itself uses the <tt><b>__FILE__</b></tt> and <tt><b>__LINE__</b></tt>
-        macros in generating a runtime log. The modification below facilitates this by giving this information 
-        to ispcc/ispCC (gcc/g++) at compile time in order to get that back in the same form.
-	        <pre>
-	        SOURCEPATH = $(shell pwd)   # defining this will give the compiler the fully qualified path to each file encountered
-	        $(CC) $(CFLAGS) -c $(SOURCEPATH)/$*.c   # add this to your build rules
-	        </pre>
-    </li>
-    <li>
-        <b>Change the extension of the generated executables to <i>".gem"</i></b>
-        <pre>
-        $(BINDIR)/mtest.gem$(VERNUM): $(MESHTESTOBJS) $(ISPOBJS)
-        </pre>
-    </li>
-</ul>    
-    
-    
-<h2>Setting Your Projects up to Build</h2>
-<ul>
-    <li>
-        Create make targets for your Makefile Project
-        <br/><br/>
-        <img src="images/makeTargets.png">
-        <br/><br/>
-    </li>
-    <li>
-        Now simply double click the make target you need.<br>
-        <i>You may have to do a little debugging to get everything just right</i>
-        <br/><br/>
-    </li>    
-</ul>
-
-<h2>Running GEM on the Generated Executables</h2>
-<ul>    
-    <li>
-        Locate the executable(s) with ".gem" extension in the Project Explorer
-        <br/><br/>
-        <img src="images/gemExtension.png">
-        <br/><br/>
-    </li>
-        <li>
-        <a href=setNumProcs.html>Set the number of processes</a> for the next run of GEM.
-    </li>  
-    <li>
-        Right click on the previously located executable with <b>&#34;.gem&#34;</b> extension in the Project Explorer
-        <br/><br/>
-        <img src="images/executablePopUp.png">
-        <br/><br/>
-    </li>
-    <li>
-        This should bring up the GEM views &#40;if they aren&#39;t already open&#41; with post verification results.<br/>
-        <ul>
-        	<li>
-        		<a href="analyzerView.html">Analyzer View Help page</a>
-        	</li>
-        	<li>
-        		<a href="browserView.html">Browser View Help page</a>
-        	</li>
-        	<li>
-        		<a href="consoleView.html">Console View Help page</a>
-        	</li>
-        </ul>
-    </li>  
-</ul>
-
-<h4>That's it!</h4>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/output.html b/tools/gem/org.eclipse.ptp.gem.help/html/output.html
deleted file mode 100644
index 08ec12a..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/output.html
+++ /dev/null
@@ -1,313 +0,0 @@
-﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Understanding GEM Output</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Understanding GEM Console Output</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p><b>
-This page is designed to provide detailed explanations (for those who are curious) of the output generated 
-in the Console View as well as the content of log files GEM generates.
-</b></p>
-
-<p>
-There is no reason for the casual user to understand in any great detail, the output displayed in 
-the GEM Console View or the contents of the log files that are generated. GEM exists to provide an
-intuitive, visual interface to debug and understand MPI applications and MPI runtime behavior and
-to keep the user insulated from the details of trace files. The following views and tools are
-provided by GEM to accomplish this:
-</p>
-<ul>
-	<li>
-		<a href="analyzerView.html">GEM Analyzer View</a>
-	</li>
-	<li>
-		<a href="analyzerView.html">GEM Browser View</a>
-	</li>
-	<li>
-		<a href="happensBeforeViewer.html">Happens Before Viewer</a>
-	</li>
-</ul> 
-
-<h3>Sample Output From GEM Console View:</h3>
-
-<ul>
-    <li>MPI Implementation&nbsp;&#8212;&nbsp;OpenMPI</li>
-    <li>UNIX Sockets enabled</li>
-    <li>FIB Enabled</li>
-    <li>Blocking Sends Enabled</li>
-    <li>3 Processes</li>
-</ul>
-
-<pre>
-ISP - Insitu Partial Order
------------------------------------------
-Command:        /home/alan/mpi/MPI_AnySrc/gem/MPI_AnySrc.gem 
-Number Procs:   3
-Server:         Local Socket
-Blocking Sends: Enabled
-FIB:            Enabled
------------------------------------------
-Started Process: 22044
-(0) is alive on formal
-(2) is alive on formal
-INTERLEAVING :1
-(1) is alive on formal
------------------------------------------
-Transition list for 0
-0 o=1 i=0 rank=0 Barrier /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31 count=1{[0, 1][0, 2]} {}
-1 o=4 i=1 rank=0 Irecv /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:37 src=-1 rtag=0 count=1{[0, 2]} {}    Matched [1,1]
-2 o=7 i=2 rank=0 Recv /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:39 src=1 rtag=0{} {}
-
-Transition list for 1
-0 o=2 i=0 rank=1 Barrier /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31 count=1{[1, 1]} {}
-1 o=5 i=1 rank=1 Send /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:50 dest=0 stag=0{[1, 2]} {}     Matched [0,1]
-2 o=8 i=2 rank=1 Recv /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:52 src=0 rtag=0{} {}
-
-Transition list for 2
-0 o=3 i=0 rank=2 Barrier /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31 count=1{[2, 1]} {}
-1 o=6 i=1 rank=2 Send /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:58 dest=0 stag=0{} {}
-
-No matching MPI call found!
-Detected a DEADLOCK in interleaving 1
------------------------------------------
-Started Process: 22048
-(1) is alive on formal
-(0) is alive on formal
-(2) is alive on formal
-INTERLEAVING :2
-(1) Finished normally
-(0) Finished normally
-(2) Finished normally
------------------------------------------
-ISP detected deadlock!!!
-Total Explored Interleavings: 2
-Interleaving Exploration Mode: All Relevant Interleavings
------------------------------------------
-
-List of Irrelevant Barriers - If want to remove, remove a complete match set:
-Match Set: 1
-0: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31
-1: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31
-2: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:31
-
-Match Set: 2
-0: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:61
-1: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:61
-2: /home/alan/mpi/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c:61
-</pre>
-
-<h2>Output is separated into segments by lines of dashes.</h2>
-<br>
-<ul>
-    <li>
-        The first segment is simply a title and will always display <b>ISP - Insitu Partial Order</b>.
-        ISP is the underlying verification engine used by GEM. The log files GEM interprets are
-        generated by ISP.
-    </li>
-    <li>
-        The second segment is fairly self explanatory, and provides the string used to specify the 
-        name of the executable, the number of processes used, the server used, whether or not 
-        <b>Blocking Sends</b> should be used, and whether or not <b>Functionally Irrelevant Barrier 
-        (FIB) detection</b> is enabled.
-    </li>
-    <li>
-		The third segment is separated into interleavings. An interleaving (also called a schedule)
-		is a description of how the ISP Scheduler issued instruction to the MPI runtime. In this
-		segment, a brief explanation of how each process ran in each interleaving is given. In
-		the example above all three processes started and finished normally in the first interleaving,
-		but in the second interleaving a deadlock was found so each process had to abort.
-    </li>
-    <li>
-		The last segment describes how each MPI call was handled. Its 
-		format is very similar to that of the log file except that the calls are grouped 
-		by the process that issued it. To understand what it means 
-		please read the following section on understanding the log file.
-	</li>
-</ul>
-
-<h2>Understanding the Log Files</h2>
-<p>
-Like <b>GEM Console</b> output, users are not expected to understand log files. The best way understand what 
-the log file contents represent is to run the <a href="happensBeforeViewer.html">Happens Before (HB) Viewer</a> 
-to graphically examine the information it displays. The log file consists of a single number (the first line)
-that says how many processes were used to create the file, a list of every MPI call that program issued and 
-information about how that MPI call interacts with other MPI calls, unless a deadlock is found, at which point
-progress halts for that particular interleaving. Here the log will have a line giving the interleave number 
-and the word <b>&#34;DEADLOCK&#34;</b>. It is possible to have more than one deadlock in your program. Each 
-deadlock will be contained in a particular interleaving (e.g. and interleaving can have at most one deadlock).
-</p>
-
-<pre>
-3
-1 0 0 1 1 Barrier 0_0:1:2: { 1 2 } { [ 1 1 ] [ 2 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-1 0 1 4 5 Irecv -1 0 0_0:1:2: { 2 } { [ 1 2 ] } Match: 1 1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 37
-1 0 2 7 -1 Recv 1 0 0_0:1:2: { } { } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 39
-1 1 0 2 2 Barrier 0_0:1:2: { 1 } { [ 0 1 ] [ 0 2 ] [ 2 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-1 1 1 5 4 Send 0 0 0_0:1:2: { 2 } { [ 0 2 ] } Match: 0 1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 50
-1 1 2 8 -1 Recv 0 0 0_0:1:2: { } { } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 52
-1 2 0 3 3 Barrier 0_0:1:2: { 1 } { [ 0 1 ] [ 0 2 ] [ 1 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-1 2 1 6 -1 Send 0 0 0_0:1:2: { } { } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 58
-1 DEADLOCK
-2 0 0 1 6 Barrier 0_0:1:2: { 1 2 } { [ 1 0 ] [ 2 0 ] [ 1 1 ] [ 0 0 ] [ 2 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-2 0 1 4 10 Irecv -1 0 0_0:1:2: { 2 5 } { [ 2 1 ] [ 2 2 ] } Match: 2 1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 37
-2 0 2 7 12 Recv 1 0 0_0:1:2: { 3 } { [ 1 1 ] [ 1 2 ] [ 0 2 ] } Match: 1 1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 39
-2 0 3 17 13 Send 1 0 0_0:1:2: { 4 } { [ 1 2 ] [ 1 3 ] [ 0 3 ] } Match: 1 2 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 41
-2 0 4 19 16 Recv -1 0 0_0:1:2: { 5 } { [ 1 3 ] [ 1 4 ] } Match: 1 3 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 44
-2 0 5 21 17 Wait { 6 } { } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 46
-2 0 6 23 18 Barrier 0_0:1:2: { 7 } { [ 1 4 ] [ 2 2 ] [ 1 5 ] [ 0 6 ] [ 2 3 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 61
-2 0 7 24 21 Finalize { } { [ 1 5 ] [ 2 3 ] [ 0 7 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 63
-2 1 0 2 7 Barrier 0_0:1:2: { 1 } { [ 0 0 ] [ 2 0 ] [ 0 1 ] [ 0 2 ] [ 1 0 ] [ 2 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-2 1 1 5 11 Send 0 0 0_0:1:2: { 2 } { [ 0 2 ] [ 0 3 ] [ 1 1 ] } Match: 0 2 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 50
-2 1 2 18 14 Recv 0 0 0_0:1:2: { 3 } { [ 0 3 ] [ 0 4 ] [ 1 2 ] } Match: 0 3 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 52
-2 1 3 20 15 Send 0 0 0_0:1:2: { 4 } { [ 0 5 ] [ 1 3 ] } Match: 0 4 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 54
-2 1 4 22 19 Barrier 0_0:1:2: { 5 } { [ 0 6 ] [ 2 2 ] [ 0 7 ] [ 1 4 ] [ 2 3 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 61
-2 1 5 25 22 Finalize { } { [ 0 7 ] [ 2 3 ] [ 1 5 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 63
-2 2 0 3 8 Barrier 0_0:1:2: { 1 } { [ 0 0 ] [ 1 0 ] [ 0 1 ] [ 0 2 ] [ 2 0 ] [ 1 1 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 31
-2 2 1 6 9 Send 0 0 0_0:1:2: { 2 } { [ 0 2 ] [ 0 5 ] [ 2 1 ] } Match: 0 1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 58
-2 2 2 16 20 Barrier 0_0:1:2: { 3 } { [ 0 6 ] [ 1 4 ] [ 0 7 ] [ 2 2 ] [ 1 5 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 61
-2 2 3 26 23 Finalize { } { [ 0 7 ] [ 1 5 ] [ 2 3 ] } Match: -1 -1 File: 98 /home/alan/mpi/MPI_AnySrc/src/MPI_AnySrc.c 63
-...
-</pre>
-
-<hr>
-
-<p>
-To understand the format, we will take a single line from the generated log file (line shown below) as an example, and explain each portion in detail:
-</p>
-
-<hr/>
-<b><tt>
-&nbsp;&nbsp;2 0 1 4 10 Irecv -1 0 0_0:1:2: { 2 5 } { [ 2 1 ] [ 2 2 ] } Match: 2 1 File: 98 /home/alan/MPI/MPI_AnySrcCanDeadlock/src/MPI_AnySrc.c 37
-</tt>
-</b>
-<hr/>
-<br/>
-
-<table border="1" cellpadding="5">
-<tr>
-    <th>Element</th>
-    <th>Title</th>
-    <th>Explanation</th>
-</tr>
-<tr>
-    <td><b>2</b></td>
-    <td style="width: 245px">Interleaving Number (1-based)</td>
-    <td>This MPI call was issued in the second interleaving.</td>
-</tr>
-<tr>
-    <td><b>0</b></td>
-    <td style="width: 245px">Process Number (0-based)</td>
-    <td>This call was issued by process zero.</td></tr>
-<tr>
-    <td><b>1</b></td>
-    <td style="width: 245px">Process Call Index (0-based)</td>
-	<td>The order the envelope is sent by the process. This was second call issued by this process.</td>
-</tr>
-<tr>
-    <td><b>4</b></td>
-    <td style="width: 245px">Scheduler Receive Index (1-based)</td>
-    <td>This was the fourth call received by ISP&#39;s scheduler.</td>
-</tr>
-<tr>
-    <td><b>10</b></td>
-    <td style="width: 245px">Scheduler Issue Index (1-based)</td>
-    <td>The order in which MPI calls are issued to the MPI runtime. This was the tenth call performed by ISP.</td>
-</tr>
-<tr>
-    <td><b>Irecv</b></td>
-    <td style="width: 245px">MPI Call Name</td>
-    <td>This call was a MPI <b>Irecv</b> issued by process 0.</td>
-</tr>
-<tr>
-    <td><b>-1</b></td>
-    <td style="width: 245px">The Source Index</td>
-    <td>Source is -1 in this case because the MPI call itself is the source. This call was a MPI Irecv issued by process 0.</td>
-</tr>
-<tr>
-    <td><b>0</b></td>
-    <td style="width: 245px">MPI Message Tag</td>
-    <td>The MPI message tag here is <b>0</b>.</td>
-</tr>
-<tr>
-    <td><b>0_</b></td>
-    <td style="width: 245px">MPI Communicator</td>
-    <td>The MPI communicator this MPI call is a member of.</td>
-</tr>
-<tr>
-    <td><b>0:1:2</b></td>
-    <td>Processes in MPI communicator</td>
-	<td>Processes 0, 1, and 2 are in this particular MPI communicator <i>(MPI_COMM_WORLD in this example).</i></td>
-</tr>
-<tr>
-    <td><b>{2 5}</b></td>
-    <td style="width: 245px">Intra-Process MPI calls blocked</td>
-	<td>Blocks the MPI calls within this processes with <b>Process Call Index</b> of 2 and 5, Recv and Finalize in this case.</td>
-</tr>
-<tr>
-    <td><b>{ [ 2 1 ] [ 2 2 ] }</b></td>
-    <td style="width: 245px">Inter-Process MPIcalls blocked</td>
-	<td>
-	   Blocks the indicated calls across processes (MPI calls found in other processes). Each are listed in pairs 
-	   (numbers between the [ ] form a pair), the first element of the pair is the process that made the MPI call, 
-	   the second number is the <b>Process Call Index</b>. For example, the first pair tells us that the call from 
-	   process 2 with a Process Call Index of 1 is blocked.
-	</td>
-</tr>
-<tr>
-    <td><b>Match: 2 1</b></td>
-    <td style="width: 245px">Match Rank &#38; Index</td>
-	<td>
-	   For calls like Send and Recv and has -1 -1 for calls without matches (e.g. collectives). Here the <b>match rank</b> is 
-	   process <b>2</b> and the <b>match index</b> is <b>1</b>.
-	</td>
-</tr>
-<tr>
-    <td><b>File: 98</b></td>
-    <td style="width: 245px">Filename &#38; with length</td>
-	<td>The length of the file name length in this example is <b>98</b>.</td>
-</tr>
-<tr>
-    <td><b>/home/.../.../MPI_AnySrc.c</b></td>
-    <td style="width: 245px">The path and name of the source code file containing the MPI call</td>
-    <td>The fully qualified path to the source code file named <b>MPI_AnySrc.c</b>.</td>
-</tr>
-<tr>
-    <td><b>37</b></td>
-    <td style="width: 245px">Line number MPI call is found on</td>
-    <td>This MPI call is found on <b>line 37</b> of the source code file listed above.</td>
-</tr>
-</table>
-
-<p>&nbsp;</p>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<p>&nbsp;</p>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/overview.html b/tools/gem/org.eclipse.ptp.gem.help/html/overview.html
deleted file mode 100644
index 868f11b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/overview.html
+++ /dev/null
@@ -1,395 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>GEM - Overview and Features</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>GEM - Overview and Features</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p>
-Graphical Explorer of MPI Programs (GEM), is a graphical front end for 
-In-situ Partial Order (ISP), a dynamic formal verification tool for MPI C/C++ 
-programs, developed at the University of Utah. GEM greatly enhances the usability 
-of ISP by providing an intuitive graphical way to track down bugs in MPI C/C++ 
-programs, examine post-runtime results and to analyze MPI runtime behavior. 
-</p>
-
-<p>
-GEM can be used by anyone who can write simple MPI C/C++ programs, and requires no
-special training. GEM allows you to formally verify your MPI C/C++ programs automatically
-without any extra efforts on your part. No code instrumentation is necessary. GEM
-will definitively flag the following errors and warnings:
-</p>
-
-<ul>
-    <li>Deadlocks</li>
-    <li>Functionally Irrelevant Barriers</li>
-    <li>MPI Object Leaks</li>
-    <li>Local Assertion Violations</li>
-    <li> MPI Type Mismatches</li>
-</ul>
-
-<h3>Analyzer View</h3>
-<p>
-The <a href="analyzerView.html">Analyzer View</a> is a unique user interface that visually displays the output 
-from the log file that was generated at runtime (by ISP) by highlighting lines representing match sets (p2p and collective send-recv matches) in the source file. 
-It shows both the current MPI call, and any matching point-to-point or collective operation.
-The <a href="analyzerView.html">Analyzer View</a> also allows the user to examine
-MPI calls for a particular rank with an easy to use <b>Rank Locking</b> feature.
-</p>
-
-<p>
-The Analyzer View offers the user the ability to &#34;step&#34; through execution of the code in debug fashion
-examining the execution of the MPI calls in the program as they happened at runtime. The user can view this in 
-two different orderings&#58;
-</p>
-<ul>
-	<li>
-		Internal Issue Order - The order in which the MPI calls were issued to the MPI runtime.
-	</li>
-	<li>
-		Program Order - The order in which the MPI calls appear in the source code.
-	</li>	
-</ul>
-
-<p>
-The source code analyzer also offers a feature to browse calls by rank and by interleaving as well as the ability to
-launch the <a href="happensBeforeViewer.html">Happens Before Viewer</a>, another visualization tool provided by GEM.
-</p>
-
-<br>
-<img src="images/analyzer.png" width="858" height="581"/>
-<br>
-
-<p>
-In addition, it helps you understand as well as step through all relevant process interleavings
-(schedules). Notice our use of the word <b>relevant</b>: even a short MPI program may have too many
-(an &#34;exponential number&#34;) interleavings. For example, an MPI program with five processes, each
-containing five MPI calls, can have well in excess of 1000 interleavings. However, ISP generates
-a new interleaving only when it represents a truly new (as yet unexamined) behavior in your MPI program.
-</p>
-
-<h3>As Examples:</h3>
-<ul>
-    <li>
-        If an MPI program consisting of two processes issues point-to-point sends and non-wildcard
-        receives to each other, then there is no observable difference (apart from performance or
-        resource consumption) whether the sends are posted before each matching receive or vice
-        versa; in this case, ISP will generate only one interleaving;
-        </li>
-    <li>
-        If an MPI program consisting of three processes is such that the second process issues a
-        sequence of wildcard receives, and the first and third process issue point-to-point sends
-        to process two, then the exact non-deterministic choices of matches made at each step may
-        affect the ensuing computation (including the conditional outcomes). In such programs, it
-        is possible to force an exponential number of interleavings. In practice, here is how the
-        results look (these examples come with the ISP distribution).
-    </li>
-    <li>
-        For Parmetis [1], a 14,000+ line MPI program that makes 56,990 MPI calls for four ranks and
-        171,956 calls for eight ranks, ISP needed to examine only one interleaving!
-    </li>
-    <li>
-        For many tests in the Umpire test suite [2], conventional MPI testing tools missed deadlocks
-        despite examining many schedules. ISP determined a minimal list of interleavings to examine,
-        finding deadlocks whenever they existed (see our table of results at the URL given under [3]).
-    </li>
-    <li>
-        For Madre [4], a naive algorithm can result in n! interleavings. An improved algorithm
-        called POE B, present in the current release of ISP reduces this to one interleaving.
-        Much like with existing partial order [5], ISP does not guarantee a
-        minimal number of interleavings, although it comes pretty close to it.
-    </li>
-</ul>
-
-<h3>Browser View</h3>
-
-<p>
-The <a href="browserView.html">Browser View</a> is a highly functional view that summarizes and categorically groups all 
-errors and warnings found by GEM for a particular MPI verification run. The summary label (just above the tabs) 
-gives the user a quick overview of problems found. Errors and warnings are mapped to the corresponding 
-source code lines in the Eclipse editor. The Browser View&#39;s tabs help the user to quickly localize 
-and fix MPI errors and warnings flagged by GEM within their source code.
-</p>
-
-<ul>
-	<li>
-		<b>Deadlocks:</b>&nbsp;&nbsp;
-		This tab allows the user to visit all calls that did not complete due 
-		to a detected deadlock.
-	</li>
-	<li>
-		<b>Assertion Violations:</b>&nbsp;&nbsp;
-		This tab lists all local assertion violations found. Clicking any 
-		one of these will take the user to the line of source code with the failed assertion.
-	</li>
-	<li>
-		<b>Leaks:</b>&nbsp;&nbsp;
-		Clicking any of these will take the user to the line of source code where the 
-		corresponding un-freed MPI resource was allocated (these are usually MPI communicators and MPI DataTypes).
-	</li>
-	<li>
-		<b>Irrelevant Barriers:</b> &nbsp;&nbsp;
-        This tab is reserved for Functionally Irrelevant Barriers. Clicking any these will take the user to 
-        the corresponding MPI_Barrier call itself, which can then be safely removed without changing the 
-        runtime behavior of the MPI application. This could potentially speed the application up with the 
-        absence of unnecessary synchronization.
-	</li>
-	<li>
-		<b>Type Mismatches:</b>&nbsp;&nbsp;
-		These are warnings about the send type not matching the receive type. In some cases this may be 
-		intentional, but often times it is a programming mistake.
-	</li>
-</ul>
-
-<p>
-At the top left is a brief summary of the results indicating the number of errors and warnings found.
-In the top right are buttons provided with the ability to set the number of processes and re-run GEM
-on the current MPI project.
-</p>
-
-<br>
-<img src="images/browser.png" width="755" height="368"/>
-<br>
-
-<h3>How GEM Works:</h3>
-<p>
-GEM employs the use of In-situ Partial Order (ISP), the underlying dynamic formal verification tool, to verify
-MPI C/C++ programs. Here we describe ISP in detail to provide a better understanding of how it works.
-</p>
-<p>
-ISP works by intercepting the MPI calls made by the target program and making decisions on when
-to send these MPI calls to the MPI library. This is accomplished by the two main components of ISP:
-the Profiler and the Scheduler. An overview of ISP&#146;s components and their interaction with the
-program as well as the MPI library is provided in Figure 1 below.
-</p>
-
-<center>
-<img src="images/ISP-diagram.gif"><br>
-<b>Figure 1</b>
-</center>
-
-<h3>Profiler:</h3>
-<p>
-The interception of MPI calls is accomplished by compiling the ISP Profiler together with
-the target program&#146;s source code. The Profiler makes use of MPI&#146;s profiling mechanism
-(PMPI). Then the Profiler provides its own version of MPI <i>f</i> (replacing the original) for each corresponding MPI function <i>f</i>. Within
-each of these MPI <i>f</i> , the profiler communicates with the scheduler using TCP sockets to
-send information about the MPI call the process wants to make. It will then wait for the
-scheduler to make a decision on whether to send the MPI call to the MPI library or to
-postpone it until later. When the permission to fire <i>f</i> is given from the scheduler, the
-corresponding PMPI <i>f</i> will be issued to the MPI run-time. Since all MPI libraries come
-with functions such as PMPI <i>f</i> for every MPI function <i>f</i>, this approach provides a portable
-and light-weight instrumentation mechanism for MPI programs being verified [6].
-</p>
-
-<h3>Scheduler:</h3>
-<p>
-The ISP Scheduler helps carry out the POE algorithm. As it turns out, the POE algorithm is
-based on exploiting MPI&#146;s out-of-order completion semantics. In other words,
-</p>
- 
-<ul>
-    <li>
-        (i) Not all MPI operations issued by a process complete in that order.
-    </li>
-    <li>
-        (ii) A proper modeling of this out of-order completion semantics is essential in
-        order to meet goals G1 and G2. For example, two MPI_Isend commands issued in
-        succession by an MPI process P1 to the same target process (say P2) are forced to
-        match in order, whereas if these MPI_Isends are targeted to two different MPI
-        processes, then they may match contrary to the issue order. As another example,
-        any operation following an MPI_Barrier must complete only after the barrier has
-        completed, while an operation issued before the barrier may linger across the
-        barrier, and actually complete after the barrier [6]!
-    </li>
-</ul>
-
-<h3>Description of POE Algorithm:</h3>
-<p>POE stands for &#34;POR with out-of-order and elusive interleavings" </P>
-<P>
-MPI programs suffer from &#34;elusive&#34; interleavings in the presence of MPI
-wildcard Receive <I>R</I>(*) . Issuing the MPI sends in different orders does not
-help as the MPI runtime provides no guarantees based on when the Send is
-actually issued. POE employs dynamic source re-writing in place of wildcard
-so that every interleaving explored by POE algorithm is deterministic. Also,
-the presence of collectives such as <CODE>MPI\_Barrier</CODE> can cause traditional
-runtime verification techniques such as &#34;Dynamic Partial Order Reduction" to
-fail since it is not always possible to issue instructions in different orders
-in the presence of collectives. POE also addresses this issue by creating
-&#34;match sets".
-</P>
-
-<p>
-POE algorithm works by creating a graph structure with the MPI operations of
-processes as nodes and by adding <EM>Intra-Completes-Before</EM> (IntraCB) edges
-between these nodes. As the name suggests, IntraCB edges are only added between
-the MPI operations within the MPI processes. The IntraCB edges are added
-between the MPI operations based on the MPI semantics of the operations. MPI
-functions like <CODE>MPI_Barriers</CODE>, <CODE>MPI_Wait</CODE> etc have the semantics,
-that no later MPI operations can be issued until these MPI operations complete.
-We call such operations as <EM>fence operations</EM>. Note that instructions
-issued before the fence operations can linger even after the fence operation
-is complete. </P><P>The IntraCB edges are added based on the following rules:
-Let <I>i</I> and <I>j</I> be the MPI operations of a process <I>P</I> such that <I>i</I> &lt; <I>j</I> (i.e.,
-<I>i</I> comes before <I>j</I> in the program order. There is an IntraCB edge between <I>i</I>
-and <I>j</I> is one of the following is true:
-</P>
-
-<UL>
-    <LI><I>i</I> is a <EM>fence</EM> operation.</LI>
-    <LI><I>i</I> and <I>j</I> are send operations and the destination of <I>i</I> and <I>j</I> are the same</LI>
-    <LI><I>i</I> and <I>j</I> are receive operations and the source of <I>i</I> and <I>j</I> are the same</LI>
-    <LI><I>i</I> is a wildcard receive operation and <I>j</I> is a receive operation.</LI>
-</UL>
-
-<P>
-If there is a path from <I>i</I> to <I>j</I> then <I>i</I> is called the ancestor of <I>j</I>. POE
-algorithm uses these IntraCB edges to form <EM>match-sets</EM> to be issued into
-the MPI runtime. The following is the (informal) algorithm:</P><P>An MPI operation is &#34;matched&#34;
-if it has been issued to the MPI runtime by the POE algorithm.
-</P>
-
-<OL CLASS="enumerate" type=1>
-    <LI>Run the MPI processes until they all reach fence operations.</LI>
-    <LI>Let <I>e</I> denote the MPI operations of all processes such that for each <I>i</I> &#8712; <I>e</I>, all ancestors of <I>i</I> have been matched.</LI>
-    <LI>Let <I>m</I> denote the match-sets formed out of <I>e</I> as follows:
-    <UL>
-        <LI>
-            <B>SR-Match:</B> <I>i</I>, <I>j</I> &#8712; <I>e</I> such that <I>i</I> and <I>j</I> are send and receive
-            operations where source (destination) of <I>i</I> is equal to the destination
-            (source)j, then &#9001; <I>i</I>, <I>j</I>&#9002; form a match set.
-        </LI>
-        <LI>
-            <B>SR*-Match</B> If <I>i</I> is a wildcard receive and <I>j</I><SUB>1</SUB>,<I>j</I><SUB>2</SUB>&#8230; <I>j</I><SUB><I>n</I></SUB> are the matching
-            sends, then create the match-sets as {&#9001; <I>i</I>, <I>j</I><SUB>1</SUB>&#9002;, &#9001; <I>i</I>,
-            <I>j</I><SUB>2</SUB>&#9002;, &#8230; &#9001; <I>i</I>, <I>j</I><SUB><I>n</I></SUB>&#9002;}. Each element of the set is issued as a different interleaving.
-        </LI>
-        <LI>
-            <B>C-Match:</B> If <I>i</I><SUB>1</SUB>,<I>i</I><SUB>2</SUB>&#8230; <I>i</I><SUB><I>n</I></SUB> are the same collective operation of <I>n</I> processes
-            then &#9001; <I>i</I><SUB>1</SUB>, <I>i</I><SUB>2</SUB>, &#8230;, <I>i</I><SUB><I>n</I></SUB>&#9002; form a match set.
-        </LI>
-        <LI>
-            <B>W-Match</B>If <I>i</I> is an <CODE>MPI_Wait</CODE>, then &#9001; <I>i</I> &#9002; forms a match set.
-        </LI>
-    </UL>
-    </LI>
-    <LI>
-        Issue the match sets to MPI runtime in the following priority order: <EM>C-Match &gt; W-Match &gt; SR-Match &gt; SR*-Match</EM>.
-    </LI>
-    <LI>
-        If any of the processes issued a fence operation then goto step 1. Else, goto step 4. 
-    </LI>
-    <LI>
-        If there are no match sets and all processes have issued <CODE>MPI_Finalize</CODE>, check if any wildcard match sets are yet to be explored. If yes, then restart the processes and goto step 1, otherwise, exit.
-    </LI>
-    <LI>
-        If there are no match sets and there is at least one process that has not issued <CODE>MPI_Finalize</CODE>, then there is a deadlock. Flag a deadlock and kill all the MPI processes.
-    </LI>  
-</OL>
-
-<h3>Obtaining ISP and Examples</h3>
-
-ISP can be downloaded from the Gauss Group&#146;s <a href="http://www.cs.utah.edu/formal_verification/ISP-release">ISP Release Page</a>.
-
-<p>
-    What you will receive are the full sources as well as the following examples in the directory isp-tests:
-</p>
-
-<ul>
-    <li>
-        12 examples pertaining to the Game of Life (in directory life, courtesy of Bill Gropp of UIIC
-        and Rusty Lusk of Argonne from their EuroPVM/MPI 2007 tutorials)
-    </li>
-    <li>
-        74 examples of the Umpire test suite (in directory Umpire), courtesy of Bronis de Supinski from LLNL.
-    </li>
-    <li>
-        12 examples under others developed by various authors.
-    </li>
-    <li>
-        16 examples under madre-0.3 courtesy of Stephen F. Siegel (U. of Delaware) from his Madre release (see our PPoPP 2009 paper).
-    </li>
-    <li>
-        The Parmetis 3.1 hypergraph partitioner (see our PPoPP 2009 paper).
-    </li>
-</ul>
-
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h3>Why the Trident?</h3>
-            <p>
-                Because It is a universal symbol for &#34;slaying the evil bug&#34;!
-            </p>
-        </td>
-    </tr>
-</table>
-
-<br>
-<hr>
-
-<h3>References</h3>
-<ul>
-    <li>
-        [1] ParMETIS - Parallel graph partitioning and fill-reducing matrix ordering.
-    </li>
-    <li>
-        [2] Jeffrey S. Vetter and Bronis R. de Supinski. Dynamic software testing of MPI
-        applications with Umpire. In Supercomputing &#146;00: Proceedings of the 2000 ACM/IEEE
-        Conference on Supercomputing (CDROM). IEEE Computer Society, 2000. Article 51.    
-    </li>
-    <li>
-       [3] Sarvani Vakkalanka, Ganesh Gopalakrishnan, and Robert M. Kirby. Dynamic verification
-       of MPI programs with reductions in presence of split operations and relaxed orderings.
-       In Aarti Gupta and Sharad Malik, editors, CAV, volume 5123 of Lecture Notes in
-       Computer Science. Springer, 2008.
-    </li>
-    <li>
-        [4] Stephen F. Siegel. The MADRE web page.
-    </li>
-    <li>
-        [5] Edmund M. Clarke, Orna Grumberg, and Doron A. Peled. Model Checking. MIT Press, 2000.
-    </li>
-    <li>
-        [6] Anh Vo, Sarvani Vakkalanka, Rajeev Thakur, Michael DeLisi, Ganesh Gopalakrishnan and Robert M. Kirby.
-        Formal Verification of Practical MPI Programs. PPoPP &#146;09, February 14&#150;18, 2009, Raleigh, North Carolina, USA.
-    </li>
-</ul>
-
-<br/>
-<hr/>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr/>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/preferences.html b/tools/gem/org.eclipse.ptp.gem.help/html/preferences.html
deleted file mode 100644
index 877718a..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/preferences.html
+++ /dev/null
@@ -1,154 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>GEM - Preferences</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>GEM - Preferences</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p>
-<em>To edit preferences, from the Eclipse menus, go to <b>Window -&#62; Preferences -&#62; Parallel Tools -&#62; GEM</b></em>
-</p>
-
-<p>
-GEM has two preference pages:
-</p>
-<ol>
-	<li>
-		<b>GEM Preferences:</b> This preference page is for settings related to how views and various 
-		components within GEM behave and function. Here the user can control which GEM Views are shown and 
-		when, e.g. the active view (the view in focus after verification is complete).
-	</li>
-	<li>
-		<b>ISP Preferences:</b> This preference page is for command line settings for the underlying formal 
-		verification engine GEM uses, In-situ Parital Order (ISP)
-	</li>
-</ol>
-
-<h4>Below are detailed descriptions of each of GEM's Preference Pages.</h4>
-
-<hr/>
-
-<h2><a name="gemprefs">GEM Preference Page</a></h2>
-<br/>
-<a name="gemPrefs"></a>
-<img src="images/gemPrefs.png">
-
-<h4>Note:</h4>
-<ol>
-    <li>
-        Please note the smaller help button on this preference page (below the &#34;Active View:&#34; label).
-        Clicking this button while viewing the GEM preference page will bring you to this help page.
-    </li>
-</ol>
-
-<h3>GEM Preferences Reference Table</h3>
-<table border="1"  cellpadding="5">
-<tr><th>Preference</th><th>Meaning or Condition When Selected</th></tr>
-<tr>
-	<td>Number of Processes:</td>
-	<td>
-		This field takes an integer value that represents the number of processes to use for the next GEM 
-	    verification. It is what is stored after going through the motions on the
-	    <a href="setNumProcs.html">Setting the Number of Processes</a> page.
-	</td>
-</tr>
-<tr>
-	<td>Clear GEM Console on Each Run</td>
-	<td>
-		When enabled (checked), the GEM Console will be cleared prior to each verification run. If this preference
-		is not enabled, output is appended to the existing GEM Console content (at the bottom).
-	</td>
-</tr>
-<tr>
-	<td>Request Command Line Arguments</td>
-	<td>
-		When enabled (checked), a dialog box will appear when GEM verification is started. This dialog box will ask for command line arguments.
-		When disabled, no dialog box will appear.
-	</td>
-</tr>
-<tr>
-	<td>Active View:</td>
-	<td>
-		The selected view will be the one that gets the active focus after each GEM verification run, e.g. if you
-		would like to see the Analyzer View after each verification, then simply select &#34;Analyzer&#34;.
-	</td>
-</tr>
-</table>
-
-<br/>
-<hr/>
-
-<h2>ISP Preference Page</h2>
-<br/>
-<a name="ispPrefs"></a>
-<img src="images/ispPrefs.png">
-
-<h4>Note:</h4>
-<ol>
-    <li>
-        If ISP is configured and installed with default values, there is no need to fill in the  four items in the &#34;ISP Paths&#34;
-        group of the ISP preferences page. When blank, the plug-in will assume they are in the default location (<tt><b>/usr/local/bin</b></tt>).
-        These items simply need to be in your path (we show <tt><b>/usr/local/bin</b></tt> purely for the sake of illustration here).
-    </li>
-    <li>
-        Please note the smaller help button on this preference page (below &#34;ISP Paths&#34; group).
-        Clicking this button while viewing the ISP preference page will bring you to this help page.
-    </li>
-</ol>
-
-<h3>ISP Preferences Reference Table</h3>
-<table border="1"  cellpadding="8">
-<tr><th colspan="2">Command Line Options</th></tr>
-<tr><td>Enable FIB</td> <td>Enables detection of irrelevant barriers</td></tr>
-<tr><td>Log Total MPI Calls</td> <td>Outputs the number of MPI calls trapped for each rank (Console View)</td></tr>
-<tr><td>Enable OpenMP</td> <td>Enables OpenMP based parallelization on multi-core machines</td></tr>
-<tr><td>Use Blocking Sends</td> <td>Sends will be treated as blocking, without buffering</td></tr>
-<tr><td>Report Progress</td> <td>Outputs progress every (n) MPI calls (default is 4). Note: If this is checked, please set the Report progress field below</td></tr>
-<tr><td>Use Unix Sockets</td> <td>Enable this when running GEM on a single, local machine. It speeds up ISP/GEM significantly</td></tr>
-<tr><td>Verbose Mode</td> <td>Output the transition list for all interleavings, otherwise only output last interleaving if deadlock.</td></tr>
-<tr><th colspan="2">Miscellaneous Options</th></tr>
-<tr><td>Port</td> <td>Assigns the port to communicate with MPI programs(default is 9999). GEM will search for a port that is free if specified port is unavailable</td></tr>
-<tr><td>Report Progress Every (n) MPI Calls</td> <td>Outputs progress every (n) MPI calls (default is 4).  Note: This is ignored if Report Progress is not checked</td></tr>
-<tr><td>Host Where ISP Resides</td> <td>If ISP is installed on a remote machine, enter the fully qualified hostname here. If ISP is installed on your local machine (e.g. laptop), leave this blank</td></tr>
-<tr><th colspan="2">ISP Paths</th></tr>
-<tr><td>isp executable </td> <td>The location of the local <b>isp executable</b> (this is ISP itself)</td></tr>
-<tr><td>ispcc script</td> <td>The location of the local <b>ispcc script</b> (for C compilation)</td></tr>
-<tr><td>ispCC script</td> <td>The location of the local <b>ispCC script</b> (for C++ compilation)</td></tr>
-<tr><td>HB Viewer script</td> <td>The location of the <b>HB Viewer</b> script (a.k.a. ispUI). This will only be local.</td></tr>
-<tr><td>remote isp executable </td> <td>The location of the remote <b>isp executable</b> (this is ISP itself)</td></tr>
-<tr><td>remote ispcc script</td> <td>The location of the remote <b>ispcc script</b> (for C compilation)</td></tr>
-<tr><td>remote ispCC script</td> <td>The location of the remote <b>ispCC script</b> (for C++ compilation)</td></tr>
-</table>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr/>
-
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/prereqs.html b/tools/gem/org.eclipse.ptp.gem.help/html/prereqs.html
deleted file mode 100644
index 8b41194..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/prereqs.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>GEM - Prerequisites</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>GEM - Prerequisites</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p>
-The following prerequisites are required for GEM installation.
-</p>
-
-<ul>
-	<li>JavaSE-1.6 or later</li>
-    <li><a href="http://www.cs.utah.edu/formal_verification/ISP-release/">ISP</a> version 0.3.0 or later</li>
-    <li><a href="http://eclipse.org/downloads">Eclipse SDK</a> Juno or later</li>
-    <li><a href="http://eclipse.org/cdt/">Eclipse C/C++ Development Tools (CDT)</a> version 8.2.0 or later</li>
-    <li><a href="http://eclipse.org/ptp/">Eclipse Parallel Tools Platform (PTP)</a> version 7.0.0 or later</li>
-</ul>
-
-<br>
-
-<table border="1" cellpadding="4">
-  <tr>
-    <th colspan="2" scope="col">Operating Systems and Architectures Supported<br></th>
-  </tr>
-  <tr>
-    <th scope="col">Operating System</th>
-    <th scope="col">Architecture</th>
-  </tr>
-  <tr>
-    <td>Linux</td>
-    <td>x86, x86_64</td>
-  </tr>
-  <tr>
-    <td>MacOS X</td>
-    <td>x86</td>
-  </tr>
-</table>
-
-<br>
-
-<p>
-Some implementation of MPI must be installed, MPICH2 or OpenMPI both work well. If you are using MPICH v1.2 or lower, 
-you will also need to have your process manager (e.g. mpd) and running. GEM assumes your process manager is already 
-running when it is loaded. If you are using MPICH2 v1.3 with Hydra, you don&#39;t need to worry about this.
-</p>
-
-<ul>
-    <li><a href="http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads">MPICH2</a> version 1.0.6p1 or later</li>
-    <li><a href="http://open-mpi.org">Open MPI</a> version 1.2.x or later</li>
-</ul>
-
-<br>
-
-<hr>
-<h2>Here are some of the major requirements for GEM to be able to run:</h2>
-<br>
-<ul>
-    <li>
-        <b>Machine:</b> GEM can be run on machines with one or more CPU cores. With more cores,
-        GEM&#39;s OpenMP parallelization can help speed up model checking.
-    </li>
-    <li>
-        <b>Sockets:</b> GEM can be run with TCP sockets or Unix-domain sockets. The latter is
-        much faster, but requires all GEM runs to occur within one machine. A distributed GEM
-        checker is in our future plans.
-    </li>
-    <li>
-        <b>Operating Systems:</b> GEM is designed for Linux and MacOS X
-    </li>
-    <li>
-        <b>MPI Libraries:</b> The current GEM release is for MPICH2. We have successfully tested
-        GEM with OpenMPI as well as Microsoft’s MPI (sometimes called CCS) and Intel&#169; MPI. 
-        An enhanced configure and make will be released corresponding to these MPI libraries also. 
-        If you are interested, kindly let us know and we can help tailor the current distribution 
-        with these other MPI libraries. For MAC OS/X, one can run GEM using the OpenMPI that comes by default.        
-    </li>
-</ul>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr/>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/remoteProjects.html b/tools/gem/org.eclipse.ptp.gem.help/html/remoteProjects.html
deleted file mode 100644
index 0752c11..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/remoteProjects.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Remote and Synchronized Projects</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Remote and Synchronized Projects</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<h3>GEM supports remote and synchronized C/C++ MPI projects whose connections are through one of the following remote service providers:</h3>
-
-<ul>
-    <li><a href="PLUGINS_ROOT/org.eclipse.ptp.doc.user/html/remoteTools.html">Built-in SSH</a> (default)</li>
-	<li>Remote Tools (now deprecated in PTP 8.0)</li>
-	<li>Remote System Explorer</li>
-</ul>
-
-<a href="PLUGINS_ROOT/org.eclipse.ptp.doc.user/html/toc.html">Parallel Tools Platform</a> (PTP),  
-
-<h3>Target machine requirements:</h3>
-
-<ul>
-    <li><a href="http://www.cs.utah.edu/formal_verification/ISP-release/">ISP</a> version 0.3.0 or later</li>
-	<li>
-		<b>C/C++ Compiler</b>
-	</li>    
-    <li>
-		<b>Some implementation of MPI</b> must be installed, OpenMPI and MPICH2 both work well. If you are using MPICH v1.2 or lower, 
-		you will also need to have your process manager (e.g. mpd) and running. GEM assumes your process manager is already 
-		running when it is loaded. If you are using MPICH2 v1.3 or later with Hydra, you don&#39;t need to worry about this.
-	</li>
-		
-</ul>
-
-<p>
-GEM operates and behaves identically with local, remote and synchronized C/C++ MPI projects. 
-The only limitation is that GEM currently does not support the <a href="happensBeforeViewer.html">
-Happens Before Viewer</a> with remote and synchronized projects, as it is an external tool.
-The <a href="happensBeforeViewer.html"> Happens Before Viewer</a> will soon be integrated into
-a new GEM view.
-</p>
-
-<br/><br/>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br/><br/>
-
-<hr/>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/setNumProcs.html b/tools/gem/org.eclipse.ptp.gem.help/html/setNumProcs.html
deleted file mode 100644
index c9419b0..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/setNumProcs.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-	<title>Setting the Number of Processes</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Setting the Number of Processes</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-
-<p>
-Before formally verifying an MPI C/C++ program, you need to set the number of processes
-for a particular run.
-</p>
-
-<p>
-There are two methods of doing this:
-</p>
-
-<h2>GEM Toolbar Button</h2>
-Open the source code file in the Eclipse editor window and select
-<img height="16" src="images/triple-trident.gif" width="13" /><b>Set Number of Processes</b>
-from the trident pull-down icon on the Eclipse toolbar.
-
-<br><br>
-
-<center>
-<img src="images/runNumProcs.png">
-</center>
-
-<br><br>
-
-<p>
-An input dialog will allow you to enter the desired number of processes, which will persist until you
-change the value again.
-</p>
-
-<br>
-<center>
-<img src="images/numProcsDialog.png">
-</center>
-<br><br>
-
-<h2>Analyzer or Browser View</h2>
-<p>
-If the Analyzer View is already visible, the number of processes can also be set from the down combo-box (see image below) in the
-Analyzer View's <a href="analyzerView.html#runtimeInfo">Runtime information group</a> for the next GEM run.
-</p>
-
-<br>
-<center>
-<img src="images/analyzerSetProcs.png">
-</center>
-<br><br>
-
-<p>
-If the Browser View is already visible, the number of processes can also be set from the down combo-box underneath the
-Browser View's help button (see image below) for the next GEM run.
-</p>
-
-<br/>
-<center>
-<img src="images/browserSetProcs.png">
-</center>
-
-<br><br>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<br><br>
-
-<hr/>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-
-</html>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/toc.html b/tools/gem/org.eclipse.ptp.gem.help/html/toc.html
deleted file mode 100644
index ced6cce..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/toc.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>PTP: Graphical Explorer of MPI Programs (GEM)</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>PTP: Graphical Explorer of MPI Programs (GEM)</h1>
-        </td>
-    </tr>
-    <tr>
-    	<td></td>
-    	<td>
-    		<h3>v1.3.0</h3>
-    	</td>
-    </tr>
-</table>
-
-<br>
-<p>
-Graphical Explorer of MPI Programs (GEM), part of the 
-<a href="PLUGINS_ROOT/org.eclipse.ptp.doc.user/html/toc.html">Parallel Tools Platform</a> (PTP),  
-is a graphical front end for In-situ Partial Order (ISP), a dynamic formal
-verification tool for MPI C/C++ programs, developed at the University of Utah. GEM
-greatly enhances the usability of ISP by providing an intuitive graphical way to track down
-bugs in MPI C/C++ programs, examine post-runtime results and to analyze MPI runtime
-behavior. 
-</p>
-
-<p>
-GEM can be used by anyone who can write simple MPI C/C++ programs, and requires no
-special training. GEM allows you to formally verify your MPI C/C++ programs automatically
-without any extra efforts on your part. No code instrumentation is necessary. Gem
-will definitively flag the following errors and warnings:
-</p>
-
-<ul>
-    <li>Deadlocks</li>
-    <li>Functionally Irrelevant Barriers</li>
-    <li>MPI Object Leaks</li>
-    <li>Local Assertion Violations</li>
-</ul>
-
-<p>
-In addition, GEM helps you understand as well as step through all relevant process interleavings
-(schedules). Notice our use of the word <i>relevant</i>: even a short MPI program may have too many
-(an &quot;exponential number&quot;) interleavings. For example, an MPI program with five processes, each
-containing five MPI calls, can have well in excess of 1000 interleavings. However, ISP generates
-a new interleaving only when it represents a truly new (as yet unexamined) behavior in your programs.
-</p> 
-
-<h2>Overview, Background, and Setup information</h2>
-
-<ol>
-    <li><a href="overview.html">GEM Overview</a></li>
-    <li><a href="prereqs.html">GEM Prerequisites</a></li>
-    <li><a href="gettingStarted.html">Getting Started</a></li>
-</ol>
-
-<h2>Help Topics</h2>
-
-<ol>
-	<li><a href="setNumProcs.html">Setting the Number of Processes</a></li>
-    <li><a href="analyzerView.html">Analyzer View</a></li>
-    <li><a href="browserView.html">Browser View</a></li>
-    <li><a href="consoleView.html">Console View</a></li>
-    <li><a href="output.html">Understanding Console Output</a></li>
-    <li><a href="happensBeforeViewer.html">Happens Before (HB) Viewer</a></li>    
-    <li><a href="makefileSupport.html">Makefile Project Support</a></li>
-    <li><a href="remoteProjects.html">Remote and Synchronized Projects</a></li>
-    <li><a href="preferences.html">Preferences</a></li>
-    <li><a href="troubleshooting.html">Troubleshooting</a></li>
-</ol>
-
-<p>Other related topics:</p>
-
-<ol>
-    <li><a href="http://www.eclipse.org/ptp/downloads.php">Latest Release of GEM</a></li>    
-    <li><a href="http://www.cs.utah.edu/formal_verification/ISP-release/">Latest Release of ISP</a></li>    
-    <li><a href="http://www.cs.utah.edu/formal_verification/">Gauss Group Home</a> - Includes all current work and publications</li>    
-    <li><a href="http://www.cs.utah.edu/">University of Utah School of Computing</a></li>    
-</ol>
-
-<p>&nbsp;</p>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<p>&nbsp;</p>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/html/troubleshooting.html b/tools/gem/org.eclipse.ptp.gem.help/html/troubleshooting.html
deleted file mode 100644
index 9c2767e..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/html/troubleshooting.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
-<head>
-    <link rel="stylesheet" type="text/css" href="help.css">
-    <title>Troubleshooting</title>
-</head>
-
-<body>
-<a name="top"></a>
-<table cellspacing="5">
-    <tr>
-        <td>
-            <img src="images/trident_transparent.png">
-        </td>
-        <td>
-            <h1>Troubleshooting</h1>
-        </td>
-    </tr>
-</table>
-
-<hr>
-<p>&nbsp;</p>
-
-<p>
-This section addresses the most common issues encountered when using GEM. If you encounter something
-that is not not mentioned here, please email your problem to <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a>. We
-will get back to you with a solution as soon as possible.
-</p>
-
-<p>&nbsp;</p>
-
-<table border="1" cellpadding="8">
-<tr>
-<th>Problem</th><th>Solution</th>
-</tr>
-<tr>
-    <td>
-        When I run Gem on a particular source file I get a dialog box appears stating that a valid
-        executable could not be created from the source file:<br/><br/><img src="images/invalidExecutable.png">
-    </td>
-    <td>
-        SOLUTION-1
-	    You have most likely run the GEM command <b>&#34;Formally Verify MPI Program&#34;</b> on
-	    a source file that does not contain a <b>main()</b> program entry point, or does not simply compile by itself.
-	    Remember, for anything larger than a simple single-file Managed Build Project you will need to create a Makefile
-	    Project and run GEM via the steps outlined in <a href="makefileSupport.html">GEM Makefile Support</a>.
-        <br/><br/>
-        SOLUTION-2
-        If you get STDERR in the GEM Console like the following:
-        <pre>
-            /usr/local/lib/libisp_prof.so: undefined reference to `MPI::Win::Free()'
-            /usr/local/lib/libisp_prof.so: undefined reference to `MPI::Datatype::Free()'
-            /usr/local/lib/libisp_prof.so: undefined reference to `MPI::Comm::Comm()'
-            /usr/local/lib/libisp_prof.so: undefined reference to `ompi_mpi_cxx_op_intercept'
-        </pre>
-        Then you are most likely using OpenMPI and <tt><b>libmpi_cxx</b></tt> is not being linked in by 
-        <tt><b>ispcc</b></tt>. Locate the script <tt><b>ispcc</b></tt> and add <tt><b>-lmpi_cxx</b></tt>
-        to the end of the single line in the script beginning with <tt><b>exec</b></tt> (see example below).
-        <pre>
-        exec "/usr/local/bin/mpicc" "-L/usr/local/lib" "-I/usr/local/include/isp" \
-        -Wl,-rpath=/usr/local/lib -include isp.h $* -lisp_prof -lmpi_cxx
-        </pre>
-    </td>
-</tr>
-<tr>
-    <td>
-        When I run Gem on a particular source file, GEM just hangs.
-    </td>
-    <td> 
-        You can terminate the current GEM operation by clicking the <img src="images/terminate.gif"> &#34;Terminate
-        Operation&#34; button in the GEM <a href="consoleView.html">Console View</a>.<br/><br/>
-        You also may have most run the GEM command <b>&#34;Formally Verify MPI Program&#34;</b> on
-        a source file that does not contain a <b>main()</b> program entry point, or does not simply compile by itself.
-        Remember, for anything larger than a simple single-file Managed Build Project you will need to create a Makefile
-        Project and run GEM via the steps outlined in <a href="makefileSupport.html">GEM Makefile Support</a>.
-    </td>
-</tr>
-<tr>
-    <td>
-	    When I try to formally verify my MPI C/C++ program, I get an error message saying that an error
-	    occurred while trying to run a particular command.<br/><br/><img src="images/unknownCommand.png">
-    </td> 
-    <td>
-	    This particular command either does not exist on the target machine or is not in your path. For anything 
-	    ISP related, e.g. <b>isp, ispcc, ispCC or ispcxx</b>, you may not have ISP installed. Please install ISP
-	    per documentation in the <a href="prereqs.html"> GEM Prerequisites Page</a> and also make sure the 
-	    ISP paths are correctly set on the <a href="preferences.html#ispPrefs">ISP Preference Page</a>
-	    
-    </td>
-</tr>
-<tr>
-    <td>
-	    I don’t see the GEM icon... there is no <img src="images/trident.gif"> trident icon anywhere, and the 
-	    GEM Views do not exist.
-    </td>
-    <td>
-	    The Eclipse Plug-­in was not installed properly.  Try installing it again from the update site for your
-	    installation of Eclipse or through <a href="http://eclipse.org/ptp/">http://eclipse.org/ptp</a>.
-    </td>
-</tr>
-<tr>
-    <td>I’m running Eclipse and when I try to running GEM, Eclipse becomes unresponsive.</td>
-    <td>Make sure your process manager is running. GEM assumes your process manager is already running</td>
-</tr>
-<tr>
-    <td>I’m trying to view a log file in the Eclipse editor, and I get editor message saying that the file is out of sync with the file system.</td>
-    <td>ISP has generates a new log file. Just hit F5 to refresh the Eclipse editor's view of the file.</td>
-</tr>
-<tr>
-    <td>I can't find the log file GEM generated in my CDT project.</td>
-    <td>Refresh your project. It should be in a directory named &quot;isp&quot; at the same level as the source file.</td>
-</tr>
-</table>
-
-<p>&nbsp;</p>
-<p><a href="#top">Back to Top</a> | <a href="toc.html">Back to Table of Contents</a></p>
-<p>&nbsp;</p>
-
-<hr>
-<center>
-<p>
-School of Computing * 50 S. Central Campus Dr. Rm. 3190 * Salt Lake City, UT 
-84112 * <A href="mailto:isp-dev@cs.utah.edu">isp-dev@cs.utah.edu</a><br>
-<a href="http://www.eclipse.org/org/documents/epl-v10.php">License</a>
-</p>
-</center>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/plugin.properties b/tools/gem/org.eclipse.ptp.gem.help/plugin.properties
deleted file mode 100644
index e33eb9d..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
- 
- pluginName=GEM User Guide
- pluginProvider=Eclipse PTP
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem.help/plugin.xml b/tools/gem/org.eclipse.ptp.gem.help/plugin.xml
deleted file mode 100644
index 39b381b..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/plugin.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-
-<plugin>
-
-   <extension
-         point="org.eclipse.help.toc">
-      <toc
-            file="toc.xml"
-            primary="true">
-      </toc>
-   </extension>
-
-</plugin>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/pom.xml b/tools/gem/org.eclipse.ptp.gem.help/pom.xml
deleted file mode 100644
index 7862abc..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.eclipse.ptp</groupId>
-    <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
-    <relativePath>../../../pom.xml</relativePath>
-  </parent>
-
-  <artifactId>org.eclipse.ptp.gem.help</artifactId>
-  <version>1.3.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/tools/gem/org.eclipse.ptp.gem.help/toc.xml b/tools/gem/org.eclipse.ptp.gem.help/toc.xml
deleted file mode 100644
index 5eb5f18..0000000
--- a/tools/gem/org.eclipse.ptp.gem.help/toc.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?NLS TYPE="org.eclipse.help.toc"?>
-
-<toc label="Graphical Explorer of MPI Programs (GEM)" link_to="../org.eclipse.ptp.doc.user/toc.xml#ptpGEM" topic="html/toc.html">
-	<topic label="Contents"  href="html/toc.html"/>
-    <topic label="GEM Overview"  href="html/overview.html"/>
-    <topic label="Prerequisites"  href="html/prereqs.html"/>
-    <topic label="Getting Started"  href="html/gettingStarted.html"/>
-    <topic label="Setting the Number of Processes"  href="html/setNumProcs.html"/> 
-    <topic label="Analyzer View" href="html/analyzerView.html" />
-    <topic label="Browser View" href="html/browserView.html" />
-    <topic label="Console View"  href="html/consoleView.html"/>    
-    <topic label="Understanding Console Output"  href="html/output.html"/>  
-    <topic label="Happens Before (HB) Viewer" href="html/happensBeforeViewer.html" />
-    <topic label="Makefile Project Support" href="html/makefileSupport.html" />
-    <topic label="Remote and Synchronized Projects"  href="html/remoteProjects.html"/>
-    <topic label="Preferences"  href="html/preferences.html"/>
-    <topic label="Troubleshooting GEM"  href="html/troubleshooting.html"/>
-</toc>
diff --git a/tools/gem/org.eclipse.ptp.gem/.classpath b/tools/gem/org.eclipse.ptp.gem/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/tools/gem/org.eclipse.ptp.gem/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/gem/org.eclipse.ptp.gem/.project b/tools/gem/org.eclipse.ptp.gem/.project
deleted file mode 100644
index 65b7a90..0000000
--- a/tools/gem/org.eclipse.ptp.gem/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.gem</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/tools/gem/org.eclipse.ptp.gem/.settings/org.eclipse.jdt.core.prefs b/tools/gem/org.eclipse.ptp.gem/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 96946f5..0000000
--- a/tools/gem/org.eclipse.ptp.gem/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,291 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=132
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=false
-org.eclipse.jdt.core.formatter.join_wrapped_lines=false
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=132
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=true
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/tools/gem/org.eclipse.ptp.gem/META-INF/MANIFEST.MF b/tools/gem/org.eclipse.ptp.gem/META-INF/MANIFEST.MF
deleted file mode 100644
index 043f8fa..0000000
--- a/tools/gem/org.eclipse.ptp.gem/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.gem;singleton:=true
-Bundle-Version: 1.3.0.qualifier
-Bundle-Activator: org.eclipse.ptp.internal.gem.GemPlugin
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.ui.console
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Bundle-Localization: plugin
-Import-Package: org.eclipse.cdt.core.model,
- org.eclipse.jface.text,
- org.eclipse.ptp.rdt.sync.core,
- org.eclipse.ptp.rdt.sync.core.resources,
- org.eclipse.remote.core,
- org.eclipse.remote.core.exception
-Export-Package: org.eclipse.ptp.internal.gem;x-internal:=true,
- org.eclipse.ptp.internal.gem.handlers;x-internal:=true,
- org.eclipse.ptp.internal.gem.messages;x-internal:=true,
- org.eclipse.ptp.internal.gem.popup.actions;x-internal:=true,
- org.eclipse.ptp.internal.gem.preferences;x-internal:=true,
- org.eclipse.ptp.internal.gem.util;x-internal:=true,
- org.eclipse.ptp.internal.gem.views;x-internal:=true
diff --git a/tools/gem/org.eclipse.ptp.gem/about.html b/tools/gem/org.eclipse.ptp.gem/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/tools/gem/org.eclipse.ptp.gem/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem/build.properties b/tools/gem/org.eclipse.ptp.gem/build.properties
deleted file mode 100644
index 2d8c6ae..0000000
--- a/tools/gem/org.eclipse.ptp.gem/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               about.html,\
-               plugin.properties
-
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/browse.gif b/tools/gem/org.eclipse.ptp.gem/icons/browse.gif
deleted file mode 100644
index 2344861..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/browse.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/clear-console.gif b/tools/gem/org.eclipse.ptp.gem/icons/clear-console.gif
deleted file mode 100644
index af30a42..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/clear-console.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/deadlock.gif b/tools/gem/org.eclipse.ptp.gem/icons/deadlock.gif
deleted file mode 100644
index 0556c29..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/deadlock.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/expand-tree.gif b/tools/gem/org.eclipse.ptp.gem/icons/expand-tree.gif
deleted file mode 100644
index 98d914a..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/expand-tree.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/first-item.gif b/tools/gem/org.eclipse.ptp.gem/icons/first-item.gif
deleted file mode 100644
index 328e97e..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/first-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/goto-error.gif b/tools/gem/org.eclipse.ptp.gem/icons/goto-error.gif
deleted file mode 100644
index 2a6dea3..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/goto-error.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/hbv-trident.gif b/tools/gem/org.eclipse.ptp.gem/icons/hbv-trident.gif
deleted file mode 100644
index 3fdbcfc..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/hbv-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/help-contents.gif b/tools/gem/org.eclipse.ptp.gem/icons/help-contents.gif
deleted file mode 100644
index 9d70301..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/help-contents.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/last-item.gif b/tools/gem/org.eclipse.ptp.gem/icons/last-item.gif
deleted file mode 100644
index c39cf62..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/last-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/magnified-trident.gif b/tools/gem/org.eclipse.ptp.gem/icons/magnified-trident.gif
deleted file mode 100644
index 849a0c0..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/magnified-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/match-call.gif b/tools/gem/org.eclipse.ptp.gem/icons/match-call.gif
deleted file mode 100644
index 059caec..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/match-call.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/next-item.gif b/tools/gem/org.eclipse.ptp.gem/icons/next-item.gif
deleted file mode 100644
index e2f8c3e..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/next-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/no-error.gif b/tools/gem/org.eclipse.ptp.gem/icons/no-error.gif
deleted file mode 100644
index a41e871..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/no-error.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/prev-item.gif b/tools/gem/org.eclipse.ptp.gem/icons/prev-item.gif
deleted file mode 100644
index 4c22b59..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/prev-item.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/processes.gif b/tools/gem/org.eclipse.ptp.gem/icons/processes.gif
deleted file mode 100644
index 828a539..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/processes.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/progress_stop.gif b/tools/gem/org.eclipse.ptp.gem/icons/progress_stop.gif
deleted file mode 100644
index dc47edf..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/progress_stop.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/save-file.gif b/tools/gem/org.eclipse.ptp.gem/icons/save-file.gif
deleted file mode 100644
index 499dd0c..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/save-file.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/source-call.gif b/tools/gem/org.eclipse.ptp.gem/icons/source-call.gif
deleted file mode 100644
index 695e5a5..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/source-call.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/trident.gif b/tools/gem/org.eclipse.ptp.gem/icons/trident.gif
deleted file mode 100644
index e5feb64..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/icons/triple-trident.gif b/tools/gem/org.eclipse.ptp.gem/icons/triple-trident.gif
deleted file mode 100644
index c7e244d..0000000
--- a/tools/gem/org.eclipse.ptp.gem/icons/triple-trident.gif
+++ /dev/null
Binary files differ
diff --git a/tools/gem/org.eclipse.ptp.gem/plugin.properties b/tools/gem/org.eclipse.ptp.gem/plugin.properties
deleted file mode 100644
index c276472..0000000
--- a/tools/gem/org.eclipse.ptp.gem/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
- 
- pluginName=GEM - Dynamic Formal Verification for MPI C/C++ Programs
- pluginProvider=Eclipse PTP
- menulabel=PTP GEM - Graphical Explorer of MPI Programs
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem/plugin.xml b/tools/gem/org.eclipse.ptp.gem/plugin.xml
deleted file mode 100644
index 6aef41f..0000000
--- a/tools/gem/org.eclipse.ptp.gem/plugin.xml
+++ /dev/null
@@ -1,300 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-
-<plugin>
-
-   <!-- Managed Build Verification Menu Group --> 
-   <extension 
-        point="org.eclipse.ui.popupMenus">
-        
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.c") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.verificationPopUpMenuC"
-            nameFilter="*.c"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="verificationMenu">
-            <separator name="verificationGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.verificationPopupC"
-               label="Formally Verify MPI Program"
-               menubarPath="verificationMenu/verificationGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.cpp") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.verificationPopUpMenuCpp"
-            nameFilter="*.cpp"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="verificationMenu">
-            <separator name="verificationGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.verificationPopupCpp"
-               label="Formally Verify MPI Program"
-               menubarPath="verificationMenu/verificationGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.c++") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.verificationPopUpMenuC++"
-            nameFilter="*.c++"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="verificationMenu">
-            <separator name="verificationGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.verificationPopupC++"
-               label="Formally Verify MPI Program"
-               menubarPath="verificationMenu/verificationGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.cp") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.verificationPopUpMenuCp"
-            nameFilter="*.cp"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="verificationMenu">
-            <separator name="verificationGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.verificationPopupCp"
-               label="Formally Verify MPI Program"
-               menubarPath="verificationMenu/verificationGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.cc") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.verificationPopUpMenuCc"
-            nameFilter="*.cc"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="verificationMenu">
-            <separator name="verificationGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.verificationPopupCc"
-               label="Formally Verify MPI Program"
-               menubarPath="verificationMenu/verificationGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- Logfile Menu Group -->
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.log") -->      
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.logFilePopupMenu"
-            nameFilter="*.log"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="logFileMenu">
-            <separator name="logFileGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.HbvLogFilePopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.hbvLogPopup"
-               label="Launch Happens Before Viewer"
-               menubarPath="logFileMenu/logFileGroup"
-               icon="icons/hbv-trident.gif">
-         </action>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.ProcessLogFilePopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.LogFilePopUpAction"
-               label="Process GEM Log File"
-               menubarPath="logFileMenu/logFileGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-      
-      <!-- Makefile Verification Menu Group -->
-      <!-- PopUpMenus extension point and contributions (nameFilter="*.gem") -->
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.ptp.gem.makefilePopupMenu"
-            nameFilter="*.gem"
-            objectClass="org.eclipse.core.resources.IFile">
-         <menu
-               label="GEM"
-               path="additions"
-               id="executableMenu">
-            <separator name="executableGroup"/>
-         </menu>
-         <action
-               class="org.eclipse.ptp.internal.gem.popup.actions.VerificationPopUpAction"
-               enablesFor="1"
-               id="org.eclipse.ptp.gem.executablePopup"
-               label="Formally Verify Profiled MPI Executable"
-               menubarPath="executableMenu/executableGroup"
-               icon="icons/trident.gif">
-         </action>
-      </objectContribution>
-   </extension>   
-
-   
-   <!-- Preferences extension point and Initializer -->
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="org.eclipse.ptp.ui.preferences.ptpPreferencesPage"
-            class="org.eclipse.ptp.internal.gem.preferences.GemPreferencePage"
-            id="org.eclipse.ptp.gem.preferences.GemPreferences"
-            name="GEM">
-      </page>
-      <page
-            category="org.eclipse.ptp.gem.preferences.GemPreferences"
-            class="org.eclipse.ptp.internal.gem.preferences.IspPreferencePage"
-            id="org.eclipse.ptp.gem.preferences.IspPreferences"
-            name="ISP Settings">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ptp.internal.gem.preferences.PreferenceInitializer">
-      </initializer>
-   </extension>
-    
-    
-   <!-- Commands extension point and contributions (for toolbar buttons) -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            id="org.eclipse.ptp.gem.commands.category"
-            name="GEM Commands Category">
-      </category>
-      <command
-            categoryId="org.eclipse.ptp.gem.commands.category"
-            id="org.eclipse.ptp.gem.commands.numprocsCommand"
-            name="Set Number of Processes">
-      </command>
-      <command
-            categoryId="org.eclipse.ptp.gem.commands.category"
-            id="org.eclipse.ptp.gem.commands.gemCommand"
-            name="Formally Verify MPI Program">
-      </command>
-   </extension>
-   
-       
-   <!-- Handlers extension point -->
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ptp.internal.gem.handlers.GemHandler"
-            commandId="org.eclipse.ptp.gem.commands.numprocsCommand">
-      </handler>
-      <handler
-            class="org.eclipse.ptp.internal.gem.handlers.GemHandler"
-            commandId="org.eclipse.ptp.gem.commands.gemCommand">
-      </handler>
-   </extension>
-   
-
-   <!-- Menus extension point and contributions (toolbar buttons) -->
-   <extension
-   		point="org.eclipse.ui.menus">
-      <menuContribution
-      		locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar id="org.eclipse.ptp.gem.toolbar"
-                  label="%menulabel">
-             <command
-                  commandId="org.eclipse.ptp.gem.commands.gemCommand"
-                  icon="icons/trident.gif"
-                  id="org.eclipse.ptp.gem.toolbar.refCommand"
-                  style="pulldown"
-                  tooltip="Formally Verify MPI Program">
-                <visibleWhen
-                	checkEnabled="false">
-                     <with
-                           variable="activeWorkbenchWindow.activePerspective">
-                        <equals
-                              value="org.eclipse.cdt.ui.CPerspective">
-                        </equals>
-                     </with>
-                </visibleWhen>
-             </command>
-         </toolbar>
-      </menuContribution>
-      <menuContribution locationURI="menu:org.eclipse.ptp.gem.toolbar.refCommand?after=additions">
-            <command
-                  commandId="org.eclipse.ptp.gem.commands.numprocsCommand"
-                  icon="icons/triple-trident.gif"
-                  id="org.eclipse.ptp.gem.toolbar.menu.numprocsCommand">
-            </command>
-            <command
-                  commandId="org.eclipse.ptp.gem.commands.gemCommand"
-                  icon="icons/trident.gif"
-                  id="org.eclipse.ptp.gem.toolbar.menu.gemCommand">
-            </command>
-      </menuContribution>
-    </extension>
-    
-    
-   <!-- Views extension point -->
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="GEM Console"
-            icon="icons/magnified-trident.gif"
-            category="org.eclipse.ptp.ui.views"
-            class="org.eclipse.ptp.internal.gem.views.GemConsole"
-            id="org.eclipse.ptp.gem.views.GemConsole">
-      </view>
-      <view
-            name="GEM Analyzer"
-            icon="icons/trident.gif"
-            category="org.eclipse.ptp.ui.views"
-            class="org.eclipse.ptp.internal.gem.views.GemAnalyzer"
-            id="org.eclipse.ptp.gem.views.GemAnalyzer">
-      </view>
-      <view
-            name="GEM Browser"
-            icon="icons/trident.gif"
-            category="org.eclipse.ptp.ui.views"
-            class="org.eclipse.ptp.internal.gem.views.GemBrowser"
-            id="org.eclipse.ptp.gem.views.GemBrowser">
-      </view>
-   </extension>
-   
- </plugin>
diff --git a/tools/gem/org.eclipse.ptp.gem/pom.xml b/tools/gem/org.eclipse.ptp.gem/pom.xml
deleted file mode 100644
index 1d385c7..0000000
--- a/tools/gem/org.eclipse.ptp.gem/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.eclipse.ptp</groupId>
-    <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
-    <relativePath>../../../pom.xml</relativePath>
-  </parent>
-
-  <artifactId>org.eclipse.ptp.gem</artifactId>
-  <version>1.3.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/GemPlugin.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/GemPlugin.java
deleted file mode 100644
index a4e6e6d..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/GemPlugin.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.ConfigurationScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.Version;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-
-/**
- * The activator class for this plug-in. This controls the plug-in life cycle.
- */
-public class GemPlugin extends AbstractUIPlugin {
-
-	// The shared instance
-	private static GemPlugin plugin;
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.gem"; //$NON-NLS-1$
-
-	// The configuration preferences
-	private IEclipsePreferences gemPreferences;
-
-	// The image cache for this plug-in
-	private static Map<ImageDescriptor, Image> imageCache = new HashMap<ImageDescriptor, Image>();
-
-	/**
-	 * Returns the shared instance.
-	 * 
-	 * @param none
-	 * @return GemPlugin The shared plug-in instance.
-	 */
-	public static GemPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Gets the requested Image resource.
-	 * 
-	 * @param imageDescriptor
-	 *            The ImagesDescriptor mapped to its Image object.
-	 * @return Image The requested Image.
-	 */
-	public static Image getImage(ImageDescriptor imageDescriptor) {
-		if (imageDescriptor == null) {
-			return null;
-		}
-		Image image = imageCache.get(imageDescriptor);
-		if (image == null) {
-			image = imageDescriptor.createImage();
-			imageCache.put(imageDescriptor, image);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            The path to the shared resource.
-	 * @return ImageDescriptor The image descriptor.
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-
-	/**
-	 * Constructor.
-	 */
-	public GemPlugin() {
-		super();
-	}
-
-	/**
-	 * Answer the configuration location for this plug-in.
-	 * 
-	 * @param none
-	 * @return URI The GEM plugin's configuration directory (not <code>null</code>)
-	 */
-	public URI getConfigDir() {
-		final Location location = Platform.getConfigurationLocation();
-		if (location != null) {
-			final URL configURL = location.getURL();
-			if (configURL != null && configURL.getProtocol().startsWith("file")) { //$NON-NLS-1$
-				try {
-					return configURL.toURI();
-				} catch (final URISyntaxException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Answer the configuration preferences shared among multiple workspaces.
-	 * 
-	 * @param none
-	 * @return Preferences The configuration preferences or <code>null</code> if
-	 *         the configuration directory is read-only or unspecified.
-	 */
-	public Preferences getConfigPrefs() {
-		if (this.gemPreferences == null) {
-			this.gemPreferences = (IEclipsePreferences) ConfigurationScope.INSTANCE;
-		}
-		return this.gemPreferences;
-	}
-
-	/**
-	 * Return the plug-in's version.
-	 * 
-	 * @param none
-	 * @return Version The current version of this plug-in.
-	 */
-	public Version getVersion() {
-		return new Version(getBundle().getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION));
-	}
-
-	/**
-	 * Save the configuration preferences if they have been loaded.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void saveConfigPrefs() {
-		if (this.gemPreferences != null) {
-			try {
-				this.gemPreferences.flush();
-			} catch (final BackingStoreException e) {
-				GemUtilities.logExceptionDetail(e);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		saveConfigPrefs();
-		super.start(context);
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-
-		// Clear the image cache
-		Iterator<Image> iter = imageCache.values().iterator();
-		while (iter.hasNext()) {
-			iter.next().dispose();
-		}
-
-		imageCache.clear();
-		iter = null;
-		imageCache = null;
-	}
-
-	/**
-	 * Return the OSGi service with the given service interface.
-	 *
-	 * @param service
-	 *            service interface
-	 * @return the specified service or null if it's not registered
-	 */
-	public static <T> T getService(Class<T> service) {
-		final BundleContext context = plugin.getBundle().getBundleContext();
-		final ServiceReference<T> ref = context.getServiceReference(service);
-		return ref != null ? context.getService(ref) : null;
-	}
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/handlers/GemHandler.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/handlers/GemHandler.java
deleted file mode 100644
index 09b3964..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/handlers/GemHandler.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.handlers;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ptp.internal.gem.views.GemAnalyzer;
-import org.eclipse.ptp.internal.gem.views.GemBrowser;
-import org.eclipse.ptp.internal.gem.views.GemConsole;
-import org.eclipse.ptp.rdt.sync.core.resources.RemoteSyncNature;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Handler for associated GEM commands declared in plugin.xml.
- * 
- * Extends AbstractHandler, an IHandler base class.
- * 
- * @see org.eclipse.core.commands.IHandler
- * @see org.eclipse.core.commands.AbstractHandler
- */
-public class GemHandler extends AbstractHandler {
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param none
-	 */
-	public GemHandler() {
-		super();
-	}
-
-	/**
-	 * The command has been executed, so extract the needed information from the
-	 * application context.
-	 * 
-	 * @param event
-	 *            The Event to process
-	 * @return Object <code>null</code>
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		// Process the command associated with the event
-		final IWorkbench wb = PlatformUI.getWorkbench();
-		final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-		final IWorkbenchPage page = window.getActivePage();
-		final Command cmd = event.getCommand();
-		final String cmdString = cmd.getId();
-
-		// If we are just changing number of processes, do so and break early
-		if (cmdString.equals("org.eclipse.ptp.gem.commands.numprocsCommand")) { //$NON-NLS-1$
-			GemUtilities.setNumProcesses();
-			return null;
-		}
-
-		// Otherwise do analysis, filter extension and do the work
-		final IEditorPart editor = page.getActiveEditor();
-		IFile inputFile = null;
-		boolean isSourceFileExtension = false;
-
-		if (editor == null) {
-			// do nothing here as there really is nothing to do
-			return null;
-		}
-
-		final IFileEditorInput editorInput = (IFileEditorInput) editor.getEditorInput();
-		inputFile = editorInput.getFile();
-
-		try {
-			if (inputFile.getProject().hasNature(RemoteSyncNature.NATURE_ID)) {
-				return null;
-			}
-		} catch (final CoreException ce) {
-			GemUtilities.logExceptionDetail(ce);
-		}
-
-		final String extension = inputFile.getFileExtension();
-		if (extension != null) {
-			// The most common C & C++ source file extensions
-			isSourceFileExtension = extension.equals("c") //$NON-NLS-1$
-					|| extension.equals("cpp") || extension.equals("c++") //$NON-NLS-1$ //$NON-NLS-2$
-					|| extension.equals("cc") || extension.equals("cp"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (isSourceFileExtension) {
-			// Save most recent file reference to hidden preference as a URI
-			GemUtilities.saveMostRecentURI(inputFile.getLocationURI());
-
-			// ask for command line arguments
-			GemUtilities.setCommandLineArgs();
-
-			// Activate all inactive views and open up to the console
-			try {
-				final IViewReference[] activeViews = page.getViewReferences();
-				boolean foundBrowser = false;
-				boolean foundAnalyzer = false;
-				for (final IViewReference ref : activeViews) {
-					if (ref.getId().equals(GemBrowser.ID)) {
-						foundBrowser = true;
-					}
-					if (ref.getId().equals(GemAnalyzer.ID)) {
-						foundAnalyzer = true;
-					}
-				}
-				// open the Browser view if it's not already
-				if (!foundBrowser) {
-					page.showView(GemBrowser.ID);
-				}
-				// open the Analyzer view if it's not already
-				if (!foundAnalyzer) {
-					page.showView(GemAnalyzer.ID);
-				}
-				page.showView(GemConsole.ID);
-				GemUtilities.initGemViews(inputFile, true, true);
-			} catch (final PartInitException e) {
-				GemUtilities.logExceptionDetail(e);
-			}
-
-		} else {
-			GemUtilities.showErrorDialog(Messages.GemHandler_1);
-		}
-		return null;
-	}
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/Messages.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/Messages.java
deleted file mode 100644
index 45e4d3e..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/Messages.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package org.eclipse.ptp.internal.gem.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.internal.gem.messages.messages"; //$NON-NLS-1$
-
-	public static String Envelope_0;
-	public static String GemAnalyzer_0;
-	public static String GemAnalyzer_1;
-	public static String GemAnalyzer_10;
-	public static String GemAnalyzer_11;
-	public static String GemAnalyzer_12;
-	public static String GemAnalyzer_13;
-	public static String GemAnalyzer_14;
-	public static String GemAnalyzer_15;
-	public static String GemAnalyzer_16;
-	public static String GemAnalyzer_17;
-	public static String GemAnalyzer_18;
-	public static String GemAnalyzer_19;
-	public static String GemAnalyzer_2;
-	public static String GemAnalyzer_20;
-	public static String GemAnalyzer_21;
-	public static String GemAnalyzer_22;
-	public static String GemAnalyzer_23;
-	public static String GemAnalyzer_24;
-	public static String GemAnalyzer_25;
-	public static String GemAnalyzer_26;
-	public static String GemAnalyzer_27;
-	public static String GemAnalyzer_28;
-	public static String GemAnalyzer_29;
-	public static String GemAnalyzer_3;
-	public static String GemAnalyzer_30;
-
-	public static String GemAnalyzer_31;
-	public static String GemAnalyzer_32;
-	public static String GemAnalyzer_33;
-	public static String GemAnalyzer_34;
-	public static String GemAnalyzer_35;
-	public static String GemAnalyzer_36;
-	public static String GemAnalyzer_37;
-	public static String GemAnalyzer_39;
-	public static String GemAnalyzer_4;
-	public static String GemAnalyzer_40;
-	public static String GemAnalyzer_41;
-	public static String GemAnalyzer_46;
-	public static String GemAnalyzer_47;
-	public static String GemAnalyzer_48;
-	public static String GemAnalyzer_49;
-	public static String GemAnalyzer_5;
-	public static String GemAnalyzer_50;
-	public static String GemAnalyzer_51;
-	public static String GemAnalyzer_53;
-	public static String GemAnalyzer_55;
-	public static String GemAnalyzer_56;
-	public static String GemAnalyzer_57;
-	public static String GemAnalyzer_58;
-	public static String GemAnalyzer_6;
-	public static String GemAnalyzer_60;
-	public static String GemAnalyzer_61;
-	public static String GemAnalyzer_68;
-	public static String GemAnalyzer_69;
-	public static String GemAnalyzer_7;
-	public static String GemAnalyzer_70;
-	public static String GemAnalyzer_73;
-	public static String GemAnalyzer_74;
-	public static String GemAnalyzer_76;
-	public static String GemAnalyzer_78;
-	public static String GemAnalyzer_79;
-	public static String GemAnalyzer_8;
-	public static String GemAnalyzer_83;
-	public static String GemAnalyzer_84;
-	public static String GemAnalyzer_85;
-	public static String GemAnalyzer_89;
-	public static String GemAnalyzer_9;
-	public static String GemAnalyzer_91;
-	public static String GemAnalyzer_92;
-	public static String GemAnalyzer_93;
-	public static String GemAnalyzer_94;
-	public static String GemAnalyzer_95;
-	public static String GemAnalyzer_96;
-	public static String GemBrowser_0;
-	public static String GemBrowser_1;
-	public static String GemBrowser_11;
-	public static String GemBrowser_12;
-	public static String GemBrowser_14;
-	public static String GemBrowser_15;
-	public static String GemBrowser_16;
-	public static String GemBrowser_17;
-	public static String GemBrowser_18;
-	public static String GemBrowser_19;
-	public static String GemBrowser_2;
-	public static String GemBrowser_20;
-	public static String GemBrowser_22;
-	public static String GemBrowser_23;
-	public static String GemBrowser_24;
-	public static String GemBrowser_25;
-	public static String GemBrowser_26;
-	public static String GemBrowser_27;
-	public static String GemBrowser_29;
-	public static String GemBrowser_3;
-	public static String GemBrowser_30;
-	public static String GemBrowser_31;
-	public static String GemBrowser_32;
-	public static String GemBrowser_33;
-	public static String GemBrowser_39;
-	public static String GemBrowser_4;
-	public static String GemBrowser_40;
-	public static String GemBrowser_41;
-	public static String GemBrowser_42;
-	public static String GemBrowser_43;
-	public static String GemBrowser_5;
-	public static String GemBrowser_6;
-	public static String GemBrowser_7;
-	public static String GemBrowser_8;
-	public static String GemConsole_3;
-	public static String GemConsole_4;
-	public static String GemConsole_5;
-	public static String GemConsole_6;
-	public static String GemConsole_7;
-	public static String GemConsole_8;
-	public static String GemConsole_9;
-	public static String GemConsole_10;
-	public static String GemConsole_11;
-	public static String GemHandler_1;
-	public static String GemPreferencePage_0;
-	public static String GemPreferencePage_1;
-	public static String GemPreferencePage_3;
-	public static String GemPreferencePage_4;
-	public static String GemPreferencePage_5;
-	public static String GemPreferencePage_7;
-	public static String GemPreferencePage_8;
-	public static String GemPreferencePage_9;
-	public static String GemPreferencePage_10;
-
-	public static String GemUtilities_1;
-	public static String GemUtilities_10;
-	public static String GemUtilities_11;
-	public static String GemUtilities_12;
-	public static String GemUtilities_13;
-	public static String GemUtilities_14;
-
-	public static String GemUtilities_2;
-	public static String GemUtilities_28;
-	public static String GemUtilities_3;
-	public static String GemUtilities_4;
-	public static String GemUtilities_5;
-	public static String GemUtilities_6;
-	public static String GemUtilities_7;
-	public static String GemUtilities_8;
-	public static String GemUtilities_9;
-	public static String HbvLogFilePopUpAction_0;
-	public static String HbvLogFilePopUpAction_1;
-	public static String HbvLogFilePopUpAction_2;
-	public static String IspPreferencePage_0;
-	public static String IspPreferencePage_1;
-	public static String IspPreferencePage_10;
-	public static String IspPreferencePage_11;
-	public static String IspPreferencePage_12;
-	public static String IspPreferencePage_13;
-	public static String IspPreferencePage_14;
-	public static String IspPreferencePage_15;
-	public static String IspPreferencePage_16;
-	public static String IspPreferencePage_17;
-	public static String IspPreferencePage_18;
-	public static String IspPreferencePage_19;
-	public static String IspPreferencePage_2;
-	public static String IspPreferencePage_20;
-	public static String IspPreferencePage_21;
-	public static String IspPreferencePage_3;
-	public static String IspPreferencePage_4;
-	public static String IspPreferencePage_5;
-	public static String IspPreferencePage_6;
-	public static String IspPreferencePage_7;
-	public static String IspPreferencePage_8;
-	public static String IspPreferencePage_9;
-	public static String NumProcsValidator_0;
-	public static String NumProcsValidator_1;
-	public static String NumProcsValidator_2;
-	public static String ProcessLogFilePopUpAction_0;
-	public static String ProcessLogFilePopUpAction_1;
-	public static String VerificationPopUpAction_0;
-
-	public static String VerificationPopUpAction_1;
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		super();
-	}
-
-}
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/messages.properties b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/messages.properties
deleted file mode 100644
index 686eb4a..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/messages/messages.properties
+++ /dev/null
@@ -1,173 +0,0 @@
-Envelope_0=Value was null parsing Envelope communicator
-GemAnalyzer_0=Code Windows
-GemAnalyzer_1=Originating Call
-GemAnalyzer_10=Last Interleaving
-GemAnalyzer_11=Deadlock Interleaving(s)
-GemAnalyzer_12=Runtime Report
-GemAnalyzer_13=Log file does not exist. Please refresh (F5) or\ngenerate a new log file by running GEM again.
-GemAnalyzer_14=Browse Calls by Interleaving and Rank
-GemAnalyzer_15=HB Viewer
-GemAnalyzer_16=Launch Happens Before Viewer
-GemAnalyzer_17=Run GEM on last input file
-GemAnalyzer_18=Set the Number of Processes for the Next Run
-GemAnalyzer_19=No first interleaving.
-GemAnalyzer_2=Matching Calls
-GemAnalyzer_20=No previous interleaving
-GemAnalyzer_21=No next interleaving
-GemAnalyzer_22=Ranks: 
-GemAnalyzer_23=GEM does not currently support the Happens Before Viewer\nwith remote or synchronized projects.
-GemAnalyzer_24=Please run GEM prior to opening the Call Browser
-GemAnalyzer_25=Step Order for MPI Calls
-GemAnalyzer_26=Set the order the MPI calls are stepped in
-GemAnalyzer_27=Internal Issue
-GemAnalyzer_28=This is the order the calls were issued to the MPI runtime
-GemAnalyzer_29=Program
-GemAnalyzer_3=line:
-GemAnalyzer_30=This is the order the calls appear in the source code file
-GemAnalyzer_31=No errors or warnings found
-GemAnalyzer_32=Transitions
-GemAnalyzer_33=These buttons control which MPI call is currently being viewed
-GemAnalyzer_34=First Transition
-GemAnalyzer_35=Previous Transition
-GemAnalyzer_36=Next Transition
-GemAnalyzer_37=Last Transition
-GemAnalyzer_39=View calls for a specific rank (process)
-GemAnalyzer_4=by rank:
-GemAnalyzer_40=\ line: 
-GemAnalyzer_41=\ by rank: 
-GemAnalyzer_46=Call does not complete due to a deadlock
-GemAnalyzer_47=Call does not complete successfully
-GemAnalyzer_48=Terminate Current GEM Operation
-GemAnalyzer_49=Get GEM Analyzer Help
-GemAnalyzer_5=Interleavings
-GemAnalyzer_50=Terminate Current GEM Operation
-GemAnalyzer_51=Get GEM Analyzer Help
-GemAnalyzer_53=Rank: 
-GemAnalyzer_55=Ranks: 
-GemAnalyzer_56=Call Performed 
-GemAnalyzer_57=\ Times By All 
-GemAnalyzer_58=Ranks
-GemAnalyzer_6=An interleaving is a possible ordering of MPI calls issued
-GemAnalyzer_60=File: 
-GemAnalyzer_61=\ Line: 
-GemAnalyzer_68=MPI Call Browser
-GemAnalyzer_69=Number of Processes: 
-GemAnalyzer_7=First Interleaving
-GemAnalyzer_70=Interleaving: 
-GemAnalyzer_73=Get GEM Analyzer Help
-GemAnalyzer_74=Terminate Current GEM Operation
-GemAnalyzer_76=Failed to open file
-GemAnalyzer_78=Failed to open file
-GemAnalyzer_79=Browse MPI Calls
-GemAnalyzer_8=Previous Interleaving
-GemAnalyzer_83=No Ranks Locked
-GemAnalyzer_84=Rank 
-GemAnalyzer_85=\ Locked
-GemAnalyzer_89=Deadlock in interleaving
-GemAnalyzer_9=Next Interleaving
-GemAnalyzer_91=Assertion violation in 
-GemAnalyzer_92=Error Found
-GemAnalyzer_93=No errors found. Check Browser for warnings.
-GemAnalyzer_94=No first transition
-GemAnalyzer_95=No previous transition
-GemAnalyzer_96=No Next Transition
-GemBrowser_0=Could not locate source file: 
-GemBrowser_1=Error parsing ASSERTION_VIOLATIONS lines in log file. Browser operation aborted.
-GemBrowser_11=Assertion Violations
-GemBrowser_12=Browse Assertion Violations
-GemBrowser_14=No Assertion Violations Found
-GemBrowser_15=error and
-GemBrowser_16=errors and
-GemBrowser_17=warning was found
-GemBrowser_18=warnings were found
-GemBrowser_19=Deadlocks
-GemBrowser_2=Error parsing DEADLOCK lines in log file. Browser operation aborted.
-GemBrowser_20=Browse Deadlocks
-GemBrowser_22=No Deadlocks Found
-GemBrowser_23=Irrelevant Barriers
-GemBrowser_24=Browse Irrelevant Barriers
-GemBrowser_25=FIB preference is disabled
-GemBrowser_26=A deadlock interrupted the detection of Irrelevant Barriers
-GemBrowser_27=No Irrelevant Barriers Found
-GemBrowser_29=Terminate Current GEM Operation
-GemBrowser_3=Error parsing IRRELEVANT_BARRIER lines in log file. Browser operations aborted.
-GemBrowser_30=Save Results to Local File
-GemBrowser_31=Leaks
-GemBrowser_32=Browse Resource Leaks
-GemBrowser_33=No Resource Leaks Found
-GemBrowser_39=Get GEM Browser Help
-GemBrowser_4=Error parsing RESOURCE_LEAKS lines in log file. Browser operation aborted.
-GemBrowser_40=Terminate Current GEM Operation
-GemBrowser_41=Replace existing file?
-GemBrowser_42=Unable to create file
-GemBrowser_43=Save Results to Local File
-GemBrowser_5=Error parsing TYPE_MISMATCH lines in log file. Browser operation aborted.
-GemBrowser_6=An error occurred while trying to save the file
-GemBrowser_7=Run GEM
-GemBrowser_8=Set the Number of Processes for the Next Run
-GemConsole_3=Clear Console
-GemConsole_4=Save Output to Local File
-GemConsole_5=Get GEM Console Help
-GemConsole_6=Clear Console
-GemConsole_7=Replace existing file?
-GemConsole_8=Unable to create file
-GemConsole_9=Save Output to Local File
-GemConsole_10=Get GEM Console Help
-GemConsole_11=Terminated at the request of the user
-GemHandler_1=Please select a valid file in the editor.
-GemPreferencePage_0=GEM Preferences
-GemPreferencePage_1=Number of Processes:
-GemPreferencePage_10=Request Command Line Arguments
-GemPreferencePage_3=Clear GEM Console on Each Run
-GemPreferencePage_4=Get Help with GEM Preferences
-GemPreferencePage_5=Active View:
-GemPreferencePage_7=Analyzer
-GemPreferencePage_8=Browser
-GemPreferencePage_9=Console
-GemUtilities_1=Problems occurred when invoking code from plug-in: 
-GemUtilities_10=Set Number of Processes
-GemUtilities_11=Error
-GemUtilities_12=Information
-GemUtilities_13=\nPlease make sure ISP is installed correctly on the target machine,\nand that all GEM preferences and paths are properly configured.\n\nIf you are working with a remote project,\nmake sure the remote environment has been started.
-GemUtilities_14=Log file was not created or does not exist.
-GemUtilities_2=No log file exists, generating one now.
-GemUtilities_28=Please provide any command line arguments:
-GemUtilities_3=Failed to make a valid executable from the source file.\nPlease verify that the file can successfully compile.
-GemUtilities_4=Log file is empty or not properly formatted.\nTry running GEM again with the correct number of processes.
-GemUtilities_5=Log file does not contain any MPI calls. Terminating current operation.\nCheck that you are running with the correct number of processes.
-GemUtilities_6=An analysis is currently in progress.\nPlease wait until it completes or manually abort it before starting a new one
-GemUtilities_7=Supported version of ISP not found.\nPlease install version 0.3.0 or later.\nhttp://www.cs.utah.edu/formal_verification/ISP-release/
-GemUtilities_8=An error has occurred while trying to run the command: 
-GemUtilities_9=Set Number of Processes
-HbvLogFilePopUpAction_0=Please select a valid log file.
-HbvLogFilePopUpAction_1=Log file does not exist. Please refresh (F5) or\ngenerate a new log file by running GEM again.
-HbvLogFilePopUpAction_2=GEM does not currently support the Happens Before Viewer\nwith remote or synchronized projects.
-IspPreferencePage_0=Command Line Options
-IspPreferencePage_1=Enable FIB
-IspPreferencePage_10=Report Progress Every [n] MPI Calls:
-IspPreferencePage_11=Local ISP Paths
-IspPreferencePage_12=isp executable:
-IspPreferencePage_13=ispcc script:
-IspPreferencePage_14=ispCC script:
-IspPreferencePage_15=HB Viewer script:
-IspPreferencePage_16=Get Help with ISP Preferences
-IspPreferencePage_17=Host Where ISP Resides
-IspPreferencePage_18=Remote ISP Paths
-IspPreferencePage_19=remote isp executable:
-IspPreferencePage_2=Log Total MPI Calls
-IspPreferencePage_20=remote ispcc script:
-IspPreferencePage_21=remote ispCC script
-IspPreferencePage_3=Enable OpenMP
-IspPreferencePage_4=Use Blocking sends
-IspPreferencePage_5=Report Progress
-IspPreferencePage_6=Use Unix Sockets
-IspPreferencePage_7=Verbose Mode
-IspPreferencePage_8=Miscellaneous Options
-IspPreferencePage_9=Port:
-NumProcsValidator_0=Must be a numeric value > 0
-NumProcsValidator_1=Must be > 0
-NumProcsValidator_2=Must be in the range [0,32]
-ProcessLogFilePopUpAction_0=Please select a valid file.
-ProcessLogFilePopUpAction_1=Log file does not exist.\nPlease refresh (F5) and run GEM again.
-VerificationPopUpAction_0=Please select a valid file.
-VerificationPopUpAction_1=The selected resource was invalid.
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/HbvLogFilePopUpAction.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/HbvLogFilePopUpAction.java
deleted file mode 100644
index 41da6a0..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/HbvLogFilePopUpAction.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.popup.actions;
-
-//import java.io.File;
-
-//import org.eclipse.core.filesystem.EFS;
-//import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Object action implementation for associated GEM actions declared in
- * plugin.xml.
- * 
- * Implements IObjectActionDelegate, which extends ActionDelegate, an
- * IActionDelegate base class.
- * 
- * @see org.eclipse.ui.IObjectActionDelegate
- */
-public class HbvLogFilePopUpAction implements IObjectActionDelegate {
-
-	private IStructuredSelection selection;
-
-	/**
-	 * Constructor.
-	 */
-	public HbvLogFilePopUpAction() {
-		super();
-	}
-
-	/**
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		if (this.selection == null) {
-			return;
-		}
-
-		// Make sure the file selection is valid
-		if (this.selection.toString().equals("<empty selection>")) { //$NON-NLS-1$
-			GemUtilities.showErrorDialog(Messages.HbvLogFilePopUpAction_0);
-		} else {
-			final IFile logFile = (IFile) this.selection.getFirstElement();
-			final String projectName = logFile.getProject().getName();
-			final IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-			String hbv = GemPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.GEM_PREF_HBV_PATH);
-
-			/*
-			 * Currently, GEM does not support the Happens Before Viewer with
-			 * remote projects.
-			 * 
-			 * Check if the project is local or remote and abort if it is.
-			 */
-			if (logFile.getLocation() == null || GemUtilities.isSynchronizedProject(logFile)) {
-				GemUtilities.showInformationDialog(Messages.HbvLogFilePopUpAction_2);
-				return;
-			}
-
-			// Sync the project resources with the underlying file system
-			GemUtilities.refreshProject(currentProject);
-
-			// Check the log file and execute the command via thread
-			if (logFile.exists()) {
-				if (hbv != "") { //$NON-NLS-1$
-					hbv += "/"; //$NON-NLS-1$
-				}
-				hbv += "ispUI " + logFile.getLocationURI().getPath(); //$NON-NLS-1$
-				GemUtilities.runCommandAsThread(hbv);
-			} else {
-				GemUtilities.showErrorDialog(Messages.HbvLogFilePopUpAction_1);
-			}
-		}
-	}
-
-	/**
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-		} else {
-			this.selection = null;
-		}
-	}
-
-	/**
-	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		// do nothing
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/ProcessLogFilePopUpAction.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/ProcessLogFilePopUpAction.java
deleted file mode 100644
index 384c27f..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/ProcessLogFilePopUpAction.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.popup.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ptp.internal.gem.views.GemAnalyzer;
-import org.eclipse.ptp.internal.gem.views.GemBrowser;
-import org.eclipse.ptp.internal.gem.views.GemConsole;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Object action implementation for associated GEM actions declared in
- * plugin.xml.
- * 
- * Implements IObjectActionDelegate, which extends ActionDelegate, an
- * IActionDelegate base class.
- * 
- * @see org.eclipse.ui.IObjectActionDelegate
- */
-public class ProcessLogFilePopUpAction implements IObjectActionDelegate {
-
-	private IStructuredSelection selection;
-
-	/**
-	 * Constructor.
-	 */
-	public ProcessLogFilePopUpAction() {
-		super();
-	}
-
-	/**
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		if (this.selection == null) {
-			return;
-		}
-
-		// Make sure the file selection is valid
-		if (this.selection.toString().equals("<empty selection>")) { //$NON-NLS-1$
-			GemUtilities.showErrorDialog(Messages.ProcessLogFilePopUpAction_0);
-		} else {
-			final IFile logFile = (IFile) this.selection.getFirstElement();
-			final IWorkbench wb = PlatformUI.getWorkbench();
-			final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-			final IWorkbenchPage page = window.getActivePage();
-			final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-
-			// Open GEM views in order determined by preference
-			try {
-				final String activeView = pstore.getString(PreferenceConstants.GEM_ACTIVE_VIEW);
-				if (activeView.equals("analyzer")) { //$NON-NLS-1$
-					page.showView(GemBrowser.ID);
-					page.showView(GemAnalyzer.ID);
-				} else {
-					page.showView(GemAnalyzer.ID);
-					page.showView(GemBrowser.ID);
-				}
-				page.showView(GemConsole.ID);
-			} catch (final PartInitException e) {
-				GemUtilities.logExceptionDetail(e);
-			}
-
-			// Sync the project resources with the underlying file system
-			final String projectName = logFile.getProject().getName();
-			final IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-			GemUtilities.refreshProject(currentProject);
-
-			// Check the log file and execute the command via thread
-			if (logFile.exists()) {
-				GemUtilities.initGemViews(logFile, false, false);
-			} else {
-				GemUtilities.showErrorDialog(Messages.ProcessLogFilePopUpAction_1);
-			}
-		}
-	}
-
-	/**
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-		} else {
-			this.selection = null;
-		}
-	}
-
-	/**
-	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		// do nothing
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/VerificationPopUpAction.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/VerificationPopUpAction.java
deleted file mode 100644
index faaf24d..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/popup/actions/VerificationPopUpAction.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.popup.actions;
-
-import java.net.URI;
-
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ptp.internal.gem.views.GemAnalyzer;
-import org.eclipse.ptp.internal.gem.views.GemBrowser;
-import org.eclipse.ptp.internal.gem.views.GemConsole;
-import org.eclipse.ptp.rdt.sync.core.SyncConfigManager;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Object action implementation for associated GEM actions declared in
- * plugin.xml.
- * 
- * Implements IObjectActionDelegate, which extends ActionDelegate, an
- * IActionDelegate base class.
- * 
- * @see org.eclipse.ui.IObjectActionDelegate
- */
-@SuppressWarnings("restriction")
-public class VerificationPopUpAction implements IObjectActionDelegate {
-
-	private IStructuredSelection selection;
-
-	/**
-	 * Constructor.
-	 */
-	public VerificationPopUpAction() {
-		super();
-	}
-
-	/**
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-
-		if (this.selection == null) {
-			return;
-		}
-
-		// Check that the selection is valid
-		if (this.selection.toString().equals("<empty selection>")) { //$NON-NLS-1$
-			GemUtilities.showErrorDialog(Messages.VerificationPopUpAction_0);
-		} else {
-			final Object selectionElement = this.selection.getFirstElement();
-			IResource resource = null;
-
-			if (selectionElement instanceof IResource) {
-				resource = (IResource) selectionElement;
-			} else if (selectionElement instanceof ICElement) {
-				resource = ((ICElement) selectionElement).getResource();
-			}
-
-			// Do the work if the resource is valid
-			if (resource != null) {
-				final String id = action.getId();
-				final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-				final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-
-				// Open GEM views in order determined by preference
-				try {
-					// ask for command line arguments
-					GemUtilities.setCommandLineArgs();
-
-					final String activeView = pstore.getString(PreferenceConstants.GEM_ACTIVE_VIEW);
-					if (activeView.equals("analyzer")) { //$NON-NLS-1$
-						page.showView(GemBrowser.ID);
-						page.showView(GemAnalyzer.ID);
-					} else {
-						page.showView(GemAnalyzer.ID);
-						page.showView(GemBrowser.ID);
-					}
-					page.showView(GemConsole.ID);
-
-					// if !isValidSourceFile, then its a .gem profiled executable
-					final boolean isValidSourceFile = id
-							.equals("org.eclipse.ptp.gem.verificationPopupC") //$NON-NLS-1$
-							|| id.equals("org.eclipse.ptp.gem.verificationPopupCpp") //$NON-NLS-1$
-							|| id.equals("org.eclipse.ptp.gem.verificationPopupC++") //$NON-NLS-1$
-							|| id.equals("org.eclipse.ptp.gem.verificationPopupCp") //$NON-NLS-1$
-							|| id.equals("org.eclipse.ptp.gem.verificationPopupCc"); //$NON-NLS-1$
-
-					// Save the URI of the most recent project resource
-					// if (isValidSourceFile) {
-					final boolean isSync = GemUtilities.isSynchronizedProject(resource);
-					URI resourceLocation = null;
-					try {
-						if (isSync) {
-							resourceLocation = SyncConfigManager.getActiveSyncLocationURI(resource);
-						} else {
-							resourceLocation = resource.getLocationURI();
-						}
-					} catch (final CoreException e) {
-						GemUtilities.logExceptionDetail(e);
-					}
-					GemUtilities.saveMostRecentURI(resourceLocation);
-
-					GemUtilities.initGemViews(resource, isValidSourceFile, true);
-
-				} catch (final PartInitException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			} else {
-				GemUtilities.showErrorDialog(Messages.VerificationPopUpAction_1);
-				return;
-			}
-		}
-	}
-
-	/**
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-		} else {
-			this.selection = null;
-		}
-	}
-
-	/**
-	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		// do nothing
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/GemPreferencePage.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/GemPreferencePage.java
deleted file mode 100644
index 3f355a0..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/GemPreferencePage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This page is used to modify preferences for the GEM plug-in. They are stored
- * in the preference store that belongs to the main plug-in class.
- */
-public class GemPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-
-	public GemPreferencePage() {
-		super(GRID);
-		setPreferenceStore(GemPlugin.getDefault().getPreferenceStore());
-	}
-
-	/**
-	 * Creates field editors and does layout for the main GEM preference page.
-	 */
-	@Override
-	public void createFieldEditors() {
-		final Composite fieldEditorParent = this.getFieldEditorParent();
-
-		// Create group of miscellaneous FieldEditors
-		final Group prefGroup = new Group(fieldEditorParent, SWT.NULL);
-		prefGroup.setText(Messages.GemPreferencePage_0);
-		addField(new IntegerFieldEditor(PreferenceConstants.GEM_PREF_NUMPROCS, Messages.GemPreferencePage_1, prefGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_CLRCON, Messages.GemPreferencePage_3, prefGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_REQUEST_ARGS, Messages.GemPreferencePage_10, prefGroup));
-		addField(new RadioGroupFieldEditor(PreferenceConstants.GEM_ACTIVE_VIEW, Messages.GemPreferencePage_5, 3,
-				new String[][] { { Messages.GemPreferencePage_7, PreferenceConstants.GEM_ANALYZER },
-						{ Messages.GemPreferencePage_8, PreferenceConstants.GEM_BROWSER },
-						{ Messages.GemPreferencePage_9, PreferenceConstants.GEM_CONSOLE }
-				}, prefGroup, false));
-
-		// Do the grid layout work for each group.
-		doLayoutAndData(prefGroup, 3, 300);
-
-		// Help button setup
-		final Button helpButton = new Button(fieldEditorParent, SWT.PUSH);
-		helpButton.setLayoutData(new GridData(SWT.LEFT, SWT.NULL, false, false, 3, 1));
-		helpButton.setImage(GemPlugin.getImageDescriptor("icons/help-contents.gif").createImage()); //$NON-NLS-1$
-		helpButton.setToolTipText(Messages.GemPreferencePage_4);
-
-		helpButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// do nothing
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				PlatformUI.getWorkbench().getHelpSystem()
-						.displayHelpResource("/org.eclipse.ptp.gem.help/html/preferences.html#gemPrefs"); //$NON-NLS-1$
-			}
-		});
-	}
-
-	/*
-	 * Performs Layout of Grid and data therein for the specified group.
-	 */
-	private void doLayoutAndData(Group group, int numColumns, int widthHint) {
-		final GridLayout gl = new GridLayout(numColumns, false);
-		group.setLayout(gl);
-		final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = widthHint;
-		group.setLayoutData(gd);
-	}
-
-	/*
-	 * @see
-	 * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		// do nothing
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/IspPreferencePage.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/IspPreferencePage.java
deleted file mode 100644
index ab6e1eb..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/IspPreferencePage.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This page is used to modify ISP related preferences for the GEM plug-in. They
- * are stored in the preference store that belongs to the main plug-in class.
- */
-public class IspPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-
-	public IspPreferencePage() {
-		super(GRID);
-		setPreferenceStore(GemPlugin.getDefault().getPreferenceStore());
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and restore itself.
-	 */
-	@Override
-	public void createFieldEditors() {
-		final Composite fieldEditorParent = this.getFieldEditorParent();
-
-		// Create group for BooleanFieldEditors
-		final Group prefsGroup = new Group(fieldEditorParent, SWT.NULL);
-		prefsGroup.setText(Messages.IspPreferencePage_0);
-
-		// Create BooleanFieldEditors for command line options.
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_FIB, Messages.IspPreferencePage_1, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_MPICALLS, Messages.IspPreferencePage_2, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_OPENMP, Messages.IspPreferencePage_3, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_BLOCK, Messages.IspPreferencePage_4, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_REPORT, Messages.IspPreferencePage_5, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_UNIXSOCKETS, Messages.IspPreferencePage_6, prefsGroup));
-		addField(new BooleanFieldEditor(PreferenceConstants.GEM_PREF_VERBOSE, Messages.IspPreferencePage_7, prefsGroup));
-
-		// Vertical spacer
-		new Label(fieldEditorParent, SWT.NULL).setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false, 3, 1));
-
-		// Create group of miscellaneous FieldEditors
-		final Group miscGroup = new Group(fieldEditorParent, SWT.NULL);
-		miscGroup.setText(Messages.IspPreferencePage_8);
-		addField(new IntegerFieldEditor(PreferenceConstants.GEM_PREF_PORTNUM, Messages.IspPreferencePage_9, miscGroup));
-		addField(new IntegerFieldEditor(PreferenceConstants.GEM_PREF_REPORTNUM, Messages.IspPreferencePage_10, miscGroup));
-		addField(new StringFieldEditor(PreferenceConstants.GEM_PREF_HOSTNAME, Messages.IspPreferencePage_17, miscGroup));
-
-		// Vertical spacer
-		new Label(fieldEditorParent, SWT.NULL).setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false, 3, 1));
-
-		// Create group for GEM-path FieldEditors
-		final Group gemPathsGroup = new Group(fieldEditorParent, SWT.NULL);
-		gemPathsGroup.setText(Messages.IspPreferencePage_11);
-		addField(new DirectoryFieldEditor(PreferenceConstants.GEM_PREF_ISPEXE_PATH, Messages.IspPreferencePage_12, gemPathsGroup));
-		addField(new DirectoryFieldEditor(PreferenceConstants.GEM_PREF_ISPCC_PATH, Messages.IspPreferencePage_13, gemPathsGroup));
-		addField(new DirectoryFieldEditor(PreferenceConstants.GEM_PREF_ISPCPP_PATH, Messages.IspPreferencePage_14, gemPathsGroup));
-		addField(new DirectoryFieldEditor(PreferenceConstants.GEM_PREF_HBV_PATH, Messages.IspPreferencePage_15, gemPathsGroup));
-
-		// Vertical spacer
-		new Label(fieldEditorParent, SWT.NULL).setLayoutData(new GridData(SWT.FILL, SWT.NULL, true, false, 3, 1));
-
-		// Create group for GEM-path FieldEditors
-		final Group remoteGemPathsGroup = new Group(fieldEditorParent, SWT.NULL);
-		remoteGemPathsGroup.setText(Messages.IspPreferencePage_18);
-		addField(new StringFieldEditor(PreferenceConstants.GEM_PREF_REMOTE_ISPEXE_PATH, Messages.IspPreferencePage_19,
-				remoteGemPathsGroup));
-		addField(new StringFieldEditor(PreferenceConstants.GEM_PREF_REMOTE_ISPCC_PATH, Messages.IspPreferencePage_20,
-				remoteGemPathsGroup));
-		addField(new StringFieldEditor(PreferenceConstants.GEM_PREF_REMOTE_ISPCPP_PATH, Messages.IspPreferencePage_21,
-				remoteGemPathsGroup));
-
-		// Do the grid layout work for each group.
-		doLayoutAndData(prefsGroup, 1, 300);
-		doLayoutAndData(miscGroup, 3, 300);
-		doLayoutAndData(gemPathsGroup, 3, 300);
-		doLayoutAndData(remoteGemPathsGroup, 3, 300);
-
-		// Help button setup
-		final Button helpButton = new Button(fieldEditorParent, SWT.PUSH);
-		helpButton.setLayoutData(new GridData(SWT.LEFT, SWT.NULL, false, false, 3, 1));
-		helpButton.setImage(GemPlugin.getImageDescriptor("icons/help-contents.gif").createImage()); //$NON-NLS-1$
-		helpButton.setToolTipText(Messages.IspPreferencePage_16);
-
-		helpButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// do nothing
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				PlatformUI.getWorkbench().getHelpSystem()
-						.displayHelpResource("/org.eclipse.ptp.gem.help/html/preferences.html#ispPrefs"); //$NON-NLS-1$
-			}
-		});
-	}
-
-	/*
-	 * Performs Layout of Grid and data therein for the specified group.
-	 */
-	private void doLayoutAndData(Group group, int numColumns, int widthHint) {
-		final GridLayout gl = new GridLayout(numColumns, false);
-		group.setLayout(gl);
-		final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = widthHint;
-		group.setLayoutData(gd);
-	}
-
-	/*
-	 * @see
-	 * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		// do nothing
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceConstants.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceConstants.java
deleted file mode 100644
index 2b72b86..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceConstants.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.preferences;
-
-/**
- * Class used to define preference page constants for this plug-in.
- */
-public class PreferenceConstants {
-
-	// Command line options
-	public static final String GEM_PREF_FIB = "fibPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_MPICALLS = "mpiCallsPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_OPENMP = "openmpPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_BLOCK = "blockingSendsPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_REPORT = "reportPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_VERBOSE = "verbosePreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_UNIXSOCKETS = "unixSockets"; //$NON-NLS-1$
-
-	// Miscellaneous options
-	public static final String GEM_PREF_PORTNUM = "portPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_NUMPROCS = "numprocsPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_REPORTNUM = "reportNumPreference"; //$NON-NLS-1$
-	public static final String GEM_PREF_HOSTNAME = "hostName"; //$NON-NLS-1$
-	public static final String GEM_PREF_CLRCON = "clearConsolePreference"; //$NON-NLS-1$
-	public static final String GEM_ACTIVE_VIEW = "activeViewPreference"; //$NON-NLS-1$
-	public static final String GEM_CONSOLE = "console"; //$NON-NLS-1$
-	public static final String GEM_BROWSER = "browser"; //$NON-NLS-1$
-	public static final String GEM_ANALYZER = "analyzer"; //$NON-NLS-1$
-	public static final String GEM_PREF_REQUEST_ARGS = "requestArgs"; //$NON-NLS-1$
-
-	// ISP paths, scripts and file names
-	public static final String GEM_PREF_ISPEXE_PATH = "ispPath"; //$NON-NLS-1$
-	public static final String GEM_PREF_ISPCC_PATH = "ispccPath"; //$NON-NLS-1$
-	public static final String GEM_PREF_ISPCPP_PATH = "ispcppPath"; //$NON-NLS-1$
-	public static final String GEM_PREF_HBV_PATH = "hbvPath"; //$NON-NLS-1$
-
-	// Remote ISP paths, scripts and file names
-	public static final String GEM_PREF_REMOTE_ISPEXE_PATH = "remoteIspPath"; //$NON-NLS-1$
-	public static final String GEM_PREF_REMOTE_ISPCC_PATH = "remoteIspccPath"; //$NON-NLS-1$
-	public static final String GEM_PREF_REMOTE_ISPCPP_PATH = "remoteIspcppPath"; //$NON-NLS-1$
-
-	// Hidden preference for the order MPI calls are stepped
-	public static final String GEM_PREF_STEP_ORDER = "stepOrderPreference"; //$NON-NLS-1$
-
-	// Hidden preference for last file accessed - String representation of URI
-	public static final String GEM_PREF_MOST_RECENT_FILE = "mostRecentFile"; //$NON-NLS-1$
-
-	// Hidden preference for name of child processes
-	public static final String GEM_PREF_PROCESS_NAME = "processName"; //$NON-NLS-1$
-
-	// Hidden preference holding the previously used cmd line arguments
-	public static final String GEM_PREF_ARGS = "cmdArgs"; //$NON-NLS-1$
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceInitializer.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceInitializer.java
deleted file mode 100644
index fdedc06..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-
-/**
- * Class used to initialize default preference values for this plug-in.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Initializes default preference values for the GEM plug-in.
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#
-	 */
-	@Override
-	public void initializeDefaultPreferences() {
-
-		// Preference store for the GEM plug-in
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-
-		// Command line options
-		pstore.setDefault(PreferenceConstants.GEM_PREF_FIB, true);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_MPICALLS, false);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_OPENMP, false);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_BLOCK, true);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REPORT, false);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_VERBOSE, false);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_UNIXSOCKETS, true);
-
-		// Miscellaneous options
-		pstore.setDefault(PreferenceConstants.GEM_PREF_PORTNUM, 9999);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_NUMPROCS, 2);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REPORTNUM, 4);
-		pstore.setDefault(PreferenceConstants.GEM_PREF_HOSTNAME, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_CLRCON, true);
-		pstore.setDefault(PreferenceConstants.GEM_ACTIVE_VIEW, "analyzer"); //$NON-NLS-1$
-
-		// ISP paths, scripts and file names
-		pstore.setDefault(PreferenceConstants.GEM_PREF_ISPEXE_PATH, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_ISPCPP_PATH, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_ISPCC_PATH, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_HBV_PATH, ""); //$NON-NLS-1$
-
-		// Remote ISP paths, scripts and file names
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REMOTE_ISPEXE_PATH, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REMOTE_ISPCPP_PATH, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REMOTE_ISPCC_PATH, ""); //$NON-NLS-1$
-
-		// Hidden preference for the order MPI calls are stepped
-		pstore.setDefault(PreferenceConstants.GEM_PREF_STEP_ORDER, "issueOrder"); //$NON-NLS-1$
-
-		// Hidden preference for last file accessed - URI.toString
-		pstore.setDefault(PreferenceConstants.GEM_PREF_MOST_RECENT_FILE, ""); //$NON-NLS-1$
-
-		// Hidden preference for name of child processes
-		pstore.setDefault(PreferenceConstants.GEM_PREF_PROCESS_NAME, ""); //$NON-NLS-1$
-
-		// Preferences for command line arguments
-		pstore.setDefault(PreferenceConstants.GEM_PREF_ARGS, ""); //$NON-NLS-1$
-		pstore.setDefault(PreferenceConstants.GEM_PREF_REQUEST_ARGS, false);
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CB.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CB.java
deleted file mode 100644
index f9a2e5c..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CB.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-/**
- * This class represents a CB (completes before) edge. It simply consists of a
- * rank and an index.
- */
-
-public class CB {
-
-	private final int rank;
-	private final int index;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param rank
-	 *            The rank for this CB.
-	 * @param index
-	 *            The index for this CB.
-	 */
-	public CB(int rank, int index) {
-		this.rank = rank;
-		this.index = index;
-	}
-
-	/**
-	 * Returns the index of the operation.
-	 * 
-	 * @param none
-	 * @return int The index involved with this CB.
-	 */
-	public int getIndex() {
-		return this.index;
-	}
-
-	/**
-	 * Returns the rank of the operation.
-	 * 
-	 * @param none
-	 * @return int The rank involved with this CB.
-	 */
-	public int getRank() {
-		return this.rank;
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CommandThread.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CommandThread.java
deleted file mode 100644
index 0c29288..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/CommandThread.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.io.IOException;
-
-/**
- * This class serves to execute the specified string as a command via the
- * java.lang.Runtime instance.
- */
-public class CommandThread implements Runnable {
-
-	private final String command;
-
-	/**
-	 * Sets the command to be whatever was passed in. This thread executes the
-	 * specified command via the java.lang.Runtime instance.
-	 * 
-	 * @param cmd
-	 *            The new command String.
-	 */
-	public CommandThread(String cmd) {
-		this.command = cmd;
-	}
-
-	public void run() {
-		try {
-			Runtime.getRuntime().exec(this.command);
-		} catch (final IOException e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Envelope.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Envelope.java
deleted file mode 100644
index 5029082..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Envelope.java
+++ /dev/null
@@ -1,771 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.ptp.internal.gem.messages.Messages;
-
-/**
- * This class is a representation of all possible attributes for an MPI function
- * call intercepted by the ISP Profiler.
- */
-public class Envelope {
-
-	// Basic Envelope information
-	private int interleaving;
-	private int rank;
-	private int index;
-	private int orderIndex;
-	private int issueIndex;
-	private int linenumber;
-
-	// For output
-	private String functionName;
-	private String filePath;
-	private String toStringOutput;
-
-	// For point-2-point matches.
-	private int match_rank;
-	private int match_index;
-	private Envelope match_envelope;
-
-	// For collectives, sends, and receives.
-	private int communicator;
-	private String communicator_ranks_string;
-	private ArrayList<Integer> communicator_ranks;
-	private ArrayList<Envelope> communicator_matches;
-
-	// For sends / receives.
-	private int src_rank;
-	private int dest_rank;
-	private int tag;
-
-	// Intra and inter CB edges
-	@SuppressWarnings("unused")
-	private ArrayList<CB> intraCb;
-	@SuppressWarnings("unused")
-	private ArrayList<CB> interCb;
-
-	// For outputting to string, determine what to output.
-	private boolean communicator_set;
-	private boolean src_rank_set;
-	private boolean dest_rank_set;
-	private boolean tag_set;
-
-	// For assertions.
-	private boolean assertion;
-	private String assert_message;
-	@SuppressWarnings("unused")
-	private String assert_function;
-
-	// For resource leaks.
-	private boolean leak;
-	private String leak_resource;
-
-	// Regular expressions for parsing particular log file lines
-	private static Pattern envelopeRegex = Pattern
-			.compile("^([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([0-9]+)\\s+([-0-9]+)\\s+([^\\s]+)(?:\\s+([^\\s]+))?(?:\\s+([^\\s]+))?(?:\\s+([^\\s]+))?\\s+\\{\\s+([^\\}]*)\\}\\s+\\{\\s+([^}]*)\\}\\s+Match:\\s+([-]?[0-9]+)\\s+([-]?[0-9]+)\\s+File:\\s+[-]?[0-9]+ (.+?) ([-]?[0-9]+)$"); //$NON-NLS-1$
-	private static Pattern assertRegex = Pattern
-			.compile("^([0-9]+)\\s+([0-9]+)\\s+ASSERT[ ]+Message:[ ]+[0-9]+ (.+?)Function:[ ]+[0-9]+ (.+?) File:[ ]+[0-9]+ (.+?) ([-]?[0-9]+)$"); //$NON-NLS-1$
-	private static Pattern leakRegex = Pattern
-			.compile("^([0-9]+)\\s+([0-9]+)\\s+Leak\\s+(.+?)\\s+\\{\\s+\\}\\s+\\{\\s+\\}\\s+Match:\\s+-1\\s+-1\\sFile:[ ]+[0-9]+ (.+?) ([-]?[0-9]+)$"); //$NON-NLS-1$
-	private static Pattern communicatorRegex = Pattern.compile("^([0-9]+)_(?:([0-9]+):)*$"); //$NON-NLS-1$
-	private static Pattern interCbRegex = Pattern.compile("^(?:\\[\\s+([0-9]+)\\s+([0-9]+)\\s+\\]\\s+)*$"); //$NON-NLS-1$
-	private static Pattern intraCbRegex = Pattern.compile("^([0-9]+\\s+)*$"); //$NON-NLS-1$
-
-	/**
-	 * Returns true if the specified String is null or empty, false otherwise.
-	 * 
-	 * @param value
-	 *            The String that is being checked.
-	 * @return boolean True if the specified String is null or empty, false
-	 *         otherwise.
-	 */
-	private static boolean isNullOrEmpty(String value) {
-		if (value == null || value == "") { //$NON-NLS-1$
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Using regular expressions, this method parses the input line an attempts
-	 * to create an envelope, or returns null if there was a parse error,
-	 * meaning the line couldn't be matched and an Envelope was not created.
-	 * 
-	 * @param line
-	 *            The log file line to parse with regular expressions.
-	 * @return Envelope The Envelope, or null if no Envelope is created.
-	 */
-	public static Envelope parse(String line) {
-		final Matcher envelopeMatch = envelopeRegex.matcher(line);
-
-		// This means we have a leak, an assert or an IB
-		if (!envelopeMatch.matches()) {
-			final Matcher assertMatch = assertRegex.matcher(line);
-			if (assertMatch.matches()) {
-				final Envelope env = new Envelope();
-				env.assertion = true;
-				env.issueIndex = -1;
-				env.orderIndex = Integer.MAX_VALUE;
-				env.index = Integer.MAX_VALUE;
-				env.match_index = -1;
-				env.match_rank = -1;
-				env.functionName = "MPI_assert"; //$NON-NLS-1$
-				try {
-					env.interleaving = Integer.parseInt(assertMatch.group(1));
-				} catch (final NumberFormatException e) {
-					env.interleaving = -1;
-				}
-				try {
-					env.rank = Integer.parseInt(assertMatch.group(2));
-				} catch (final NumberFormatException e) {
-					env.rank = -1;
-				}
-				env.assert_message = assertMatch.group(3);
-				env.assert_function = assertMatch.group(4);
-				env.filePath = assertMatch.group(5);
-				try {
-					env.linenumber = Integer.parseInt(assertMatch.group(6));
-				} catch (final NumberFormatException e) {
-					env.linenumber = -1;
-				}
-				return env;
-			}
-
-			// Look for resource leaks
-			final Matcher leakMatch = leakRegex.matcher(line);
-			if (leakMatch.matches()) {
-				final Envelope env = new Envelope();
-				env.leak = true;
-				env.issueIndex = -1;
-				env.orderIndex = Integer.MAX_VALUE;
-				env.index = Integer.MAX_VALUE;
-				env.match_index = -1;
-				env.match_rank = -1;
-				env.functionName = "leak"; //$NON-NLS-1$
-				try {
-					env.interleaving = Integer.parseInt(leakMatch.group(1));
-				} catch (final NumberFormatException e) {
-					env.interleaving = -1;
-				}
-				try {
-					env.rank = Integer.parseInt(leakMatch.group(2));
-				} catch (final NumberFormatException e) {
-					env.rank = -1;
-				}
-				env.leak_resource = leakMatch.group(3);
-				env.filePath = leakMatch.group(4);
-				try {
-					env.linenumber = Integer.parseInt(leakMatch.group(5));
-				} catch (final NumberFormatException e) {
-					env.linenumber = -1;
-				}
-				return env;
-			}
-
-			return null;
-		}
-
-		// We know we have an real Envelope by now
-		final Envelope env = new Envelope();
-		for (int i = 1; i <= envelopeMatch.groupCount(); i++) {
-			final String value = envelopeMatch.group(i);
-
-			switch (i) {
-			case 1: {
-				env.interleaving = Integer.parseInt(value);
-				break;
-			}
-			case 2: {
-				env.rank = Integer.parseInt(value);
-				break;
-			}
-			case 3: {
-				env.index = Integer.parseInt(value);
-				break;
-			}
-			case 4: {
-				env.orderIndex = Integer.parseInt(value);
-				break;
-			}
-			case 5: {
-				env.issueIndex = Integer.parseInt(value);
-				break;
-			}
-			case 6: {
-				env.functionName = "MPI_" + value; //$NON-NLS-1$
-				break;
-			}
-			case 7: {
-
-				// If communicator, only first filled in.
-				if (!isNullOrEmpty(value) && isNullOrEmpty(envelopeMatch.group(i + 1)) && isNullOrEmpty(envelopeMatch.group(i + 2))) {
-					parseCommunicator(env, value);
-					env.tag = 0;
-					env.tag_set = false;
-					env.src_rank = 0;
-					env.src_rank_set = false;
-					env.dest_rank = 0;
-					env.dest_rank_set = false;
-				}
-
-				// If all three tokens are present, then it's a send or receive.
-				else if (!isNullOrEmpty(value) && !isNullOrEmpty(envelopeMatch.group(i + 1))
-						&& !isNullOrEmpty(envelopeMatch.group(i + 2))) {
-					if (env.functionName.toLowerCase().contains("recv") || env.functionName.toLowerCase().contains("probe")) { //$NON-NLS-1$ //$NON-NLS-2$
-						env.src_rank = Integer.parseInt(value);
-						env.src_rank_set = true;
-						env.dest_rank = 0;
-						env.dest_rank_set = false;
-					} else {
-						env.src_rank = 0;
-						env.src_rank_set = false;
-						env.dest_rank = Integer.parseInt(value);
-						env.dest_rank_set = true;
-					}
-					env.tag = Integer.parseInt(envelopeMatch.group(i + 1));
-					env.tag_set = true;
-					parseCommunicator(env, envelopeMatch.group(i + 2));
-				}
-
-				// Otherwise, a Wait, Test, or Finalize.
-				else {
-					env.src_rank = 0;
-					env.src_rank_set = false;
-					env.dest_rank = 0;
-					env.dest_rank_set = false;
-					env.tag = 0;
-					env.tag_set = false;
-					env.communicator = 0;
-					env.communicator_set = false;
-				}
-				break;
-			}
-			case 10: {
-
-				// IntraCBs
-				final ArrayList<CB> intraCb = new ArrayList<CB>();
-				final Matcher intraCbMatch = intraCbRegex.matcher(value);
-				if (intraCbMatch.matches()) {
-
-					// This puts a single integer into each match group.
-					final Pattern pattern = Pattern.compile("([0-9]+\\s+)"); //$NON-NLS-1$
-					final Matcher matcher = pattern.matcher(value);
-
-					String index = ""; //$NON-NLS-1$
-					while (matcher.find()) {
-						index = matcher.group().trim();
-						if (!isNullOrEmpty(index)) {
-							intraCb.add(new CB(env.rank, Integer.parseInt(index)));
-						}
-					}
-				}
-				env.intraCb = intraCb;
-				break;
-			}
-			case 11: {
-
-				// InterCBs
-				final ArrayList<CB> interCb = new ArrayList<CB>();
-				final Matcher interCbMatcher = interCbRegex.matcher(value);
-
-				// Make sure we're starting with the right thing
-				if (interCbMatcher.matches()) {
-
-					// This will put a single integer into each match group
-					final Pattern pattern = Pattern.compile("[\\s+([0-9])+\\s+[0-9]+)\\s+]\\s+"); //$NON-NLS-1$
-					final Matcher matcher = pattern.matcher(value);
-
-					String rank = ""; //$NON-NLS-1$
-					String index = ""; //$NON-NLS-1$
-					while (matcher.find()) {
-						rank = matcher.group().trim();
-						if (matcher.find()) {
-							index = matcher.group().trim();
-						}
-						if (!isNullOrEmpty(rank) && !isNullOrEmpty(index)) {
-							interCb.add(new CB(Integer.parseInt(rank), Integer.parseInt(index)));
-						}
-					}
-					env.interCb = interCb;
-					break;
-				}
-				break;
-			}
-			case 12: {
-				env.match_rank = Integer.parseInt(value);
-				break;
-			}
-			case 13: {
-				env.match_index = Integer.parseInt(value);
-				break;
-			}
-			case 14: {
-				env.filePath = value;
-				break;
-			}
-			case 15: {
-				env.linenumber = Integer.parseInt(value);
-				break;
-			}
-			default:
-				break;
-			}
-		}
-		return env;
-	}
-
-	/**
-	 * Parses out the ranks that are members of the communicator matched with
-	 * the communicator regular expression.
-	 * 
-	 * @param env
-	 *            The Envelope being updated.
-	 * @param value
-	 *            The String holding the ranks that need to be parsed.
-	 * @return void
-	 */
-	private static void parseCommunicator(Envelope env, String value) {
-		if (value == null) {
-			GemUtilities.showErrorDialog(Messages.Envelope_0);
-			return;
-		}
-
-		final Matcher communicatorMatch = communicatorRegex.matcher(value);
-		if (!communicatorMatch.matches() || communicatorMatch.groupCount() == 1) {
-			env.communicator_set = false;
-			env.communicator = -1;
-		} else {
-			env.communicator_set = true;
-			env.communicator = Integer.parseInt(communicatorMatch.group(1));
-			env.communicator_ranks_string = value.trim();
-
-			final Pattern pattern = Pattern.compile("([0-9]+):"); //$NON-NLS-1$
-			final Matcher matcher = pattern.matcher(value);
-
-			env.communicator_ranks = new ArrayList<Integer>();
-			while (matcher.find()) {
-				final String commMemberRank = matcher.group().trim().replace(":", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				if (!isNullOrEmpty(commMemberRank)) {
-					env.communicator_ranks.add(Integer.parseInt(commMemberRank));
-				}
-			}
-		}
-	}
-
-	/*
-	 * Should only be called by the parse function.
-	 */
-	private Envelope() {
-	}
-
-	/**
-	 * Adds the specified Envelope to the list of collective matches.
-	 * 
-	 * @param envelope
-	 *            The Envelope to add.
-	 * @return void
-	 */
-	public void addCollectiveMatch(Envelope envelope) {
-		if (this.communicator_matches == null) {
-			this.communicator_matches = new ArrayList<Envelope>();
-		}
-		this.communicator_matches.add(envelope);
-
-		if (envelope.communicator_matches == null) {
-			envelope.communicator_matches = new ArrayList<Envelope>();
-		}
-		envelope.communicator_matches.add(this);
-	}
-
-	public boolean equals(Envelope otherEnvelope) {
-		return this.getIndex() == otherEnvelope.getIndex() &&
-				this.getInterleaving() == otherEnvelope.getInterleaving();
-	}
-
-	/**
-	 * Returns an ArrayList of Envelopes holding each envelope that matches with
-	 * this Envelope.
-	 * 
-	 * @param none
-	 * @return ArrayList<Envelope> List of matching Envelopes.
-	 */
-	public ArrayList<Envelope> getCommunicator_matches() {
-		return this.communicator_matches;
-	}
-
-	/**
-	 * Returns the list of communicator ranks for this Envelope.
-	 * 
-	 * @param none
-	 * @return ArrayList<Integer> The list of communicator ranks for this
-	 *         Envelope.
-	 */
-	public ArrayList<Integer> getCommunicator_ranks() {
-		return this.communicator_ranks;
-	}
-
-	/**
-	 * Returns the String that holds the Communicator ranks involved with this
-	 * Envelope.
-	 * 
-	 * @param none
-	 * @return String The Communicator ranks involved with this Envelope.
-	 */
-	public String getCommunicator_ranks_string() {
-		return this.communicator_ranks_string;
-	}
-
-	/**
-	 * Returns the file path information for this Envelope.
-	 * 
-	 * @param none
-	 * @return String The file path information for this Envelope.
-	 */
-	public String getFilePath() {
-		return this.filePath;
-	}
-
-	/**
-	 * Returns the function name for this Envelope.
-	 * 
-	 * @param none
-	 * @return String The function name for this Envelope.
-	 */
-	public String getFunctionName() {
-		return this.functionName;
-	}
-
-	/**
-	 * Returns the index for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The index for this Envelope.
-	 */
-	public int getIndex() {
-		return this.index;
-	}
-
-	/**
-	 * Returns the interleaving for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The interleaving for this Envelope.
-	 */
-	public int getInterleaving() {
-		return this.interleaving;
-	}
-
-	/**
-	 * Returns the issue order for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The issue order for this Envelope.
-	 */
-	public int getIssueIndex() {
-		return this.issueIndex;
-	}
-
-	/**
-	 * Returns the resource leak for this Envelope.
-	 * 
-	 * @param none
-	 * @return String The resource leak for this Envelope.
-	 */
-	public String getLeakResource() {
-		return this.leak_resource;
-	}
-
-	/**
-	 * Returns the line number in the source file for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The line number in the source file for this Envelope.
-	 */
-	public int getLinenumber() {
-		return this.linenumber;
-	}
-
-	/**
-	 * Returns the match Envelope for this Envelope.
-	 * 
-	 * @param none
-	 * @return Envelope The match Envelope for this Envelope.
-	 */
-	public Envelope getMatch_envelope() {
-		return this.match_envelope;
-	}
-
-	/**
-	 * Returns the match rank index for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The match rank index for this Envelope.
-	 */
-	public int getMatch_index() {
-		return this.match_index;
-	}
-
-	/**
-	 * Returns the match rank for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The match rank for this Envelope.
-	 */
-	public int getMatch_rank() {
-		return this.match_rank;
-	}
-
-	/**
-	 * Returns the program order for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The program order for this Envelope.
-	 */
-	public int getOrderIndex() {
-		return this.orderIndex;
-	}
-
-	/**
-	 * Returns the rank for this Envelope.
-	 * 
-	 * @param none
-	 * @return int The rank for this Envelope.
-	 */
-	public int getRank() {
-		return this.rank;
-	}
-
-	/**
-	 * Returns the rank of the source process that sent the call.
-	 * 
-	 * @param none
-	 * @return int The rank of the source call.
-	 */
-	public int getSrc_rank() {
-		return this.src_rank;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not this envelope represents an
-	 * assertion.
-	 * 
-	 * @param none
-	 * @return boolean True if this Envelope represents an assertion violation,
-	 *         false otherwise.
-	 */
-	public boolean isAssertion() {
-		return this.assertion;
-	}
-
-	/**
-	 * Returns true if the call is a collective, false otherwise.
-	 * 
-	 * @param none
-	 * @return boolean True if the call is a collective, false otherwise.
-	 */
-	public boolean isCollective() {
-		final String MPICall = this.getFunctionName();
-
-		if (MPICall.equals("MPI_Barrier") || MPICall.equals("MPI_Gather") //$NON-NLS-1$ //$NON-NLS-2$
-				|| MPICall.equalsIgnoreCase("MPI_Comm_create") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_gather") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_gatherv") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Allgather") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Allgatherv") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Reduce") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Allreduce") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Alltoall") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Alltoallv") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Scatter") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Scatterv") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Finalize") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Reduce_scatter") //$NON-NLS-1$
-				|| MPICall.equalsIgnoreCase("MPI_Bcast") || MPICall.equals("MPI_Scan")) { //$NON-NLS-1$ //$NON-NLS-2$
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not the Communicator is set.
-	 * 
-	 * @param none
-	 * @return boolean True if the communicator this Envelope is in is set,
-	 *         false otherwise.
-	 */
-	public boolean isCommunicator_set() {
-		return this.communicator_set;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not this envelope is the source
-	 * of a leak.
-	 * 
-	 * @param none
-	 * @return boolean True if this Envelope represents a resource leak, false
-	 *         otherwise.
-	 */
-	public boolean isLeak() {
-		return this.leak;
-	}
-
-	/**
-	 * Returns whether or not the source rank for this Envelope is set.
-	 * 
-	 * @param none
-	 * @return boolean True if the source rank for this Envelope is set, false
-	 *         otherwise.
-	 */
-	public boolean isSrc_rank_set() {
-		return this.src_rank_set;
-	}
-
-	/**
-	 * Pairs the specified envelope with its match.
-	 * 
-	 * @param envelope
-	 *            The Envelope to match.
-	 * @return void
-	 */
-	public void pairWithEnvelope(Envelope envelope) {
-		this.match_envelope = envelope;
-		envelope.match_envelope = this;
-	}
-
-	/**
-	 * Returns the interleaving for this Envelope.
-	 * 
-	 * @param interleaving
-	 *            The interleaving for this Envelope.
-	 * @return void
-	 */
-	public void setInterleaving(int interleaving) {
-		this.interleaving = interleaving;
-	}
-
-	/**
-	 * Sets the issue index for this Envelope.
-	 * 
-	 * @param value
-	 *            The issue index for this Envelope.
-	 * @return void
-	 */
-	public void setIssueIndex(int value) {
-		this.issueIndex = value;
-	}
-
-	/**
-	 * Returns the String representation of this Envelope.
-	 * 
-	 * @param none
-	 * @return String The String representation of this Envelope.
-	 */
-	@Override
-	public String toString() {
-		if (this.toStringOutput != null) {
-			return this.toStringOutput;
-		}
-
-		if (this.assertion) {
-			final Pattern assertPattern = Pattern.compile("^Assertion `(.+?)' failed.$"); //$NON-NLS-1$
-			final Matcher m = assertPattern.matcher(this.assert_message);
-			if (m.matches()) {
-				this.toStringOutput = String.format("{0}({1})", this.functionName, m //$NON-NLS-1$
-						.group(1));
-			} else {
-				this.toStringOutput = String.format("{0}({1})", this.functionName, //$NON-NLS-1$
-						this.assert_message);
-			}
-			return this.toStringOutput;
-		}
-
-		boolean first = true;
-		final StringBuilder sb = new StringBuilder();
-		sb.append("{0}(" + this.functionName + " "); //$NON-NLS-1$ //$NON-NLS-2$
-
-		if (this.src_rank_set) {
-			if (!first) {
-				sb.append(", "); //$NON-NLS-1$
-			} else {
-				first = false;
-			}
-			if (this.src_rank == -1) {
-				sb.append("source = MPI_ANY_SOURCE"); //$NON-NLS-1$
-			} else {
-				sb.append(String.format("source = {0}", this.src_rank)); //$NON-NLS-1$
-			}
-		}
-
-		if (this.dest_rank_set) {
-			if (!first) {
-				sb.append(", "); //$NON-NLS-1$
-			} else {
-				first = false;
-			}
-			sb.append(String.format("dest = {0}", this.dest_rank)); //$NON-NLS-1$
-		}
-
-		if (this.tag_set) {
-			if (!first) {
-				sb.append(", "); //$NON-NLS-1$
-			} else {
-				first = false;
-			}
-			if (this.tag == -1) {
-				sb.append("tag = MPI_ANY_TAG"); //$NON-NLS-1$
-			} else {
-				sb.append(String.format("tag = {0}", this.tag)); //$NON-NLS-1$
-			}
-		}
-
-		if (this.communicator_set) {
-			if (!first) {
-				sb.append(", "); //$NON-NLS-1$
-			} else {
-				first = false;
-			}
-			switch (this.communicator) {
-			case 0: {
-				sb.append("comm = MPI_COMM_WORLD"); //$NON-NLS-1$
-				break;
-			}
-			case 1: {
-				sb.append("comm = MPI_COMM_SELF"); //$NON-NLS-1$
-				break;
-			}
-			case 2: {
-				sb.append("comm = MPI_COMM_NULL"); //$NON-NLS-1$
-				break;
-			}
-			default: {
-				sb.append(String.format("comm = {0}", this.communicator)); //$NON-NLS-1$
-				break;
-			}
-			}
-		}
-		sb.append(")"); //$NON-NLS-1$
-		this.toStringOutput = sb.toString();
-
-		return this.toStringOutput;
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/GemUtilities.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/GemUtilities.java
deleted file mode 100644
index 25d246c..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/GemUtilities.java
+++ /dev/null
@@ -1,1366 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.ServerSocket;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.ParseException;
-import java.util.Scanner;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.JOptionPane;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.views.GemAnalyzer;
-import org.eclipse.ptp.internal.gem.views.GemBrowser;
-import org.eclipse.ptp.internal.gem.views.GemConsole;
-import org.eclipse.ptp.rdt.sync.core.SyncConfigManager;
-import org.eclipse.ptp.rdt.sync.core.SyncFlag;
-import org.eclipse.ptp.rdt.sync.core.SyncManager;
-import org.eclipse.ptp.rdt.sync.core.resources.RemoteSyncNature;
-import org.eclipse.remote.core.IRemoteConnection;
-import org.eclipse.remote.core.IRemoteConnectionType;
-import org.eclipse.remote.core.IRemoteFileService;
-import org.eclipse.remote.core.IRemoteProcess;
-import org.eclipse.remote.core.IRemoteProcessBuilder;
-import org.eclipse.remote.core.IRemoteProcessService;
-import org.eclipse.remote.core.IRemoteServicesManager;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-@SuppressWarnings("restriction")
-public class GemUtilities {
-
-	public static enum TaskStatus {
-		IDLE,
-		ACTIVE,
-		ABORTED;
-	}
-
-	private static Process process;
-	private static IRemoteProcess remoteProcess;
-	private static GemAnalyzer analyzer;
-	private static GemBrowser browser;
-	private static GemConsole console;
-	protected static TaskStatus taskStatus;
-	private static boolean doCompile;
-	private static boolean doVerify;
-	private static String consoleStdOutMessage;
-	private static String consoleStdErrMessage;
-	private static IFile gemActiveResource;
-	private static IFile gemLogFile;
-
-	// This thread exists to update SWT components belonging to the UI thread.
-	private final static Thread updateGemConsoleThread = new Thread() {
-		@Override
-		public void run() {
-			final IWorkbench wb = PlatformUI.getWorkbench();
-			final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-			final IWorkbenchPage page = window.getActivePage();
-			GemConsole gemConsole = null;
-			IViewPart gemViewPart = null;
-
-			try {
-				page.showView(GemConsole.ID);
-				gemViewPart = page.findView(GemConsole.ID);
-				gemConsole = (GemConsole) gemViewPart;
-				gemConsole.writeStdOut(consoleStdOutMessage);
-				gemConsole.writeStdErr(consoleStdErrMessage);
-			} catch (final Exception e) {
-				logExceptionDetail(e);
-			}
-		}
-	};
-
-	/**
-	 * Casts or adapts the specified IResource to IFile.
-	 * 
-	 * @param resource
-	 *            The resource to cast or adapt to IFile
-	 * @return IFile The cast or adapted IResource
-	 */
-	public static IFile adaptResource(IResource resource) {
-		if (resource instanceof IFile) {
-			return (IFile) resource;
-		}
-		return (IFile) resource.getAdapter(IFile.class);
-	}
-
-	/*
-	 * Used to cancel the current GEM analysis without killing any processes.
-	 */
-	private static void cancelAnalysis() {
-		analyzer.clear();
-		browser.clear();
-		console.cancel();
-		taskStatus = TaskStatus.IDLE;
-	}
-
-	// Creates the GEM folder for the log file
-	private static void createGemFolder(final boolean isRemote, final IFolder gemFolder) {
-		try {
-			gemFolder.create(IResource.FORCE, true, null);
-		} catch (final CoreException e) {
-			logExceptionDetail(e);
-		}
-		if (isRemote) {
-			sync();
-		}
-	}
-
-	/**
-	 * Runs the Happens Before Viewer on the log file associated with the
-	 * specified input source file.
-	 * 
-	 * @param inputFile
-	 *            The resource handle representing the GEM input file.
-	 * @return void
-	 */
-	public static void doHbv(IFile inputFile) {
-
-		// Create our GEM directory to hold the generated log and executable
-		final String projectName = inputFile.getProject().getName();
-		final IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-
-		// Build up command line String
-		final String relativeLogFilePath = getLogfilePath(inputFile);
-		final IFile logFile = currentProject.getFile(new Path(relativeLogFilePath));
-		refreshProject(currentProject);
-
-		if (!logFile.exists()) {
-			showInformationDialog(Messages.GemUtilities_2);
-			if (doIspcc(inputFile) != -1) {
-				doIsp(inputFile);
-			}
-		}
-
-		final IFolder gemFolder = currentProject.getFolder(new Path("gem")); //$NON-NLS-1$
-		IPath fullLogFilePath = new Path(gemFolder.getLocationURI().getPath());
-		fullLogFilePath = fullLogFilePath.append(currentProject.getName()).removeFileExtension().addFileExtension("gem.log"); //$NON-NLS-1$
-
-		// Get the ispui.jar path from the preference store
-		final String hbvPath = GemPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.GEM_PREF_HBV_PATH);
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append(hbvPath);
-		stringBuffer.append(hbvPath == "" ? "" : "/"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		stringBuffer.append("ispUI "); //$NON-NLS-1$
-		stringBuffer.append(fullLogFilePath);
-		final String hbvCommand = stringBuffer.toString();
-		runCommandAsThread(hbvCommand);
-	}
-
-	/**
-	 * Runs ISP on the specified, profiled executable.
-	 * 
-	 * @param resource
-	 *            The resource representing the profiled executable.
-	 * @return void
-	 */
-	public static void doIsp(IResource resource) {
-
-		// Get all the current preferences
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		final boolean isRemote = (isRemoteProject(resource) || (isSynchronizedProject(resource) && isRemoteBuildConfiguration()));
-
-		// Create GEM directory to hold the generated log file and executable
-		final IProject currentProject = resource.getProject();
-		gemLogFile = currentProject.getFile(getLogfilePath(resource));
-		final IFolder gemFolder = currentProject.getFolder(new Path("gem")); //$NON-NLS-1$
-
-		// Build up the command line String
-		// Also generate the path for the log file to be created by ISP
-		IPath executablePath = null;
-		String resourceLocation = null;
-		String logFileLocation = null;
-		if (resource.getFileExtension().equals("gem")) { //$NON-NLS-1$
-			if (isSynchronizedProject(resource)) {
-				try {
-					resourceLocation = SyncConfigManager.getActiveSyncLocationURI(resource).getPath();
-					logFileLocation = SyncConfigManager.getActiveSyncLocationURI(gemFolder).getPath();
-				} catch (final CoreException e) {
-					logExceptionDetail(e);
-				}
-				executablePath = new Path(resourceLocation);
-			} else {
-				resourceLocation = resource.getLocationURI().getPath();
-				executablePath = new Path(resourceLocation);
-				logFileLocation = gemFolder.getLocationURI().getPath();
-			}
-		} else {
-			logFileLocation = gemFolder.getLocationURI().getPath();
-			executablePath = new Path(gemFolder.getLocationURI().getPath());
-			executablePath = executablePath.append(currentProject.getName()).removeFileExtension().addFileExtension("gem"); //$NON-NLS-1$
-		}
-
-		IPath logFilePath = new Path(logFileLocation);
-		logFilePath = logFilePath.append(currentProject.getName()).removeFileExtension().addFileExtension("gem.log"); //$NON-NLS-1$
-
-		final int numprocs = pstore.getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		int portnum = pstore.getInt(PreferenceConstants.GEM_PREF_PORTNUM);
-		final int reportnum = pstore.getInt(PreferenceConstants.GEM_PREF_REPORTNUM);
-		final boolean fibPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_FIB);
-		final boolean mpiCallsPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_MPICALLS);
-		final boolean openmpPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_OPENMP);
-		final boolean blockingSendsPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_BLOCK);
-		final boolean reportPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_REPORT);
-		final boolean unixSocketsPreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_UNIXSOCKETS);
-		final boolean verbosePreference = pstore.getBoolean(PreferenceConstants.GEM_PREF_VERBOSE);
-		final String hostName = pstore.getString(PreferenceConstants.GEM_PREF_HOSTNAME);
-
-		// Check for sync project
-		String ispExePath = pstore.getString(isRemote ? PreferenceConstants.GEM_PREF_REMOTE_ISPEXE_PATH
-				: PreferenceConstants.GEM_PREF_ISPEXE_PATH);
-		ispExePath += (ispExePath == "") ? "" : "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		final String cmdArgs = pstore.getString(PreferenceConstants.GEM_PREF_ARGS);
-
-		// Find an available port to use
-		boolean available = isPortAvailable(portnum);
-		while (!available) {
-
-			// keep ports <= 1024 available to the system
-			if (portnum < 1025) {
-				portnum = 9999;
-			}
-			portnum--;
-			available = isPortAvailable(portnum);
-		}
-
-		// Reset the default port on local machine
-		pstore.setValue(PreferenceConstants.GEM_PREF_PORTNUM, portnum);
-
-		// Build up command line String
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append(ispExePath);
-		stringBuffer.append("isp -n "); //$NON-NLS-1$
-		stringBuffer.append(numprocs);
-		stringBuffer.append(" -p "); //$NON-NLS-1$
-		stringBuffer.append(portnum);
-		stringBuffer.append(" "); //$NON-NLS-1$
-		stringBuffer.append((blockingSendsPreference) ? "-b " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((mpiCallsPreference) ? "-m " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((unixSocketsPreference) ? "-x " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((!hostName.trim().equals("")) ? "-h " : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		stringBuffer.append((!hostName.trim().equals("")) ? hostName + " " : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		stringBuffer.append((verbosePreference) ? "-O " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((openmpPreference) ? "-s " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((reportPreference) ? "-r " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((reportPreference) ? reportnum + " " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append((fibPreference) ? "-f " : ""); //$NON-NLS-1$ //$NON-NLS-2$
-		stringBuffer.append("-l "); //$NON-NLS-1$
-		stringBuffer.append(logFilePath);
-		stringBuffer.append(" "); //$NON-NLS-1$
-		stringBuffer.append(executablePath);
-		stringBuffer.append(" "); //$NON-NLS-1$
-		stringBuffer.append(cmdArgs);
-		// Now add command line options
-		final String ispCmd = stringBuffer.toString();
-
-		// Store the name of the child processes ISP will create
-		final String processName = executablePath.lastSegment();
-		pstore.setValue(PreferenceConstants.GEM_PREF_PROCESS_NAME, processName);
-
-		// Now run ISP
-		runCommand(ispCmd, true);
-
-		// Trigger a sync if the project is synchronized with remote build configuration
-		if (isRemote) {
-			sync();
-		}
-
-		// Sync the project with the underlying file system
-		refreshProject(currentProject);
-	}
-
-	/**
-	 * Compiles the specified file with ispcc (mpicc wrapper), which links
-	 * against the profiler (interposition layer) library.
-	 * 
-	 * @param resource
-	 *            The resource to compile.
-	 * @return int Returns 1 if everything went smoothly, -1 otherwise.
-	 */
-	public static int doIspcc(IResource resource) {
-		// Create GEM folder to hold the generated log file and executable
-		final IProject currentProject = resource.getProject();
-		final IFolder gemFolder = currentProject.getFolder(new Path("gem")); //$NON-NLS-1$
-		final boolean isRemote = (isRemoteProject(resource) || (isSynchronizedProject(resource) && isRemoteBuildConfiguration()));
-		if (!gemFolder.exists()) {
-			createGemFolder(isRemote, gemFolder);
-			refreshProject(currentProject);
-		}
-
-		// Build up command line String
-		IPath executablePath = new Path(gemFolder.getLocationURI().getPath());
-		executablePath = executablePath.append(currentProject.getName()).addFileExtension("gem"); //$NON-NLS-1$
-
-		// Determine if we need C or C++ ISP compile
-		final String fileExtension = resource.getFileExtension();
-		int exitValue = 0;
-		final StringBuffer stringBuffer = new StringBuffer();
-
-		// Deal with C compile
-		if (fileExtension.equals("c")) { //$NON-NLS-1$
-			final String ispccPath = GemPlugin
-					.getDefault()
-					.getPreferenceStore()
-					.getString(
-							(isRemoteProject(resource) ? PreferenceConstants.GEM_PREF_REMOTE_ISPCC_PATH
-									: PreferenceConstants.GEM_PREF_ISPCC_PATH));
-			stringBuffer.append(ispccPath);
-			stringBuffer.append(ispccPath == "" ? "" : "/"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			stringBuffer.append("ispcc -o "); //$NON-NLS-1$
-			stringBuffer.append(executablePath);
-			stringBuffer.append(" "); //$NON-NLS-1$
-			stringBuffer.append(resource.getLocationURI().getPath());
-			final String ispccStr = stringBuffer.toString();
-			exitValue = runCommand(ispccStr, true);
-		} else { // Deal with C++ compile
-			final String ispCppPath = GemPlugin.getDefault().getPreferenceStore()
-					.getString(
-							(isRemoteProject(resource) ? PreferenceConstants.GEM_PREF_REMOTE_ISPCPP_PATH
-									: PreferenceConstants.GEM_PREF_ISPCPP_PATH));
-			stringBuffer.append(ispCppPath);
-			stringBuffer.append((ispCppPath == "") ? "" : "/"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			stringBuffer.append("ispCC -o "); //$NON-NLS-1$
-			stringBuffer.append(executablePath);
-			stringBuffer.append(" "); //$NON-NLS-1$
-			stringBuffer.append(resource.getLocationURI().getPath());
-			final String ispCppStr = stringBuffer.toString();
-			exitValue = runCommand(ispCppStr, true);
-		}
-
-		return exitValue;
-	}
-
-	/**
-	 * Creates a log file from the specified resource.
-	 * 
-	 * @param resource
-	 *            The resource to process.
-	 * @param compile
-	 *            Whether or not to run ispcc script.
-	 * @param verify
-	 *            Whether or not to run ISP on the profiled executable.
-	 * @return void
-	 */
-	public static int generateLogFile(IResource resource, boolean compile, boolean verify) {
-
-		int exitStatus = 0;
-		if (compile && taskStatus != TaskStatus.ABORTED) {
-			exitStatus = doIspcc(resource);
-			if (exitStatus != -1 && taskStatus != TaskStatus.ABORTED) {
-				doIsp(resource);
-			}
-		} else if (verify && taskStatus != TaskStatus.ABORTED) {
-			doIsp(resource);
-		}
-
-		return exitStatus;
-	}
-
-	/**
-	 * Returns the current project being verified.
-	 * 
-	 * @param none
-	 * @return The current project being verified.
-	 */
-	public static IProject getCurrentProject() {
-		return gemActiveResource.getProject();
-	}
-
-	/**
-	 * Returns the current project being verified.
-	 * 
-	 * @param resource
-	 *            The active resource from the current project.
-	 * @return The current project being verified.
-	 */
-	public static IProject getCurrentProject(IResource resource) {
-		return resource.getProject();
-	}
-
-	/**
-	 * Returns a string representing the version of ISP being used.
-	 * 
-	 * @param none
-	 * @return String The captured String from stdout representing the version of ISP
-	 *         installed on the target machine.
-	 */
-	public static String getIspVersion() {
-		// Get the location of ISP
-		final boolean useRemoteISP = (isRemoteProject(gemActiveResource) || (isSynchronizedProject(gemActiveResource) && isRemoteBuildConfiguration()));
-		String ispExePath = GemPlugin
-				.getDefault()
-				.getPreferenceStore()
-				.getString(
-						useRemoteISP ? PreferenceConstants.GEM_PREF_REMOTE_ISPEXE_PATH : PreferenceConstants.GEM_PREF_ISPEXE_PATH);
-
-		// Run isp -v to get version number
-		ispExePath += (ispExePath == "") ? "" : "/"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		final String ispExeCommand = ispExePath + "isp -v"; //$NON-NLS-1$
-
-		// Abort if ISP is not installed
-		if (runCommand(ispExeCommand, false) == -1) {
-			return null;
-		}
-
-		// Parse first line of STDOUT from GEM Console if no errors, e.g. bad path
-		if (consoleStdOutMessage.contains("In-Situ Partial Order")) { //$NON-NLS-1$
-			final Scanner scanner = new Scanner(consoleStdOutMessage);
-			final String version = scanner.nextLine();
-			scanner.close();
-			final Pattern intraCbRegex = Pattern.compile("([0-9]+.[0-9]+.[0-9]+)$"); //$NON-NLS-1$
-			final Matcher versionMatcher = intraCbRegex.matcher(version);
-			if (versionMatcher.find()) {
-				return versionMatcher.group(1);
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns a String representation of the path to the log file that will be
-	 * generated. This path will be relative to the gem directory (as the base).
-	 * 
-	 * e.g. gem/project-name.gem.log
-	 * 
-	 * @param inputFile
-	 *            The resource handle to get the project location from.
-	 * @return String The relative path of the log file to be generated.
-	 */
-	public static String getLogfilePath(IResource resource) {
-		// Create GEM folder to hold the generated log file and executable
-		final String projectName = resource.getProject().getName();
-		final IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		final IPath gemFolderPath = new Path("gem"); //$NON-NLS-1$
-		final IFolder gemFolder = currentProject.getFolder(gemFolderPath);
-
-		final boolean isRemote = (isRemoteProject(resource) || (isSynchronizedProject(resource) && isRemoteBuildConfiguration()));
-		if (!gemFolder.exists()) {
-			createGemFolder(isRemote, gemFolder);
-			refreshProject(currentProject);
-		}
-
-		// Build up the correct project relative path for the log file
-		IPath logFilePath = gemFolderPath.append(currentProject.getName()).removeFileExtension();
-		logFilePath = logFilePath.addFileExtension("gem.log"); //$NON-NLS-1$
-
-		return logFilePath.toString();
-	}
-
-	/**
-	 * Returns the path of the last used file relative to the workspace from the
-	 * PreferenceStore of this plug-in. This will be a String representation of
-	 * the URI for the most recent file accessed by this plug-in.
-	 * 
-	 * @param none
-	 * @return String A String representation of the URI for the most recently
-	 *         accessed file.
-	 */
-	public static URI getMostRecentURI() {
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		URI location = null;
-		try {
-			location = new URI(pstore.getString(PreferenceConstants.GEM_PREF_MOST_RECENT_FILE));
-		} catch (final URISyntaxException e) {
-			logExceptionDetail(e);
-		}
-		return location;
-	}
-
-	/**
-	 * Returns the generated log file for the current project being verified.
-	 * 
-	 * @param none
-	 * @return IFile The log file for the current project being verified.
-	 */
-	public static IFile getProjectLogFile() {
-		return gemLogFile;
-	}
-
-	/**
-	 * Returns the IRemoteFileManager for the specified project resource.
-	 * 
-	 * @param projectResource
-	 *            The IResource object to get the IRemoteFileManager for.
-	 * @return IRemoteFileManager The IRemoteFileManager for the specified
-	 *         project resource.
-	 */
-	public static IRemoteFileService getRemoteFileManager(IFile projectResource) {
-		final URI projectURI = projectResource.getProject().getLocationURI();
-		final IRemoteServicesManager servicesManager = GemPlugin.getService(IRemoteServicesManager.class);
-		final IRemoteConnectionType connType = servicesManager.getConnectionType(projectURI);
-		if (connType != null) {
-			final IRemoteConnection connection = connType.getConnection(projectURI);
-			if (connection != null) {
-				return connection.getService(IRemoteFileService.class);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the RemoteProcessBuilder associated with the connection
-	 * used by the specified remote project.
-	 * 
-	 * @param currentProject
-	 *            The project for which we need the connection.
-	 * @param args
-	 *            The command line arguments for the RemoteProcessBuilder to be
-	 *            used.
-	 * @return IRemoteProcessBuilder The RemoteProcessBuilder object associated
-	 *         with the connection used by the specified remote project.
-	 */
-	public static IRemoteProcessBuilder getRemoteProcessBuilder(IProject currentProject, String[] args) {
-		URI projectURI = null;
-		if (isSynchronizedProject(gemActiveResource)) {
-			try {
-				projectURI = SyncConfigManager.getActiveSyncLocationURI(currentProject);
-			} catch (final CoreException e) {
-				logExceptionDetail(e);
-			}
-		} else {
-			projectURI = currentProject.getLocationURI();
-		}
-
-		final IRemoteServicesManager servicesManager = GemPlugin.getService(IRemoteServicesManager.class);
-		final IRemoteConnectionType connType = servicesManager.getConnectionType(projectURI);
-		if (connType != null) {
-			final IRemoteConnection connection = connType.getConnection(projectURI);
-			if (connection != null) {
-				final IRemoteProcessService procService = connection.getService(IRemoteProcessService.class);
-				if (procService != null)
-					return procService.getProcessBuilder(args);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns a handle to the file with the specified name in the current project.
-	 * 
-	 * @param fullPath
-	 *            The string representation of the full path to a file contained
-	 *            within the current project.
-	 * @param resource
-	 *            A resource within the current project (can be the current
-	 *            project itself).
-	 * @return IFile The handle to the member file in the current project.
-	 */
-	public static IFile getSourceFile(String fullPath, IResource resource) {
-
-		final IProject currentProject = resource.getProject();
-
-		// if (true) {
-		if (!isSynchronizedProject(currentProject) && !isRemoteProject(resource)) {
-			final String currentProjectPath = currentProject.getLocationURI().getPath();
-			IPath sourceFilePath = new Path(fullPath);
-			sourceFilePath = sourceFilePath.makeRelativeTo(new Path(currentProjectPath));
-			final IFile sourceFile = currentProject.getFile(sourceFilePath);
-			return sourceFile;
-		}
-
-		final String[] args = fullPath.split("/", -1); //$NON-NLS-1$
-		final String name = args[args.length - 1];
-		return currentProject.getFile(name);
-	}
-
-	/**
-	 * Returns the handle to the source files form the specified logFile path.
-	 * This method will be used when GEM is run on an existing executable and
-	 * the source file necessary to populate the Analyzer code windows is
-	 * needed.
-	 * 
-	 * @param logFile
-	 *            The resource handle representing the log file.
-	 * @return String The handle to the first source file found in the log file.
-	 */
-	public static IFile getSourceFilePathFromLog(IFile logFile) {
-
-		Scanner scanner = null;
-		InputStream logFileStream = null;
-		String sourceFilePathInfo = ""; //$NON-NLS-1$
-
-		if (!logFile.exists()) {
-			refreshProject(logFile.getProject());
-		}
-
-		// Scan the second line of the log file for first source file name
-		try {
-			logFileStream = logFile.getContents(true);
-		} catch (final CoreException e) {
-			logExceptionDetail(e);
-		}
-
-		// If the log file is empty
-		scanner = new Scanner(logFileStream);
-		if (!scanner.hasNextLine()) {
-			if (taskStatus != TaskStatus.ABORTED) {
-				GemUtilities.showErrorDialog(Messages.GemUtilities_4);
-			}
-			scanner.close();
-			return null;
-		}
-
-		// Skip the line holding the number of processes
-		scanner.nextLine();
-
-		// If ISP exited out without processing any MPI Calls
-		if (!scanner.hasNextLine()) {
-			GemUtilities.showErrorDialog(Messages.GemUtilities_5);
-			scanner.close();
-			return null;
-		}
-
-		// Grab the path string for the source file form the log file line
-		sourceFilePathInfo = scanner.nextLine();
-		final String[] elements = sourceFilePathInfo.split(" ", -1); //$NON-NLS-1$
-		sourceFilePathInfo = elements[elements.length - 2];
-		final IFile sourceFile = getSourceFile(sourceFilePathInfo, logFile);
-
-		// Close the InputStream
-		try {
-			if (logFileStream != null) {
-				logFileStream.close();
-			}
-		} catch (final IOException e) {
-			logExceptionDetail(e);
-		} finally {
-			scanner.close();
-		}
-
-		return sourceFile;
-	}
-
-	/*
-	 * Returns whether or not the correct version of ISP is installed on the
-	 * host machine (to support GEM operations). When version changes, be sure
-	 * to update the corresponding entry in messages package!
-	 */
-	private static boolean hasCorrectIspVersion() {
-		final String ispVersion = getIspVersion();
-		if (ispVersion == null) {
-			return false;
-		}
-		final StringTokenizer st = new StringTokenizer(ispVersion, ".", false); //$NON-NLS-1$
-		st.nextToken();
-		final int majorVersionNum = Integer.parseInt(st.nextToken());
-		// final int minorVersionNum = Integer.parseInt(st.nextToken());
-
-		// we need a compatible version of ISP, e.g. v0.3.0+
-		if (majorVersionNum == 3) {
-			return true;
-		}
-
-		showErrorDialog(Messages.GemUtilities_7);
-		return false;
-	}
-
-	/**
-	 * Activates appropriate GEM views and launches necessary operations.
-	 * 
-	 * @param resource
-	 *            The resource obtained from the project to be processed.
-	 * @param compile
-	 *            Performs necessary compilation if true. If false, the compile
-	 *            step is skipped.
-	 * @param verify
-	 *            Performs necessary verification if true. If false, the
-	 *            verification step is skipped.
-	 * @return void
-	 */
-	public static void initGemViews(IResource resource, boolean compile, boolean verify) {
-
-		gemActiveResource = adaptResource(resource);
-		doCompile = compile;
-		doVerify = verify;
-
-		if (taskStatus == TaskStatus.ACTIVE) {
-			showInformationDialog(Messages.GemUtilities_6);
-			return;
-		}
-
-		final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-
-		// Tell the Analyzer where to find the source and log files
-		final IViewPart gemViewPart = window.getActivePage().findView(GemAnalyzer.ID);
-		analyzer = (GemAnalyzer) gemViewPart;
-		// Clear the Analyzer view in case we're doing a repeated run
-		analyzer.clear();
-		analyzer.init(gemActiveResource);
-
-		// Tell the Browser where to find the source and log files
-		final IViewPart browserPart = window.getActivePage().findView(GemBrowser.ID);
-		browser = (GemBrowser) browserPart;
-		// Clear the Browser view in case we're doing a repeated run
-		browser.clear();
-		browser.init();
-
-		// Initialize the console
-		final IViewPart consolePart = window.getActivePage().findView(GemConsole.ID);
-		console = (GemConsole) consolePart;
-		console.init();
-
-		// Create and parse log file, pass transitions to Browser & Analyzer
-		final Thread initGemViewsThread = new Thread() {
-			@Override
-			public void run() {
-				taskStatus = TaskStatus.ACTIVE;
-
-				final boolean isLogFile = gemActiveResource.getFileExtension().equals("log"); //$NON-NLS-1$
-				// If not a log file, check for ISP installation and version
-				if (!isLogFile) {
-
-					// Check for correct version of ISP on the target machine
-					if (!hasCorrectIspVersion()) {
-						cancelAnalysis();
-						return;
-					}
-
-					// Run ispcc and/or isp and check for creation of the log file
-					if (generateLogFile(gemActiveResource, doCompile, doVerify) == -1) {
-						cancelAnalysis();
-						showErrorDialog(Messages.GemUtilities_3);
-						return;
-					}
-				}
-
-				if (taskStatus == TaskStatus.ACTIVE) {
-					IFile logFile = null;
-					IFile sourceFile = null;
-
-					// If it's a log file, that's all we're interested in
-					if (isLogFile) {
-						gemLogFile = gemActiveResource;
-						logFile = gemLogFile;
-					} else {
-						logFile = gemLogFile;
-					}
-					if (logFile == null) {
-						cancelAnalysis();
-						showErrorDialog(Messages.GemUtilities_14);
-						return;
-					}
-
-					Transitions transitions = null;
-					transitions = initTransitions(logFile);
-					sourceFile = getSourceFilePathFromLog(logFile);
-
-					if (transitions == null || sourceFile == null) {
-						// Note: Error message issued in getSourceFilePathFromLog()
-						cancelAnalysis();
-						return;
-					}
-					if (analyzer != null) {
-						analyzer.update(sourceFile, transitions);
-					}
-					if (browser != null) {
-						browser.update(transitions);
-					}
-					if (console != null) {
-						console.cancel();
-					}
-					taskStatus = TaskStatus.IDLE;
-
-					// Activate the correct view based on preference settings
-					final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-					final String activeView = pstore.getString(PreferenceConstants.GEM_ACTIVE_VIEW);
-					if (activeView.equals(PreferenceConstants.GEM_ANALYZER)) {
-						analyzer.activate();
-					} else if (activeView.equals(PreferenceConstants.GEM_BROWSER)) {
-						browser.activate();
-					}
-					else {
-						console.activate();
-					}
-				}
-			}
-		};
-
-		initGemViewsThread.start();
-	}
-
-	/*
-	 * Just a wrapper method that returns a newly created Transitions object.
-	 */
-	private static Transitions initTransitions(IFile logFile) {
-		try {
-			return new Transitions(logFile);
-		} catch (final ParseException e) {
-			logExceptionDetail(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Checks if the current task has been aborted.
-	 * 
-	 * @param none
-	 * @return boolean True if task was aborted, false otherwise.
-	 */
-	public static boolean isAborted() {
-		return taskStatus == TaskStatus.ABORTED;
-	}
-
-	/*
-	 * Helper method Returns true if the specified port number is available,
-	 * false otherwise.
-	 */
-	private static boolean isPortAvailable(int portNum) {
-		try {
-			ServerSocket srv = new ServerSocket(portNum);
-			srv.close();
-			srv = null;
-			return true;
-		} catch (final IOException e) {
-			return false;
-		}
-	}
-
-	/**
-	 * Returns whether or not the current project has active resources yet.
-	 * 
-	 * @param none
-	 * @return boolean Ture if the current project has active resource, false otherwise.
-	 */
-	public static boolean isProjectActive() {
-		return gemActiveResource != null;
-	}
-
-	//
-	private static boolean isRemoteBuildConfiguration() {
-
-		final IProject project = getCurrentProject(gemActiveResource);
-		URI buildLocation = null;
-		try {
-			buildLocation = SyncConfigManager.getActiveSyncLocationURI(project);
-		} catch (final CoreException e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-		final URI projectLocation = project.getLocationURI();
-
-		return !buildLocation.equals(projectLocation);
-	}
-
-	/**
-	 * Returns whether or not the current project being verified by GEM is
-	 * remote. Uses the specified resource.
-	 * 
-	 * @param resource
-	 *            The IResource object for which to check the NATURE_ID.
-	 * @return boolean True if the current project being verified by GEM is
-	 *         remote, false otherwise.
-	 */
-	public static boolean isRemoteProject(IResource resource) {
-		return false; // Remote projects are no longer used
-	}
-
-	/**
-	 * Returns whether or not the current project being verified by GEM is
-	 * synchronized. Uses the specified resource.
-	 * 
-	 * @param resource
-	 *            The current project member resource for which to get the enclosing project to check the NATURE_ID.
-	 * @return boolean True if the current project being verified by GEM is
-	 *         synchronized, false otherwise.
-	 */
-	public static boolean isSynchronizedProject(IResource resource) {
-		boolean isSync = false;
-		try {
-			isSync = getCurrentProject(resource).hasNature(RemoteSyncNature.NATURE_ID);
-		} catch (final CoreException e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-		return isSync;
-	}
-
-	/*
-	 * Kills the child processes spawned from the global process object and then
-	 * forcibly closes the global process object. This would be, for example
-	 * multiple processes created from running ISP via the runtime instance.
-	 */
-	private static void killProcesses() {
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		final String processName = pstore.getString(PreferenceConstants.GEM_PREF_PROCESS_NAME);
-		final String command = "pkill " + processName; //$NON-NLS-1$
-		final IProject currentProject = getCurrentProject(gemActiveResource);
-		final boolean isRemote = isRemoteProject(gemActiveResource)
-				|| (isSynchronizedProject(gemActiveResource) && isRemoteBuildConfiguration());
-
-		if (isRemote) {
-			final String[] args = command.split(" ", -1); //$NON-NLS-1$
-			final IRemoteProcessBuilder rpb = getRemoteProcessBuilder(currentProject, args);
-			try {
-				remoteProcess = rpb.start();
-			} catch (final IOException e) {
-				logExceptionDetail(e);
-			}
-			try {
-				remoteProcess = rpb.start();
-			} catch (final IOException e) {
-				logExceptionDetail(e);
-			} finally {
-				if (remoteProcess != null) {
-					try {
-						remoteProcess.waitFor();
-					} catch (final InterruptedException e) {
-						logExceptionDetail(e);
-					}
-					remoteProcess.destroy();
-				}
-				if (remoteProcess != null) {
-					remoteProcess.destroy();
-				}
-			}
-		} else {
-			Process killProc = null;
-			try {
-				killProc = Runtime.getRuntime().exec(command);
-			} catch (final IOException e) {
-				logExceptionDetail(e);
-			} finally {
-				if (killProc != null) {
-					try {
-						killProc.waitFor();
-					} catch (final InterruptedException e) {
-						logExceptionDetail(e);
-					}
-					killProc.destroy();
-				}
-				if (process != null) {
-					process.destroy();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Logs the specified error using the Eclipse error logging mechanism. Log
-	 * entries are placed in the org.eclipse.ptp.gem log file and will show up
-	 * in the Eclipse Error Log View.
-	 * 
-	 * @param message
-	 *            The error message to log.
-	 * @param exception
-	 *            The Exception that occurred.
-	 * @return void
-	 */
-	public static void logError(String message, Throwable exception) {
-		final IStatus status = new Status(IStatus.ERROR, GemPlugin.PLUGIN_ID, IStatus.ERROR, message, exception);
-		GemPlugin.getDefault().getLog().log(status);
-	}
-
-	/**
-	 * Bundles the specified Exception with a standard message and passes this
-	 * information to the Eclipse logging mechanism via this classes logError
-	 * method.
-	 * 
-	 * @param e
-	 *            The exception to log error information for.
-	 * @return void
-	 */
-	public static void logExceptionDetail(Exception e) {
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append(Messages.GemUtilities_1);
-		stringBuffer.append("\""); //$NON-NLS-1$
-		stringBuffer.append(GemPlugin.PLUGIN_ID);
-		stringBuffer.append("\"."); //$NON-NLS-1$
-		GemUtilities.logError(stringBuffer.toString(), e);
-	}
-
-	/**
-	 * Refreshes the specified project. This helps in synchronizing the project
-	 * with the local file system after new resource creation.
-	 * 
-	 * @param project
-	 *            This resource, and all its children will be refreshed.
-	 * @return void
-	 */
-	public static void refreshProject(final IProject project) {
-		try {
-			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-		} catch (final CoreException e) {
-			logExceptionDetail(e);
-		}
-	}
-
-	/*
-	 * Prompts an input dialog asking the user what command line arguments they
-	 * want used and stores the result. The default value shown is the last used
-	 * value.
-	 */
-	private static void requestCommandLineArgs() {
-		final String message = Messages.GemUtilities_28;
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		final String prevArgs = pstore.getString(PreferenceConstants.GEM_PREF_ARGS);
-		final String newArgs = JOptionPane.showInputDialog(null, message, prevArgs);
-		if (newArgs != null) {
-			pstore.setValue(PreferenceConstants.GEM_PREF_ARGS, newArgs);
-		}
-	}
-
-	/**
-	 * Executes the specified command via a native runtime process instance.
-	 * 
-	 * @param command
-	 *            The command to send to the Runtime instance.
-	 * @param verbose
-	 *            Writes output to the Gem Console if true, silent otherwise.
-	 * @return int Returns 1 if everything went smoothly, -1 otherwise.
-	 */
-	public static int runCommand(String command, boolean verbose) {
-
-		// Find out if the current project is local or remote
-		final IProject currentProject = getCurrentProject(gemActiveResource);
-		final boolean isRemote = isRemoteProject(gemActiveResource)
-				|| (isSynchronizedProject(gemActiveResource) && isRemoteBuildConfiguration());
-
-		try {
-			final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-			final StringBuffer stringBuffer = new StringBuffer();
-			String stdOut = ""; //$NON-NLS-1$
-			String stdOutResult = ""; //$NON-NLS-1$
-			String stdErr = ""; //$NON-NLS-1$
-			String stdErrResult = ""; //$NON-NLS-1$
-
-			// Check if the current project is remote
-			if (isRemote) {
-				final String[] args = command.split(" ", -1); //$NON-NLS-1$
-				final IRemoteProcessBuilder rpb = getRemoteProcessBuilder(currentProject, args);
-				remoteProcess = rpb.start();
-			} else {
-				process = Runtime.getRuntime().exec(command);
-			}
-
-			final BufferedReader stdOutReader = new BufferedReader(new InputStreamReader(
-					isRemote ? remoteProcess.getInputStream() : process.getInputStream()));
-			final BufferedReader stdErrReader = new BufferedReader(new InputStreamReader(
-					isRemote ? remoteProcess.getErrorStream() : process.getErrorStream()));
-			consoleStdOutMessage = ""; //$NON-NLS-1$
-			consoleStdErrMessage = ""; //$NON-NLS-1$
-
-			// Clear the console if the preference is set
-			final boolean clearConsole = pstore.getBoolean(PreferenceConstants.GEM_PREF_CLRCON);
-			if (clearConsole) {
-				console.clear();
-			}
-
-			// Try breaks when the process is terminated prematurely
-			try {
-				// read the process input stream
-				while ((isRemote ? remoteProcess != null : process != null) && (stdOut = stdOutReader.readLine()) != null
-						&& taskStatus == TaskStatus.ACTIVE) {
-					stringBuffer.append(stdOut);
-					stringBuffer.append("\n"); //$NON-NLS-1$
-					consoleStdOutMessage += stdOut + "\n"; //$NON-NLS-1$
-					if (!stdOutReader.ready()) {
-						updateConsole(verbose, true);
-						consoleStdOutMessage = ""; //$NON-NLS-1$
-					}
-				}
-
-				stdOutResult = stringBuffer.toString();
-
-				// cleanup, send last few lines
-				updateConsole(verbose, true);
-
-				// read the process error stream
-				stringBuffer.setLength(0);
-				while ((isRemote ? remoteProcess != null : process != null) && (stdErr = stdErrReader.readLine()) != null
-						&& taskStatus == TaskStatus.ACTIVE) {
-					stringBuffer.append(stdErr);
-					stringBuffer.append("\n"); //$NON-NLS-1$
-					consoleStdErrMessage += ""; //stdErr + "\n"; //$NON-NLS-1$
-
-					if (!stdErrReader.ready()) {
-						updateConsole(verbose, true);
-						consoleStdErrMessage = ""; //$NON-NLS-1$
-					}
-				}
-
-				stdErrResult = stringBuffer.toString();
-
-				// cleanup, send last few lines
-				updateConsole(verbose, true);
-			} catch (final Exception e) {
-				logExceptionDetail(e);
-				return -1;
-			}
-
-			consoleStdOutMessage = stdOutResult;
-			consoleStdErrMessage = stdErrResult;
-
-			if (isRemote ? remoteProcess == null : process == null) {
-				return -1;
-			}
-
-			return consoleStdErrMessage.contains("ld returned 1 exit status") ? -1 : 1; //$NON-NLS-1$
-
-		} catch (final IOException e) { // thrown when ISP is not installed
-			final StringTokenizer st = new StringTokenizer(command);
-			String commandName = st.nextToken();
-			commandName = new Path(commandName).lastSegment().toString();
-			showErrorDialog(Messages.GemUtilities_8 + "\"" + commandName + "\"" + "\n" + Messages.GemUtilities_13); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		} catch (final Exception e) {
-			logExceptionDetail(e);
-		}
-		return -1;
-	}
-
-	/**
-	 * Runs the specified command as a thread via the Runtime instance.
-	 * 
-	 * @param command
-	 *            The command to run as a thread via the Runtime instance.
-	 * @return void
-	 */
-	public static void runCommandAsThread(String command) {
-		final CommandThread thread = new CommandThread(command);
-		thread.run();
-	}
-
-	/**
-	 * Saves the URI of the last used file to the preference store. This URI
-	 * will be represented as a String in the preference store.
-	 * 
-	 * @param mostRecentURI
-	 *            The URI of the last used file in the currently used workspace.
-	 * @return void
-	 */
-	public static void saveMostRecentURI(URI mostRecentURI) {
-		final String mostRecentURIStr = mostRecentURI.toString();
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		pstore.setValue(PreferenceConstants.GEM_PREF_MOST_RECENT_FILE, mostRecentURIStr);
-	}
-
-	/**
-	 * Writes the contents of the GEM console to the indicated local file.
-	 * 
-	 * @param file
-	 *            The local file to write the specified content to.
-	 * @param content
-	 *            The content to write to the specified local file.
-	 * @return void
-	 */
-	public static void saveToLocalFile(File file, String content) {
-		BufferedWriter writer = null;
-		try {
-			writer = new BufferedWriter(new FileWriter(file.getCanonicalPath()));
-			content.replaceAll("\n", System.getProperty("line.separator")); //$NON-NLS-1$ //$NON-NLS-2$
-			writer.write(content);
-		} catch (final IOException e) {
-			logExceptionDetail(e);
-		} finally {
-			if (writer != null) {
-				try {
-					writer.close();
-				} catch (final IOException e) {
-					logExceptionDetail(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Used to pass command line arguments to the profiled executable during a
-	 * verification run. If the GEM_PREF_REQUEST_ARGS preference is set,
-	 * GEM_PREF_REQUEST_ARGS requestCommandLineArgs is called to get the command
-	 * line arguments. Otherwise the command line arguments are simply set to
-	 * "".
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public static void setCommandLineArgs() {
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		if (pstore.getBoolean(PreferenceConstants.GEM_PREF_REQUEST_ARGS)) {
-			requestCommandLineArgs();
-		} else {
-			pstore.setValue(PreferenceConstants.GEM_PREF_ARGS, ""); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Sets the number of processes for the next run of GEM. Updates the drop
-	 * down list boxes in the GEM views if they are open.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public static void setNumProcesses() {
-		final Shell shell = Display.getCurrent().getActiveShell();
-		final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-		Integer numProcs = pstore.getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		final String title = Messages.GemUtilities_9;
-		final String message = Messages.GemUtilities_10;
-		final InputDialog dlg = new InputDialog(shell, title, message, numProcs.toString(), new NumProcsValidator());
-		Window.setDefaultImage(GemPlugin.getImageDescriptor("icons/processes.gif").createImage()); //$NON-NLS-1$
-		dlg.open();
-
-		// This avoids a UI event loop exception
-		if (dlg.getReturnCode() == Window.CANCEL) {
-			return;
-		}
-
-		numProcs = Integer.parseInt(dlg.getValue());
-		pstore.setValue(PreferenceConstants.GEM_PREF_NUMPROCS, dlg.getValue());
-
-		// Update the drop down in the Analyzer
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		final IViewPart gemViewPart = window.getActivePage().findView(GemAnalyzer.ID);
-		if (gemViewPart != null) {
-			final GemAnalyzer analyzer = (GemAnalyzer) gemViewPart;
-			analyzer.updateDropDown();
-		}
-
-		// Update the drop down in the Issue Browser
-		window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		final IViewPart browserViewPart = window.getActivePage().findView(GemBrowser.ID);
-		if (browserViewPart != null) {
-			final GemBrowser browser = (GemBrowser) browserViewPart;
-			browser.updateDropDown();
-		}
-	}
-
-	/**
-	 * Sets the current task status to the specified state.
-	 * 
-	 * @param state
-	 *            The state to assign the current task status.
-	 * @return void
-	 */
-	public static void setTaskStatus(TaskStatus state) {
-		taskStatus = state;
-	}
-
-	/**
-	 * Simply opens an error message dialog with the specified String.
-	 * 
-	 * @param message
-	 *            The message body.
-	 * @return void
-	 */
-	public static void showErrorDialog(String message) {
-		final String title = Messages.GemUtilities_11;
-		JOptionPane.showMessageDialog(null, message, title, JOptionPane.ERROR_MESSAGE);
-	}
-
-	/**
-	 * Simply open an ExceptionDetailsDialog for the specified exception.
-	 * 
-	 * @param message
-	 *            The message body for the exception dialog.
-	 * @param e
-	 *            The exception title.
-	 * @return void
-	 */
-	public static void showExceptionDialog(String message, Exception e) {
-		showErrorDialog(message);
-		e.printStackTrace();
-	}
-
-	/**
-	 * Simply opens a dialog with the specified String.
-	 * 
-	 * @param message
-	 *            The message body for the information dialog.
-	 * @return void
-	 */
-	public static void showInformationDialog(String message) {
-		final String title = Messages.GemUtilities_12;
-		JOptionPane.showMessageDialog(null, message, title, JOptionPane.INFORMATION_MESSAGE);
-	}
-
-	// Triggers a blocking remote-2-local sync.
-	private static void sync() {
-		final IProgressMonitor monitor = new NullProgressMonitor();
-		final IProject project = getCurrentProject(gemActiveResource);
-		try {
-			SyncManager.syncBlocking(null, project, SyncFlag.BOTH, monitor);
-		} catch (final CoreException e) {
-			logExceptionDetail(e);
-		}
-	}
-
-	/**
-	 * Clears and shuts down all GEM views then forcibly terminates the shared
-	 * Process object associated with this class and all its children. This
-	 * prevents destroying a process after it has finished, but before the
-	 * termination buttons have been deactivated.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public static void terminateOperation() {
-		if (taskStatus != TaskStatus.IDLE) {
-			taskStatus = TaskStatus.ABORTED;
-			analyzer.clear();
-			browser.clear();
-			console.cancel();
-			console.writeStdErr(Messages.GemConsole_11 + "\n"); //$NON-NLS-1$
-			killProcesses();
-		}
-	}
-
-	/*
-	 * Starts the updateGemConsoleThread which writes STDOUT and STDERR to the
-	 * GEM Console.
-	 */
-	private static void updateConsole(boolean verbose, boolean showConsole) {
-		if (verbose && showConsole) {
-			try {
-				Display.getDefault().syncExec(updateGemConsoleThread);
-			} catch (final Exception e) {
-				logExceptionDetail(e);
-			}
-		}
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/InternalIssueOrderSorter.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/InternalIssueOrderSorter.java
deleted file mode 100644
index 205c669..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/InternalIssueOrderSorter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.util.Comparator;
-
-/**
- * java.lang.Comparator: int compare(Envelope env1, env2)
- * 
- * This method compares two Envelopes (env1 and env2) by internal issue order.
- * (Integer) casts are made to use the Integer class autobox/unbox feature as
- * well as its compareTo() method.
- * 
- * Returned int value has the following meanings:
- * 
- * 1. positive: env1 is greater than env2 2. zero: env1 equals to env2 3.
- * negative: env1 is less than env2
- */
-public class InternalIssueOrderSorter implements Comparator<Envelope> {
-
-	/**
-	 * Compares the two Envelopes passed in by Issue Order.
-	 * 
-	 * @param env1
-	 *            The first Envelope.
-	 * @param env2
-	 *            The second Envelope.
-	 * @return int The comparison of the two parameters... positive: env1 is
-	 *         greater than env2, zero: env1 equals to env2 negative: env1 is
-	 *         less than env2
-	 */
-	public int compare(Envelope env1, Envelope env2) {
-		if (env1.getIssueIndex() == -1 && env2.getIssueIndex() == -1) {
-			return ((Integer) env1.getOrderIndex()).compareTo(env2.getOrderIndex());
-		} else if (env1.getIssueIndex() == -1) {
-			return 1;
-		} else if (env2.getIssueIndex() == -1) {
-			return -1;
-		} else {
-			return ((Integer) env1.getIssueIndex()).compareTo(env2.getIssueIndex());
-		}
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ListElement.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ListElement.java
deleted file mode 100644
index 736595f..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ListElement.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import org.eclipse.core.resources.IFile;
-
-public class ListElement {
-
-	private final IFile file;
-	private final String listEntry;
-	private final int lineNumber;
-	private final boolean isCollective;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param file
-	 *            The file resource for this ListElement.
-	 * @param listEntry
-	 *            The full String representing this ListElement's data.
-	 * @param lineNumber
-	 *            The associated line number in this ListElement's file resource
-	 * @param isCollective
-	 *            Whether or not this ListElement is a collective operation.
-	 */
-	public ListElement(IFile file, String listEntry, int lineNumber, boolean isCollective) {
-		this.file = file;
-		this.listEntry = listEntry;
-		this.lineNumber = lineNumber;
-		this.isCollective = isCollective;
-	}
-
-	/**
-	 * Checks whether or not this ListElement is equal to the specified element.
-	 * 
-	 * @param otherListELement
-	 *            The ListItem to compare with this ListItem.
-	 * @return boolean True if this ListElement is equal to the other, false
-	 *         otherwise.
-	 */
-	public boolean equals(ListElement otherListELement) {
-		return (this.file.equals(otherListELement.file)
-				&& this.listEntry.equals(otherListELement.listEntry) && this.lineNumber == otherListELement.lineNumber);
-	}
-
-	/**
-	 * Returns the file resource for this ListElement.
-	 * 
-	 * @param none
-	 * @return IFile The file resource.
-	 */
-	public IFile getFile() {
-		return this.file;
-	}
-
-	/**
-	 * Returns the line number in the associated file resource for this
-	 * ListElement.
-	 * 
-	 * @param none
-	 * @return int The line number.
-	 */
-	public int getLineNumber() {
-		return this.lineNumber;
-	}
-
-	/**
-	 * Returns the full String representing this ListElement's data.
-	 * 
-	 * @param none
-	 * @return String The list entry.
-	 */
-	public String getListEntry() {
-		return this.listEntry;
-	}
-
-	/**
-	 * Returns whether or not the call associated with the list entry in this
-	 * ListElement is a collective or not.
-	 * 
-	 * @param none
-	 * @return boolean True if the call associated with the list entry in this
-	 *         ListElement is a collective, false otherwise.
-	 */
-	public boolean isCollective() {
-		return this.isCollective;
-	}
-
-	/**
-	 * Returns the string representation of this ListElement.
-	 * 
-	 * @param none
-	 * @return String The string representation of this ListElement.
-	 */
-	@Override
-	public String toString() {
-		return this.listEntry;
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/NumProcsValidator.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/NumProcsValidator.java
deleted file mode 100644
index 4d1eca8..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/NumProcsValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-
-/**
- * A simple validator for the NumProcs InputDialog.
- */
-public class NumProcsValidator implements IInputValidator {
-
-	public String isValid(String newText) {
-		int num = -1;
-		try {
-			num = Integer.parseInt(newText);
-
-		} catch (final NumberFormatException nfe) {
-			return Messages.NumProcsValidator_0;
-		}
-		if (num < 1) {
-			return Messages.NumProcsValidator_1;
-		}
-		if (num > 32) {
-			return Messages.NumProcsValidator_2;
-		}
-
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ProgramOrderSorter.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ProgramOrderSorter.java
deleted file mode 100644
index dfead48..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/ProgramOrderSorter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.util.Comparator;
-
-/**
- * java.lang.Comparator: int compare(Envelope env1, env2)
- * 
- * This method compares two Envelopes (env1 and env2) by program order.
- * (Integer) casts are made to use the Integer class autobox/unbox feature as
- * well as its compareTo() method.
- * 
- * Returned int value has the following meanings:
- * 
- * 1. positive: env1 is greater than env2 2. zero: env1 equals to env2 3.
- * negative: env1 is less than env2
- */
-public class ProgramOrderSorter implements Comparator<Envelope> {
-
-	/**
-	 * Compares the two Envelopes passed in by Program order.
-	 * 
-	 * @param env1
-	 *            The first Envelope.
-	 * @param env2
-	 *            The second Envelope.
-	 * @return int The comparison of the two parameters... positive: env1 is
-	 *         greater than env2, zero: env1 equals to env2 negative: env1 is
-	 *         less than env2
-	 */
-	public int compare(Envelope env1, Envelope env2) {
-		if (env1.getOrderIndex() == env2.getOrderIndex()) {
-			if (env1.getRank() != env2.getRank()) {
-				return ((Integer) env1.getRank()).compareTo(env2.getRank());
-			}
-			return ((Integer) env1.getIndex()).compareTo(env2.getIndex());
-		}
-		return ((Integer) env1.getOrderIndex()).compareTo(env2.getOrderIndex());
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Transitions.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Transitions.java
deleted file mode 100644
index f329fbf..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/util/Transitions.java
+++ /dev/null
@@ -1,905 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.util;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Scanner;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-
-/**
- * This class represents all information for each MPI call (transition) in every
- * interleaving explored. This is the central source of information used by all
- * components within GEM.
- */
-public class Transitions {
-
-	private final ArrayList<ArrayList<Envelope>> transitionList;
-	private final ArrayList<HashMap<String, Envelope>> errorCalls;
-	private HashMap<Integer, String> irrelevantBarriers;
-	private HashMap<Integer, Envelope> resourceLeaks;
-	private HashMap<Integer, String> typeMismatches;
-	private ArrayList<Integer> deadlockInterleavings;
-	private int numRanks;
-	public int currentInterleaving;
-	public int currentTransitionIndex;
-	private int deadlockIndex;
-	private boolean deadlock;
-	private boolean assertionViolation;
-	private boolean resourceLeak;
-	private boolean fib;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param logFile
-	 *            The Resource representing the log file to parse.
-	 * @throws ParseException
-	 */
-	public Transitions(IFile logFile) throws ParseException {
-		this.transitionList = new ArrayList<ArrayList<Envelope>>();
-		this.errorCalls = new ArrayList<HashMap<String, Envelope>>();
-		this.irrelevantBarriers = null;
-		this.resourceLeaks = null;
-		this.typeMismatches = null;
-
-		// Add null as padding so we can be one-based later
-		this.errorCalls.add(null);
-
-		this.numRanks = -1;
-		this.deadlock = false;
-		this.assertionViolation = false;
-		this.resourceLeak = false;
-		parseLogFile(logFile);
-	}
-
-	/**
-	 * Moves to the deadlock interleaving, or if there are multiple
-	 * interleavings, it cycles through all.
-	 * 
-	 * @param none
-	 * @return boolean True if the operation was successful, false otherwise.
-	 */
-	synchronized public boolean deadlockInterleaving() {
-
-		if (!this.deadlock) {
-			return false;
-		}
-
-		this.currentInterleaving = this.deadlockInterleavings.get(this.deadlockIndex) - 1;
-		this.currentTransitionIndex = -1;
-
-		// This is to cycle through the deadlock interleavings
-		this.deadlockIndex++;
-		this.deadlockIndex = this.deadlockIndex % this.deadlockInterleavings.size();
-		return true;
-	}
-
-	/**
-	 * Returns a list of all envelopes involved in the collective call held in
-	 * the Envelope that is passed in.
-	 * 
-	 * @param env
-	 *            The Envelope holding the collective call.
-	 * @return ArrayList<Envelope> A list of all Envelopes involved with that
-	 *         call.
-	 */
-	// TODO This is not currently being used
-	public ArrayList<Envelope> getCollectiveTransitions(Envelope env) {
-		if (env.getIssueIndex() < 0) {
-			return null;
-		}
-
-		return env.getCommunicator_matches();
-	}
-
-	/**
-	 * Returns the interleaving current being displayed.
-	 * 
-	 * @param none
-	 * @return int The current interleaving.
-	 */
-	public int getCurrentInterleaving() {
-		return this.currentInterleaving + 1;
-	}
-
-	/**
-	 * Returns the Envelope involved with the current transition.
-	 * 
-	 * @param none
-	 * @return Envelope The current Envelope in the current interleaving.
-	 */
-	synchronized public Envelope getCurrentTransition() {
-		if (this.currentInterleaving < 0
-				|| this.currentInterleaving >= this.transitionList.size()
-				|| this.currentTransitionIndex < 0
-				|| this.currentTransitionIndex >= this.transitionList.get(this.currentInterleaving).size()) {
-			return null;
-		}
-
-		return this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex);
-	}
-
-	/**
-	 * Returns the index of the current transition.
-	 * 
-	 * @param none
-	 * @return int The current transition index.
-	 */
-	public int getCurrentTransitionIndex() {
-		return this.currentTransitionIndex;
-	}
-
-	/**
-	 * Returns the list of deadlock interleavings.
-	 * 
-	 * @param none
-	 * @return ArrayList<Integer> The list of deadlock interleavings.
-	 */
-	public ArrayList<Integer> getDeadlockInterleavings() {
-		return this.deadlockInterleavings;
-	}
-
-	/**
-	 * Returns the list of HashMaps containing Envelopes involved in the error.
-	 * There may be multiple maps due to multiple errors in separate
-	 * interleavings.
-	 * 
-	 * @param none
-	 * @return ArrayList<HashMap<String, Envelope>> The list of HashMaps
-	 *         containing Envelopes involved in program errors.
-	 */
-	public ArrayList<HashMap<String, Envelope>> getErrorCalls() {
-		return this.errorCalls;
-	}
-
-	/**
-	 * Walks the appropriate list to the first transition for the specified rank
-	 * in the current interleaving.
-	 * 
-	 * @param rank
-	 *            The rank for which to find the first.
-	 * @return Envelope The first Envelope in the current interleaving for the
-	 *         specified rank.
-	 */
-	synchronized public Envelope getFirstTransition(int rank) {
-
-		boolean valid = true;
-		if (rank < 0 || rank > this.numRanks) {
-			valid = false;
-		}
-		final int size = this.transitionList.get(this.currentInterleaving).size();
-		for (int i = 0; i < size; i++) {
-			final Envelope env = this.transitionList.get(this.currentInterleaving).get(i);
-			if (!valid || env.getRank() == rank) {
-				this.currentTransitionIndex = i;
-				return env;
-			}
-		}
-		return null;
-
-	}
-
-	/**
-	 * Returns an ArrayList of all envelopes in the interleaving that is passed
-	 * in.
-	 * 
-	 * @param interleaving
-	 *            An integer representing the desired interleaving (1-based).
-	 * @return ArrayList<Envelope> The ArrayList of all envelopes in the
-	 *         specified interleaving.
-	 */
-	public ArrayList<Envelope> getInterleavingEnvelopes(int interleaving) {
-		if (interleaving < 1 || interleaving > getTotalInterleavings()) {
-			return null;
-		}
-
-		return this.transitionList.get(interleaving - 1); // 0-based
-	}
-
-	/**
-	 * Returns the list of the interleavings listing the calls pertaining to
-	 * Irrelevant barriers.
-	 * 
-	 * @param none
-	 * @return HashMap<Integer, String> The unique set of irrelevant barriers.
-	 */
-	public HashMap<Integer, String> getIrrelevantBarriers() {
-		return this.irrelevantBarriers;
-	}
-
-	/**
-	 * Walks the appropriate list to the last transition for the specified rank
-	 * in the current interleaving.
-	 * 
-	 * @param rank
-	 *            The rank to find the last transition for.
-	 * @return Envelope The last Envelope in the current interleaving for the
-	 *         specified rank.
-	 */
-	synchronized public Envelope getLastTransition(int rank) {
-		boolean valid = true;
-		if (rank < 0 || rank > this.numRanks) {
-			valid = false;
-		}
-		final int size = this.transitionList.get(this.currentInterleaving).size() - 1;
-		for (int i = size; i >= 0; i--) {
-			final Envelope env = this.transitionList.get(this.currentInterleaving).get(i);
-			if (!valid || env.getRank() == rank) {
-				this.currentTransitionIndex = i;
-				return env;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the envelope that matches with the envelope passed in.
-	 * 
-	 * @param env
-	 *            The Envelope whose match we are requesting.
-	 * @return Envelope The Envelope that matches, or null if there is no match.
-	 */
-	public Envelope getMatchingTransition(Envelope env) {
-		if (env.getIssueIndex() < 0) {
-			return null;
-		}
-
-		return env.getMatch_envelope();
-	}
-
-	/**
-	 * Finds the next transition for the specified rank in the current
-	 * interleaving.
-	 * 
-	 * @param rank
-	 *            The rank of the next Envelope to find.
-	 * @return Envelope The next Envelope in the current interleaving for the
-	 *         specified rank.
-	 */
-	synchronized public Envelope getNextTransition(int rank) {
-		if (this.currentTransitionIndex + 1 >= this.transitionList.get(this.currentInterleaving).size()) {
-			return null;
-		}
-
-		// If the rank is invalid, treat it as any rank can advance.
-		if (rank < 0 || rank >= this.numRanks) {
-			this.currentTransitionIndex++;
-			return this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex);
-		}
-
-		final int end = this.transitionList.get(this.currentInterleaving).size();
-		for (int i = this.currentTransitionIndex + 1; i < end; i++) {
-			final Envelope e = this.transitionList.get(this.currentInterleaving).get(i);
-			if (e.getRank() == rank) {
-				this.currentTransitionIndex = i;
-				return e;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the number of ranks used.
-	 * 
-	 * @param none
-	 * @return int The number of ranks used.
-	 */
-	public int getNumRanks() {
-		return this.numRanks;
-	}
-
-	/**
-	 * Finds the previous transition for the specified rank in the current
-	 * interleaving.
-	 * 
-	 * @param rank
-	 *            The rank to find the previous transition for.
-	 * @return Envelope The previous Envelope in the current interleaving for
-	 *         the specified rank.
-	 */
-	synchronized public Envelope getPreviousTransition(int rank) {
-		if (this.currentTransitionIndex <= 0) {
-			return null;
-		}
-
-		// If the rank is invalid, treat it as if any rank can be changed.
-		if (rank < 0 || rank >= this.numRanks) {
-			this.currentTransitionIndex--;
-			return this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex);
-		}
-
-		for (int i = this.currentTransitionIndex - 1; i >= 0; i--) {
-			final Envelope env = this.transitionList.get(this.currentInterleaving).get(i);
-			if (env.getRank() == rank) {
-				this.currentTransitionIndex = i;
-				return env;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Observes the current envelope and discovers which ranks are involved with
-	 * it at this moment.
-	 * 
-	 * @param total
-	 *            The integer array containing all ranks involved.
-	 * @return String The String representing the ranks of those involved with
-	 *         the current call.
-	 */
-	public String getRanksInvolved(int totalRanksInvolved[]) {
-		final Envelope currentEnvelope = this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex);
-		final int rank = currentEnvelope.getRank();
-		String result = Integer.toString(rank);
-		final int currentLineNumber = currentEnvelope.getLinenumber();
-
-		// We can safely assume that we are currently on the 1st iteration
-		int i = this.currentTransitionIndex;
-		final int size = this.transitionList.get(this.currentInterleaving).size();
-		int numRanksInvloved = 1;
-
-		// start at next envelope
-		for (i++; i < size; i++) {
-			final Envelope env = this.transitionList.get(this.currentInterleaving).get(i);
-			if (currentLineNumber == env.getLinenumber()) {
-				numRanksInvloved++;
-				result += "," + env.getRank(); //$NON-NLS-1$
-			} else {
-				break;
-			}
-		}
-
-		totalRanksInvolved[0] = numRanksInvloved;
-		return result;
-	}
-
-	/**
-	 * Returns and HashMap of Envelopes that holds each envelope that contains
-	 * a resource leak.
-	 * 
-	 * @param none
-	 * @return HashMap<Integer, Envelope> The set of resource leaks.
-	 */
-	public HashMap<Integer, Envelope> getResourceLeaks() {
-		return this.resourceLeaks;
-	}
-
-	/**
-	 * Returns the number of interleavings found for this source file.
-	 * 
-	 * @param none
-	 * @return int The total number of interleavings.
-	 */
-	public int getTotalInterleavings() {
-		return this.transitionList.size();
-	}
-
-	/**
-	 * Returns an ArrayList of ArrayLists of Envelopes. Each ArrayList
-	 * corresponds to a particular interleaving, and holds envelopes
-	 * representing individual MPI call transitions.
-	 * 
-	 * @param none
-	 * @return ArrayList<ArrayList<Envelope>> List representing each MPI Call in
-	 *         each possible interleaving.
-	 */
-	public ArrayList<ArrayList<Envelope>> getTransitionList() {
-		return this.transitionList;
-	}
-
-	/**
-	 * Returns the list of the interleavings listing the calls pertaining to MPI
-	 * type mismatches.
-	 * 
-	 * @param none
-	 * @return HashMap<Integer, String>The unique set of MPI type mismatches.
-	 */
-	public HashMap<Integer, String> getTypeMismatches() {
-		return this.typeMismatches;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not there is an assertion.
-	 * violation.
-	 * 
-	 * @param none
-	 * @return boolean True if there was an assertion violation, false
-	 *         otherwise.
-	 */
-	public boolean hasAssertion() {
-		return this.assertionViolation;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not there is a deadlock.
-	 * 
-	 * @param none
-	 * @return boolean True if there was a deadlock, false otherwise.
-	 */
-	public boolean hasDeadlock() {
-		return this.deadlock;
-	}
-
-	/**
-	 * Returns whether or not the transition list contains an error.
-	 * 
-	 * @param none
-	 * @return boolean True for an error, false otherwise.
-	 */
-	public boolean hasError() {
-		if (this.assertionViolation || this.deadlock) {
-			return true;
-		}
-		final Iterator<HashMap<String, Envelope>> itr = this.errorCalls.iterator();
-		while (itr.hasNext()) {
-			final HashMap<String, Envelope> currentHash = itr.next();
-			if (currentHash != null && !currentHash.isEmpty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns whether or not a functionally irrelevant barrier was detected.
-	 * 
-	 * @param none
-	 * @return boolean True if a functionally irrelevant barrier was detected, false otherwise.
-	 */
-	public boolean hasFIB() {
-		return this.fib;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not there is a next
-	 * interleaving from the currentInterleaving.
-	 * 
-	 * @param none
-	 * @return boolean True if there is a next interleaving, false otherwise.
-	 */
-	synchronized public boolean hasNextInterleaving() {
-		return this.currentInterleaving + 1 < this.transitionList.size();
-	}
-
-	/**
-	 * Returns true if there is a next transition, false otherwise.
-	 * 
-	 * @param none
-	 * @return boolean True if the current interleaving has a next transition,
-	 *         false otherwise.
-	 */
-	synchronized public boolean hasNextTransition() {
-		return this.currentTransitionIndex + 1 < this.transitionList.get(
-				this.currentInterleaving).size();
-	}
-
-	/**
-	 * Returns a boolean representing whether or not there is a previous
-	 * interleaving from the currentInterleaving.
-	 * 
-	 * @param none
-	 * @return boolean True if there is a previous interleaving, false
-	 *         otherwise.
-	 */
-	synchronized public boolean hasPreviousInterleaving() {
-		return this.currentInterleaving != 0;
-	}
-
-	/**
-	 * Returns true if there is a previous transition, false otherwise.
-	 * 
-	 * @param none
-	 * @return boolean True if the current interleaving has a previous
-	 *         transition, false otherwise.
-	 */
-	// TODO This is not currently being used
-	public boolean hasPreviousTransition() {
-		return this.currentTransitionIndex > 0;
-	}
-
-	/**
-	 * Returns a boolean representing whether or not a resource leak was detected.
-	 * 
-	 * @param none
-	 * @return boolean True if a resource leak was detected, false otherwise.
-	 */
-	public boolean hasResourceLeak() {
-		return this.resourceLeak;
-	}
-
-	/**
-	 * Returns true if there is a next non-repetitive transition, false
-	 * otherwise.
-	 * 
-	 * @param none
-	 * @return boolean True if the current interleaving has a valid next
-	 *         transition, false otherwise.
-	 */
-	synchronized public boolean hasValidNextTransition(int rank) {
-		if (this.currentTransitionIndex == -1) {
-			try {
-				this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex + 1);
-				return true;
-			} catch (final Exception e) {
-				return false;
-			}
-		}
-		int tempIndex = this.currentTransitionIndex;
-		while (tempIndex < this.transitionList.get(this.currentInterleaving).size()) {
-			final int line1 = this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex).getLinenumber();
-			final int line2 = this.transitionList.get(this.currentInterleaving).get(tempIndex).getLinenumber();
-			if (line1 == line2) {
-				tempIndex++;
-				continue;
-			} else if (rank == -1 || this.transitionList.get(this.currentInterleaving).get(tempIndex).getRank() == rank) {
-				return true;
-			}
-			tempIndex++;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns true if there is a non-repetitive previous transition, false
-	 * otherwise.
-	 * 
-	 * @param none
-	 * @return boolean True if the current interleaving has a valid previous
-	 *         transition, false otherwise.
-	 */
-	public boolean hasValidPreviousTransition(int rank) {
-		int tempIndex = this.currentTransitionIndex - 1;
-		while (tempIndex >= 0) {
-			final int line1 = this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex).getLinenumber();
-			final int line2 = this.transitionList.get(this.currentInterleaving).get(tempIndex).getLinenumber();
-			final boolean collective = this.transitionList.get(this.currentInterleaving).get(this.currentTransitionIndex)
-					.isCollective();
-			if (line1 == line2 && rank == -1 && collective) {
-				tempIndex--;
-				continue;
-			} else if (rank == -1 || this.transitionList.get(this.currentInterleaving).get(tempIndex).getRank() == rank) {
-				return true;
-			}
-			tempIndex--;
-		}
-		return false;
-	}
-
-	/*
-	 * This is where the bulk of the p2p and collective matching gets done.
-	 */
-	private void parseLogFile(IFile logFile) {
-		final HashMap<String, Envelope> p2pMatches = new HashMap<String, Envelope>();
-		final HashMap<String, ArrayList<Envelope>> collectiveMatches = new HashMap<String, ArrayList<Envelope>>();
-		final HashMap<Integer, Integer> issueOrders = new HashMap<Integer, Integer>();
-		final ArrayList<HashMap<String, Integer>> collectiveCount = new ArrayList<HashMap<String, Integer>>();
-		Scanner scanner = null;
-		String line = null;
-		int interleaving = -1;
-		boolean fileReadSuccess = false;
-
-		try {
-			scanner = new Scanner(logFile.getContents());
-
-			// Check for empty log file
-			if (!scanner.hasNextLine()) {
-				return;
-			}
-
-			line = scanner.nextLine();
-
-			try {
-				this.numRanks = Integer.parseInt(line);
-				fileReadSuccess = true;
-			} catch (final NumberFormatException e) {
-				GemUtilities.logExceptionDetail(e);
-			}
-			if (fileReadSuccess) {
-				for (int i = 0; i < this.numRanks; i++) {
-					collectiveCount.add(new HashMap<String, Integer>());
-				}
-			}
-
-			while (scanner.hasNext()) {
-				// If the analysis has been aborted then stop parsing
-				if (GemUtilities.isAborted()) {
-					return;
-				}
-
-				// Check if we're processing warnings at the end of the log file
-				if (!line.startsWith("[")) { //$NON-NLS-1$
-					line = scanner.nextLine();
-				}
-
-				// identify the deadlock interleavings
-				if (line.endsWith("DEADLOCK")) { //$NON-NLS-1$
-					if (this.deadlockInterleavings == null) {
-						this.deadlock = true;
-						this.deadlockInterleavings = new ArrayList<Integer>();
-						this.deadlockIndex = 0;
-					}
-					final StringTokenizer st = new StringTokenizer(line);
-					this.deadlockInterleavings.add(Integer.parseInt(st.nextToken()));
-					continue;
-				}
-
-				// If this line indicates FIB, process all of them
-				if (line.equalsIgnoreCase("[FIB]")) { //$NON-NLS-1$
-					this.fib = true;
-					this.irrelevantBarriers = new HashMap<Integer, String>();
-					line = scanner.nextLine();
-
-					// Marks end of FIB list
-					while (!line.equals("") && !line.startsWith("[")) { //$NON-NLS-1$ //$NON-NLS-2$
-						final StringTokenizer st = new StringTokenizer(line);
-						st.nextToken();
-						final int lineNumber = Integer.parseInt(st.nextToken());
-						this.irrelevantBarriers.put(lineNumber, line);
-
-						// See if this is the end of the log file.
-						if (!scanner.hasNextLine()) {
-							break;
-						}
-						line = scanner.nextLine();
-					}
-					continue;
-				}
-
-				// If this line indicates TYPE MISMATCH, process all of them
-				if (line.equalsIgnoreCase("[TYPEMISMATCH]")) { //$NON-NLS-1$
-					this.typeMismatches = new HashMap<Integer, String>();
-					line = scanner.nextLine();
-
-					// Marks end of FIB list
-					while (!line.equals("") && !line.startsWith("[")) { //$NON-NLS-1$ //$NON-NLS-2$
-						final StringTokenizer st = new StringTokenizer(line);
-						st.nextToken();
-						final int lineNumber = Integer.parseInt(st.nextToken());
-						this.typeMismatches.put(lineNumber, line);
-
-						// See if this is the end of the log file.
-						if (!scanner.hasNextLine()) {
-							break;
-						}
-						line = scanner.nextLine();
-					}
-					continue;
-				}
-
-				final Envelope env = Envelope.parse(line);
-				if (env == null) {
-					throw new ParseException(line, interleaving);
-					// continue;
-				} else if (env.isAssertion()) {
-					this.assertionViolation = true;
-					env.setInterleaving((interleaving < 0) ? 1 : interleaving);
-				} else if (env.getFunctionName() == "MPI_assert") { //$NON-NLS-1$
-					if (scanner.hasNext()) {
-						scanner.nextLine();
-					}
-				} else if (env.isLeak()) {
-					if (this.resourceLeaks == null) {
-						this.resourceLeak = true;
-						this.resourceLeaks = new HashMap<Integer, Envelope>();
-					}
-					this.resourceLeaks.put(env.getLinenumber(), env);
-				}
-
-				// Advance to the next interleaving if needed. Also need to
-				// clear all the data structures.
-				if (env.getInterleaving() != interleaving) {
-					// add a transition list for the interleaving
-					this.transitionList.add(new ArrayList<Envelope>());
-					interleaving = env.getInterleaving();
-					this.errorCalls.add(interleaving, null);
-					for (int j = 0; j < this.numRanks; j++) {
-						collectiveCount.get(j).clear();
-					}
-					p2pMatches.clear();
-					collectiveMatches.clear();
-				}
-
-				/*
-				 * Check for calls that were not issued and add them to the
-				 * interleaving's HashMap in the error list. However, leaks
-				 * should not be added!
-				 */
-				if (env.getIssueIndex() == -1 && !env.isLeak()) {
-					if (this.errorCalls.get(interleaving) == null) {
-						this.errorCalls.add(interleaving, new HashMap<String, Envelope>());
-					}
-					final String key = env.getFunctionName() + env.getFilePath() + env.getLinenumber();
-					this.errorCalls.get(interleaving).put(key, env);
-				}
-
-				/*
-				 * If we have already seen the issue orders, set to -1, meaning
-				 * not issued.
-				 */
-				if (issueOrders.containsKey(env.getIssueIndex())) {
-					env.setIssueIndex(-1);
-				} else {
-					issueOrders.put(env.getIssueIndex(), 0);
-				}
-
-				/*
-				 * See if there is a P2P match - the HashMap contains the
-				 * Envelope's interleaving, rank, and index. If there is a
-				 * match, then store it in the envelope. This is so we don't
-				 * have to search through everything later when we need the
-				 * match.
-				 */
-				if (env.getMatch_index() >= 0 && env.getMatch_rank() >= 0) {
-					final String p2pMatchString = env.getInterleaving() + "_" + env.getMatch_rank() + "_" + env.getMatch_index(); //$NON-NLS-1$ //$NON-NLS-2$
-					if (p2pMatches.containsKey(p2pMatchString)) {
-						final Envelope match = p2pMatches.get(p2pMatchString);
-						env.pairWithEnvelope(match);
-						if (env.getFunctionName() != "MPI_Probe" && env.getFunctionName() != "MPI_Iprobe") { //$NON-NLS-1$ //$NON-NLS-2$
-							p2pMatches.remove(p2pMatchString);
-						}
-					} else {
-						p2pMatches.put(env.getInterleaving() + "_" + env.getRank() + "_" + env.getIndex(), env); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-
-				/*
-				 * Next, see if there is a collective match. Also, don't want to
-				 * match for communicators of size one, since there will be
-				 * nothing to add.
-				 */
-				if (env.isCommunicator_set() && env.getCommunicator_ranks().size() > 1
-						&& env.getCommunicator_ranks_string() != null) {
-					int count;
-					String collective = env.getFunctionName() + " " + env.isCommunicator_set(); //$NON-NLS-1$
-					if (collectiveCount.get(env.getRank()).containsKey(collective)) {
-						count = collectiveCount.get(env.getRank()).get(collective);
-					} else {
-						count = 0;
-					}
-					collectiveCount.get(env.getRank()).put(collective, count + 1);
-
-					// Now see if there are others with the same collective.
-					collective = env.getFunctionName() + " " + count + " " + env.getCommunicator_ranks_string(); //$NON-NLS-1$ //$NON-NLS-2$
-					if (collectiveMatches.containsKey(collective)) {
-						final ArrayList<Envelope> matches = collectiveMatches.get(collective);
-						for (final Envelope e : matches) {
-							env.addCollectiveMatch(e);
-						}
-						matches.add(env);
-
-						// See if we have all of the matches, and if so, remove.
-						if (matches.size() == env.getCommunicator_ranks()
-								.size()) {
-							collectiveMatches.remove(collective);
-						}
-					} else {
-						final ArrayList<Envelope> matches = new ArrayList<Envelope>();
-						matches.add(env);
-						collectiveMatches.put(collective, matches);
-					}
-				}
-
-				// Add to the list, but if this is a resource leak DO NOT
-				if (!env.isLeak()) {
-					this.transitionList.get(this.transitionList.size() - 1).add(env);
-				}
-			}
-
-			// If no transitions found in the interleaving, add at least one.
-			if (this.transitionList.size() == 0) {
-				this.transitionList.add(new ArrayList<Envelope>());
-			}
-
-			// Sort the transitions if the preference is enabled.
-			final String str = GemPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.GEM_PREF_STEP_ORDER);
-			final int size = this.transitionList.size();
-			if (str.equals("issueOrder")) { //$NON-NLS-1$
-				// Sort by internal issue order
-				for (int k = 0; k < size; k++) {
-					Collections.sort(this.transitionList.get(k), new InternalIssueOrderSorter());
-				}
-			} else {
-				// Sort by program order
-				for (int l = 0; l < size; l++) {
-					Collections.sort(this.transitionList.get(l), new ProgramOrderSorter());
-				}
-			}
-			this.currentInterleaving = 0;
-			this.currentTransitionIndex = -1;
-
-		} catch (final CoreException ce) {
-			GemUtilities.logExceptionDetail(ce);
-		} catch (final ParseException pe) {
-			GemUtilities.logExceptionDetail(pe);
-		} finally {
-			if (scanner != null) {
-				scanner.close();
-			}
-		}
-	}
-
-	/**
-	 * Sets the envelope involved with the current transition to the one
-	 * specified.
-	 * 
-	 * @param none
-	 * @return Envelope Null if it didn't make sense to place the specified
-	 *         Envelope, the Envelope otherwise.
-	 */
-	// TODO This is not currently being used
-	synchronized public Envelope setCurrentTransition(Envelope env) {
-		if (env == null) {
-			return null;
-		}
-
-		if (env.getInterleaving() - 1 < 0 || env.getInterleaving() - 1 >= this.transitionList.size()) {
-			return null;
-		}
-
-		for (int i = 0; i < this.transitionList.get(env.getInterleaving() - 1).size(); i++) {
-			if (this.transitionList.get(env.getInterleaving() - 1).get(i) == env) {
-				this.currentInterleaving = env.getInterleaving() - 1;
-				this.currentTransitionIndex = i;
-				return env;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Moves to the next interleaving.
-	 * 
-	 * @param none
-	 * @return boolean True if the operation was successful, false otherwise.
-	 */
-	synchronized public boolean setNextInterleaving() {
-
-		if (this.currentInterleaving + 1 >= this.transitionList.size()) {
-			return false;
-		}
-
-		this.currentInterleaving++;
-		this.currentTransitionIndex = -1;
-		return true;
-	}
-
-	/**
-	 * Moves to the previous interleaving.
-	 * 
-	 * @param none
-	 * @return boolean True if the operation was successful, false otherwise.
-	 */
-	synchronized public boolean setPreviousInterleaving() {
-		if (this.currentInterleaving == 0) {
-			return false;
-		}
-
-		this.currentInterleaving--;
-		this.currentTransitionIndex = -1;
-		return true;
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemAnalyzer.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemAnalyzer.java
deleted file mode 100644
index 81c515f..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemAnalyzer.java
+++ /dev/null
@@ -1,2091 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.views;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.Scanner;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.util.Envelope;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ptp.internal.gem.util.InternalIssueOrderSorter;
-import org.eclipse.ptp.internal.gem.util.ListElement;
-import org.eclipse.ptp.internal.gem.util.ProgramOrderSorter;
-import org.eclipse.ptp.internal.gem.util.Transitions;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The GEM Analyzer View.
- */
-public class GemAnalyzer extends ViewPart {
-
-	// Listens for double-clicks and jumps to that line of code in the editor
-	private class DoubleClickListener implements IDoubleClickListener {
-
-		public void doubleClick(DoubleClickEvent event) {
-			final ISelection selection = event.getSelection();
-			final StructuredSelection structure = (StructuredSelection) selection;
-			final ListElement element = (ListElement) structure.getFirstElement();
-			if (element != null) {
-				final IFile sourceFile = element.getFile();
-				final int lineNumber = element.getLineNumber();
-				openEditor(lineNumber, sourceFile);
-			}
-		}
-	}
-
-	// The ID for this view
-	public static final String ID = "org.eclipse.ptp.gem.views.GemAnalyzer"; //$NON-NLS-1$
-
-	// Data structures and more complex members
-	private Transitions transitions;
-	private LinkedList<Shell> activeShells;
-
-	// Container objects and viewers
-	private Composite parent;
-	private ListViewer leftViewer;
-	private ListViewer rightViewer;
-	private Action getHelp;
-	private Action terminateButton;
-
-	// Simple members
-	private int numRanks;
-	private int lockedRank;
-	private IFile currLeftFile;
-	private IFile currRightFile;
-
-	// SWT Buttons
-	private Button firstTransitionButton;
-	private Button previousTransitionButton;
-	private Button nextTransitionButton;
-	private Button lastTransitionButton;
-	private Button firstInterleavingButton;
-	private Button previousInterleavingButton;
-	private Button nextInterleavingButton;
-	private Button lastInterleavingButton;
-	private Button deadlockInterleavingButton;
-	private Button internalIssueOrderButton;
-	private Button programOrderButton;
-	private Button launchHpvButton;
-	private Button browseCallsButton;
-	private Button runGemButton;
-	private Combo lockRanksComboList;
-	private Combo setNumProcsComboList;
-
-	// Groups that need to be accessed multiple times
-	private Group interleavingsGroup;
-	private Group transitionsGroup;
-	private Group stepOrderGroup;
-
-	// SWT Labels
-	private Label errorMessageLabel;
-	private Label leftCodeWindowLabel;
-	private Label rightCodeWindowLabel;
-	private CLabel leftCodeWindowExplenationLabel;
-	private CLabel rightCodeWindowExplenationLabel;
-
-	// Used for the transition label
-	private int transitionLabelIndex;
-	private int transitionLabelCount;
-
-	// Things for highlighting the appropriate line in the code windows
-	private int leftIndex;
-	private int rightIndex;
-	private int previousLeftIndex;
-
-	// Listeners for the code viewers
-	private SelectionListener singleListener;
-	private DoubleClickListener doubleListener;
-
-	// The active file resource needed for various operations
-	private IFile activeFile;
-
-	// Threads
-	private Thread analyzerUpdateThread;
-	private Thread clearAnalyzerThread;
-	private Thread disableTerminateButtonThread;
-
-	// Misc
-	private int leftLines;
-	private int rightLines;
-	private boolean aborted;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param none
-	 */
-	public GemAnalyzer() {
-		this.lockedRank = -1;
-		this.aborted = false;
-	}
-
-	/**
-	 * Brings this ViewPart to the front and gives it focus.
-	 * 
-	 * @param none
-	 * @return none
-	 */
-	public void activate() {
-		final Thread activationThread = new Thread() {
-			@Override
-			public void run() {
-				final IWorkbench wb = PlatformUI.getWorkbench();
-				final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-				if (page != null) {
-					page.activate(GemAnalyzer.this);
-				}
-			}
-		};
-
-		// We need to switch to the thread that is allowed to change the UI
-		Display.getDefault().syncExec(activationThread);
-	}
-
-	/**
-	 * Runs a thread that clears the Analyzer view.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void clear() {
-		Display.getDefault().syncExec(this.clearAnalyzerThread);
-		this.aborted = false;
-	}
-
-	/*
-	 * Calls finer grained methods, populating the view action bar.
-	 */
-	private void contributeToActionBars() {
-		final IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createCodeWindowsGroup(Composite parent) {
-		// Get images for buttons from image cache
-		final Image sourceCallImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/source-call.gif")); //$NON-NLS-1$
-		final Image matchCallImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/match-call.gif")); //$NON-NLS-1$
-
-		// Create the layout for the Analyzer windows and call info labels
-		final Group codeWindowsGroup = new Group(parent, SWT.NONE | SWT.SHADOW_IN);
-		codeWindowsGroup.setText(Messages.GemAnalyzer_0);
-		final GridLayout codeWindowsLayout = new GridLayout();
-		codeWindowsLayout.numColumns = 2;
-		codeWindowsLayout.marginHeight = 10;
-		codeWindowsLayout.marginWidth = 10;
-		codeWindowsLayout.horizontalSpacing = 15;
-		codeWindowsGroup.setLayout(codeWindowsLayout);
-		codeWindowsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-		// Create code window labels and their respective layouts, etc.
-		final String newline = System.getProperty("line.separator"); //$NON-NLS-1$
-		this.leftCodeWindowLabel = new Label(codeWindowsGroup, SWT.WRAP);
-		this.leftCodeWindowLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
-		final Font leftCodeWindowLabelFont = setFontSize(this.leftCodeWindowLabel.getFont(), 9);
-		this.leftCodeWindowLabel.setFont(leftCodeWindowLabelFont);
-		this.leftCodeWindowLabel.setText(newline);
-		this.rightCodeWindowLabel = new Label(codeWindowsGroup, SWT.WRAP);
-		this.rightCodeWindowLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
-		final Font rightCodeWindowLabelFont = setFontSize(this.rightCodeWindowLabel.getFont(), 9);
-		this.rightCodeWindowLabel.setFont(rightCodeWindowLabelFont);
-		this.rightCodeWindowLabel.setText(newline);
-
-		// The short explanations of each of the code windows
-		this.leftCodeWindowExplenationLabel = new CLabel(codeWindowsGroup, SWT.WRAP | SWT.NULL);
-		this.rightCodeWindowExplenationLabel = new CLabel(codeWindowsGroup, SWT.WRAP | SWT.NULL);
-		this.leftCodeWindowExplenationLabel.setImage(sourceCallImage);
-		this.rightCodeWindowExplenationLabel.setImage(matchCallImage);
-		this.leftCodeWindowExplenationLabel.setText(Messages.GemAnalyzer_1);
-		this.rightCodeWindowExplenationLabel.setText(Messages.GemAnalyzer_2);
-
-		// Create the Analyzer list viewers
-		this.leftViewer = new ListViewer(codeWindowsGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		this.rightViewer = new ListViewer(codeWindowsGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		final Font leftViewerFont = setFontSize(this.leftViewer.getControl().getFont(), 8);
-		final Font rightViewerFont = setFontSize(this.rightViewer.getControl().getFont(), 8);
-		this.leftViewer.getControl().setFont(leftViewerFont);
-		this.rightViewer.getControl().setFont(rightViewerFont);
-		this.leftViewer.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-		this.rightViewer.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-		/*
-		 * Create two listeners for these viewers. SelectionListener is to
-		 * prevent user from changing the selected line. DoubleListener maps
-		 * selected line to the editor view
-		 */
-		this.singleListener = new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				final org.eclipse.swt.widgets.List list = (org.eclipse.swt.widgets.List) e.getSource();
-				final String entry = list.getItem(0).toString();
-
-				// Determine if collective call clicked in the Right Viewer
-				if (!entry.contains(Messages.GemAnalyzer_3) || !entry.contains(Messages.GemAnalyzer_4)) {
-					updateSelectedLine(false);
-				}
-			}
-		};
-
-		// SelectionListener prevents user from changing selected viewer line
-		this.doubleListener = new DoubleClickListener();
-		this.leftViewer.getList().addSelectionListener(this.singleListener);
-		this.rightViewer.getList().addSelectionListener(this.singleListener);
-		this.leftViewer.addDoubleClickListener(this.doubleListener);
-		this.rightViewer.addDoubleClickListener(this.doubleListener);
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createInterleavingsGroup(Composite parent) {
-		// Get images for buttons from image cache
-		final Image firstItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/first-item.gif")); //$NON-NLS-1$
-		final Image lastItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/last-item.gif")); //$NON-NLS-1$
-		final Image prevItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/prev-item.gif")); //$NON-NLS-1$
-		final Image nextItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/next-item.gif")); //$NON-NLS-1$
-		final Image deadlockImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/deadlock.gif")); //$NON-NLS-1$
-
-		// Group and FormLayout data for interleaving buttons and labels
-		this.interleavingsGroup = new Group(parent, SWT.SHADOW_IN);
-		this.interleavingsGroup.setText(Messages.GemAnalyzer_5);
-		this.interleavingsGroup.setToolTipText(Messages.GemAnalyzer_6);
-		final FormData interleavingsFormData = new FormData();
-		interleavingsFormData.bottom = new FormAttachment(100, -5);
-		interleavingsFormData.left = new FormAttachment(44, 0);
-		this.interleavingsGroup.setLayoutData(interleavingsFormData);
-		this.interleavingsGroup.setLayout(new FormLayout());
-
-		// First interleaving button
-		this.firstInterleavingButton = new Button(this.interleavingsGroup, SWT.PUSH);
-		this.firstInterleavingButton.setImage(firstItemImage);
-		this.firstInterleavingButton.setToolTipText(Messages.GemAnalyzer_7);
-		this.firstInterleavingButton.setEnabled(false);
-		final FormData ifirstFormData = new FormData();
-		ifirstFormData.left = new FormAttachment(0, 5);
-		ifirstFormData.bottom = new FormAttachment(100, -5);
-		this.firstInterleavingButton.setLayoutData(ifirstFormData);
-
-		// Previous interleaving button
-		this.previousInterleavingButton = new Button(this.interleavingsGroup, SWT.PUSH);
-		this.previousInterleavingButton.setImage(prevItemImage);
-		this.previousInterleavingButton.setToolTipText(Messages.GemAnalyzer_8);
-		this.previousInterleavingButton.setEnabled(false);
-		final FormData iprevFormData = new FormData();
-		iprevFormData.left = new FormAttachment(this.firstInterleavingButton, 3);
-		iprevFormData.bottom = new FormAttachment(100, -5);
-		this.previousInterleavingButton.setLayoutData(iprevFormData);
-
-		// Next interleaving button
-		this.nextInterleavingButton = new Button(this.interleavingsGroup, SWT.PUSH);
-		this.nextInterleavingButton.setImage(nextItemImage);
-		this.nextInterleavingButton.setToolTipText(Messages.GemAnalyzer_9);
-		this.nextInterleavingButton.setEnabled(false);
-		final FormData inextFormData = new FormData();
-		inextFormData.left = new FormAttachment(this.previousInterleavingButton, 3);
-		inextFormData.bottom = new FormAttachment(100, -5);
-		this.nextInterleavingButton.setLayoutData(inextFormData);
-
-		// Last interleaving button
-		this.lastInterleavingButton = new Button(this.interleavingsGroup, SWT.PUSH);
-		this.lastInterleavingButton.setImage(lastItemImage);
-		this.lastInterleavingButton.setToolTipText(Messages.GemAnalyzer_10);
-		this.lastInterleavingButton.setEnabled(false);
-		final FormData ilastFormData = new FormData();
-		ilastFormData.left = new FormAttachment(this.nextInterleavingButton, 3);
-		ilastFormData.bottom = new FormAttachment(100, -5);
-		this.lastInterleavingButton.setLayoutData(ilastFormData);
-
-		// Deadlock interleaving button
-		this.deadlockInterleavingButton = new Button(this.interleavingsGroup, SWT.PUSH);
-		this.deadlockInterleavingButton.setImage(deadlockImage);
-		this.deadlockInterleavingButton.setToolTipText(Messages.GemAnalyzer_11);
-		this.deadlockInterleavingButton.setEnabled(false);
-		final FormData deadlockButtonFormData = new FormData();
-		deadlockButtonFormData.left = new FormAttachment(this.lastInterleavingButton, 3);
-		deadlockButtonFormData.bottom = new FormAttachment(100, -5);
-		deadlockButtonFormData.right = new FormAttachment(100, -5);
-		this.deadlockInterleavingButton.setLayoutData(deadlockButtonFormData);
-	}
-
-	/**
-	 * Callback that allows us to create the viewer and initialize it.
-	 * 
-	 * @param parent
-	 *            The parent Composite for this View.
-	 * @return void
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-		this.parent = parent;
-
-		// Create layout for the parent Composite
-		final GridLayout parentLayout = new GridLayout();
-		parentLayout.numColumns = 1;
-		parentLayout.marginHeight = 10;
-		parentLayout.marginWidth = 10;
-		parent.setLayout(parentLayout);
-
-		// Create container for transition and interleaving button groups
-		final Composite runtimeComposite = new Composite(parent, SWT.NULL);
-		runtimeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
-		runtimeComposite.setLayout(new FormLayout());
-		final Composite buttonGroupsComposite = new Composite(parent, SWT.NULL);
-		buttonGroupsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
-		buttonGroupsComposite.setLayout(new FormLayout());
-
-		// Create groups and selection listeners
-		createRuntimeGroup(runtimeComposite);
-		createTransitionsGroup(buttonGroupsComposite);
-		createInterleavingsGroup(buttonGroupsComposite);
-		createStepOrderGroup(buttonGroupsComposite);
-		createCodeWindowsGroup(parent);
-		createSelectionListeners();
-
-		// create actions & connect to buttons, context menus and pull-downs
-		makeActions();
-		hookContextMenu();
-		contributeToActionBars();
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createRuntimeGroup(Composite parent) {
-		// Get images for buttons from image cache
-		final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif")); //$NON-NLS-1$
-		final Image hbvImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/hbv-trident.gif")); //$NON-NLS-1$
-		final Image trident = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/trident.gif")); //$NON-NLS-1$
-
-		// Runtime information group
-		final Group runtimeInfoGroup = new Group(parent, SWT.SHADOW_IN);
-		runtimeInfoGroup.setText(Messages.GemAnalyzer_12);
-		final FormData grid = new FormData();
-		grid.left = new FormAttachment(0, 0);
-		grid.right = new FormAttachment(100, -5);
-		grid.bottom = new FormAttachment(100, -5);
-		runtimeInfoGroup.setLayoutData(grid);
-		runtimeInfoGroup.setLayout(new FormLayout());
-
-		// Error message label
-		this.errorMessageLabel = new Label(runtimeInfoGroup, SWT.NONE);
-		final FormData deadlockMessageFormData = new FormData();
-		deadlockMessageFormData.left = new FormAttachment(0, 5);
-		deadlockMessageFormData.top = new FormAttachment(0, 5);
-		deadlockMessageFormData.width = 300;
-		this.errorMessageLabel.setLayoutData(deadlockMessageFormData);
-		final Font errorMessageLabelFont = setFontSize(this.errorMessageLabel.getFont(), 10);
-		this.errorMessageLabel.setFont(errorMessageLabelFont);
-
-		// Browse calls button
-		this.browseCallsButton = new Button(runtimeInfoGroup, SWT.PUSH);
-		this.browseCallsButton.setImage(noErrorImage);
-		this.browseCallsButton.setText(Messages.GemAnalyzer_79);
-		this.browseCallsButton.setToolTipText(Messages.GemAnalyzer_14);
-		this.browseCallsButton.setEnabled(false);
-		final FormData browseCallsFormData = new FormData();
-		browseCallsFormData.right = new FormAttachment(100, -5);
-		browseCallsFormData.bottom = new FormAttachment(100, -5);
-		this.browseCallsButton.setLayoutData(browseCallsFormData);
-
-		// Launch ispUI button
-		this.launchHpvButton = new Button(runtimeInfoGroup, SWT.PUSH);
-		this.launchHpvButton.setImage(hbvImage);
-		this.launchHpvButton.setText(Messages.GemAnalyzer_15);
-		this.launchHpvButton.setToolTipText(Messages.GemAnalyzer_16);
-		this.launchHpvButton.setEnabled(false);
-		final FormData launchIspUIFormData = new FormData();
-		launchIspUIFormData.right = new FormAttachment(this.browseCallsButton, -5);
-		launchIspUIFormData.bottom = new FormAttachment(100, -5);
-		this.launchHpvButton.setLayoutData(launchIspUIFormData);
-
-		// Run GEM button
-		this.runGemButton = new Button(runtimeInfoGroup, SWT.PUSH);
-		this.runGemButton.setImage(trident);
-		this.runGemButton.setToolTipText(Messages.GemAnalyzer_17);
-		final FormData runGemFormData = new FormData();
-		runGemFormData.right = new FormAttachment(this.launchHpvButton, -20);
-		runGemFormData.bottom = new FormAttachment(100, -5);
-		this.runGemButton.setLayoutData(runGemFormData);
-		this.runGemButton.setEnabled(true);
-
-		// Set number of processes button
-		this.setNumProcsComboList = new Combo(runtimeInfoGroup, SWT.DROP_DOWN);
-		final Font setRankComboFont = setFontSize(this.setNumProcsComboList.getFont(), 9);
-		this.setNumProcsComboList.setFont(setRankComboFont);
-		final String[] items = new String[] {};
-		this.setNumProcsComboList.setItems(items);
-		this.setNumProcsComboList.setText(" "); //$NON-NLS-1$
-		this.setNumProcsComboList.setToolTipText(Messages.GemAnalyzer_18);
-		final FormData setRankFormData = new FormData();
-		setRankFormData.width = 50;
-		setRankFormData.right = new FormAttachment(this.runGemButton, -5);
-		setRankFormData.bottom = new FormAttachment(100, -5);
-		this.setNumProcsComboList.setLayoutData(setRankFormData);
-		this.setNumProcsComboList.setEnabled(true);
-		setNumProcItems();
-		updateDropDown();
-
-		// Font for the buttons
-		final Font buttonFont = setFontSize(this.errorMessageLabel.getFont(), 8);
-		this.launchHpvButton.setFont(buttonFont);
-		this.browseCallsButton.setFont(buttonFont);
-		this.setNumProcsComboList.setFont(buttonFont);
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createSelectionListeners() {
-		// SelectionListeners for transitions group buttons
-		this.firstTransitionButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateFirstTransition(true);
-			}
-		});
-
-		this.previousTransitionButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						updatePreviousTransition();
-					}
-				});
-
-		this.nextTransitionButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateNextTransition(true);
-			}
-		});
-
-		this.lastTransitionButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				updateLastTransition();
-			}
-		});
-
-		this.lockRanksComboList.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				if (GemAnalyzer.this.lockRanksComboList.getText() == null) {
-					return;
-				}
-
-				try {
-					final int selectionIndex = GemAnalyzer.this.lockRanksComboList.getSelectionIndex();
-					final String selectionText = GemAnalyzer.this.lockRanksComboList.getItems()[selectionIndex];
-					final Pattern rankPattern = Pattern.compile("^([a-zA-Z]+?)\\s+([0-9]+?)\\s+([a-zA-Z]+?)$"); //$NON-NLS-1$
-					final Matcher rankPatternMatcher = rankPattern.matcher(selectionText);
-					if (rankPatternMatcher.matches()) {
-						final String rankStr = rankPatternMatcher.group(2);
-						GemAnalyzer.this.lockedRank = Integer.parseInt(rankStr);
-					} else {
-						GemAnalyzer.this.lockedRank = -1;
-					}
-					updateTransitionLabels(true);
-				} catch (final Exception e) {
-					GemUtilities.logExceptionDetail(e);
-					GemAnalyzer.this.lockedRank = -1;
-				}
-			}
-		});
-
-		// SelectionListeners for interleavings group buttons
-		this.firstInterleavingButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						if (GemAnalyzer.this.transitions.hasPreviousInterleaving()) {
-							while (GemAnalyzer.this.transitions.setPreviousInterleaving()) {
-								// do nothing
-							}
-							updateTransitionLabels(true);
-						} else {
-							GemUtilities.showInformationDialog(Messages.GemAnalyzer_19);
-						}
-					}
-				});
-
-		this.previousInterleavingButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						if (GemAnalyzer.this.transitions.hasPreviousInterleaving()) {
-							GemAnalyzer.this.transitions.setPreviousInterleaving();
-							updateTransitionLabels(true);
-						} else {
-							GemUtilities.showInformationDialog(Messages.GemAnalyzer_20);
-						}
-					}
-				});
-
-		this.nextInterleavingButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						if (GemAnalyzer.this.transitions.hasNextInterleaving()) {
-							GemAnalyzer.this.transitions.setNextInterleaving();
-							updateTransitionLabels(true);
-						} else {
-							GemUtilities.showInformationDialog(Messages.GemAnalyzer_21);
-						}
-					}
-				});
-
-		this.lastInterleavingButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						while (GemAnalyzer.this.transitions.hasNextInterleaving()) {
-							GemAnalyzer.this.transitions.setNextInterleaving();
-						}
-						updateTransitionLabels(true);
-					}
-				});
-
-		this.deadlockInterleavingButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						GemAnalyzer.this.transitions.deadlockInterleaving();
-						updateTransitionLabels(true);
-					}
-				});
-
-		// Selection listeners for step order group
-		this.internalIssueOrderButton
-				.addSelectionListener(new SelectionAdapter() {
-					@Override
-					public void widgetSelected(SelectionEvent e) {
-						if (GemAnalyzer.this.internalIssueOrderButton.getSelection()) {
-							if (GemAnalyzer.this.transitions != null) {
-								final ArrayList<ArrayList<Envelope>> tlists = GemAnalyzer.this.transitions.getTransitionList();
-								// Sort by internal issue order
-								final int size = tlists.size();
-								for (int i = 0; i < size; i++) {
-									Collections.sort(tlists.get(i), new InternalIssueOrderSorter());
-								}
-							}
-
-							// Reset preference store value for this preference
-							GemPlugin.getDefault().getPreferenceStore()
-									.setValue(PreferenceConstants.GEM_PREF_STEP_ORDER, "issueOrder"); //$NON-NLS-1$
-							reset();
-						}
-					}
-				});
-
-		this.programOrderButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (GemAnalyzer.this.programOrderButton.getSelection()) {
-					// Sort by internal issue order
-					if (GemAnalyzer.this.transitions != null) {
-						final ArrayList<ArrayList<Envelope>> tlists = GemAnalyzer.this.transitions.getTransitionList();
-						final int size = tlists.size();
-						for (int i = 0; i < size; i++) {
-							Collections.sort(tlists.get(i), new ProgramOrderSorter());
-						}
-					}
-
-					// Reset preference store value for this preference
-					GemPlugin.getDefault().getPreferenceStore()
-							.setValue(PreferenceConstants.GEM_PREF_STEP_ORDER, "programOrder"); //$NON-NLS-1$
-					reset();
-				}
-			}
-		});
-
-		// To conveniently run GEM from this view
-		this.runGemButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-				URI inputLocation = null;
-				IPath path = null;
-
-				try {
-					inputLocation = new URI(pstore.getString(PreferenceConstants.GEM_PREF_MOST_RECENT_FILE));
-				} catch (final URISyntaxException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-				if (inputLocation != null) {
-					path = new Path(inputLocation.getPath());
-				}
-				if (GemAnalyzer.this.activeFile == null) {
-					GemUtilities.setTaskStatus(GemUtilities.TaskStatus.ABORTED);
-					return;
-				}
-				final IFile file = GemUtilities.getCurrentProject(GemAnalyzer.this.activeFile).getFile(path.lastSegment());
-				path = file.getFullPath();
-				final String extension = file.getFileExtension();
-				boolean isSourceFile = false;
-
-				if (extension != null) {
-					// The most common C & C++ source file extensions
-					isSourceFile = extension.equals("c") //$NON-NLS-1$
-							|| extension.equals("cpp") || extension.equals("c++") //$NON-NLS-1$ //$NON-NLS-2$
-							|| extension.equals("cc") || extension.equals("cp"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-
-				// ask for command line arguments
-				GemUtilities.setCommandLineArgs();
-
-				// Open Analyzer and Browser Views in preference order
-				// Find the active editor
-				final IWorkbench wb = PlatformUI.getWorkbench();
-				final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-
-				try {
-					final String activeView = pstore.getString(PreferenceConstants.GEM_ACTIVE_VIEW);
-					if (activeView.equals("analyzer")) { //$NON-NLS-1$
-						page.showView(GemBrowser.ID);
-						page.showView(GemAnalyzer.ID);
-					} else {
-						page.showView(GemAnalyzer.ID);
-						page.showView(GemBrowser.ID);
-					}
-					GemUtilities.initGemViews(file, isSourceFile, true);
-				} catch (final PartInitException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			}
-		});
-
-		// Selection listeners for runtime information group buttons
-		this.setNumProcsComboList.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				if (GemAnalyzer.this.setNumProcsComboList.getText() == null) {
-					return;
-				}
-
-				final int selectionIndex = GemAnalyzer.this.setNumProcsComboList.getSelectionIndex();
-				final String nprocsStr = GemAnalyzer.this.setNumProcsComboList.getItems()[selectionIndex];
-				final int newNumProcs = Integer.parseInt(nprocsStr);
-
-				// Reset the numProcs value in the preference store
-				GemPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.GEM_PREF_NUMPROCS, newNumProcs);
-
-				// If the browser is open updates its drop down
-				try {
-					final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-					final IViewPart browserPart = window.getActivePage().findView(GemBrowser.ID);
-					final GemBrowser browser = (GemBrowser) browserPart;
-					browser.updateDropDown();
-				} catch (final Exception e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			}
-		});
-
-		this.launchHpvButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				final URI uri = GemUtilities.getMostRecentURI();
-				IPath sourceFilePath = null;
-				IFile sourceFile = null;
-
-				if (uri != null) {
-					sourceFilePath = new Path(uri.getPath());
-				}
-
-				final IProject currentProject = GemUtilities.getProjectLogFile().getProject();
-				final String currentProjectPath = currentProject.getLocationURI().getPath();
-				if (sourceFilePath != null) {
-					sourceFilePath = sourceFilePath.makeRelativeTo(new Path(currentProjectPath));
-					sourceFile = currentProject.getFile(sourceFilePath);
-				}
-
-				if (sourceFile != null) {
-					if (GemUtilities.isRemoteProject(GemAnalyzer.this.activeFile)
-							|| GemUtilities.isSynchronizedProject(GemAnalyzer.this.activeFile)) {
-						GemUtilities.showInformationDialog(Messages.GemAnalyzer_23);
-						return;
-					}
-
-					// Otherwise launch the HB viewer
-					GemUtilities.doHbv(sourceFile);
-				} else {
-					// There was a local error while creating the log file.
-					final String message = Messages.GemAnalyzer_13;
-					// GemUtilities.showErrorDialog(message);
-				}
-			}
-		});
-
-		this.browseCallsButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (GemAnalyzer.this.transitions == null) {
-					final String message = Messages.GemAnalyzer_24;
-					GemUtilities.showErrorDialog(message);
-					return;
-				}
-				final class CallBrowserDisplay implements Runnable {
-					public void run() {
-						final IWorkbench wb = PlatformUI.getWorkbench();
-						final Display display = wb.getDisplay();
-						final Shell shell = new Shell();
-						shell.setText(Messages.GemAnalyzer_68);
-						shell.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif"))); //$NON-NLS-1$
-						shell.setLayout(new GridLayout());
-						final CLabel fileNameLabel = new CLabel(shell, SWT.BORDER_SOLID);
-						fileNameLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-						final CLabel numProcsLabel = new CLabel(shell, SWT.BORDER_SOLID);
-						numProcsLabel.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/processes.gif"))); //$NON-NLS-1$
-						numProcsLabel.setText(Messages.GemAnalyzer_69 + GemAnalyzer.this.numRanks);
-						numProcsLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-						final Tree tree = new Tree(shell, SWT.BORDER);
-						tree.setLinesVisible(true);
-						tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-						tree.setFont(setFontSize(tree.getFont(), 8));
-
-						// Declare everything we'll be working with
-						TreeItem interleavingItem = null;
-						TreeItem callItem = null;
-						final int currentInter = GemAnalyzer.this.transitions.getCurrentInterleaving();
-
-						// Loop over all interleavings
-						final int numInterleavings = GemAnalyzer.this.transitions.getTotalInterleavings() + 1; // 0-based
-						for (int currentInterleaving = 1; currentInterleaving < numInterleavings; currentInterleaving++) {
-
-							// Create a root node for each interleaving
-							interleavingItem = new TreeItem(tree, SWT.NULL);
-							interleavingItem.setText(Messages.GemAnalyzer_70 + currentInterleaving);
-
-							// Loop over all envelopes (transitions) in the current interleaving
-							final ArrayList<Envelope> envelopes = GemAnalyzer.this.transitions
-									.getInterleavingEnvelopes(currentInterleaving);
-							final int listSize = envelopes.size();
-							Envelope env = null;
-							String functionName = null;
-							String fileName = null;
-							int lineNumber = -1;
-							int envRank = -1;
-
-							try {
-								for (int envIndex = 0; envIndex < listSize; envIndex++) {
-									env = envelopes.get(envIndex);
-
-									// Don't display resource leaks
-									if (env.isLeak()) {
-										continue;
-									}
-
-									// Create the leaf node representing the call
-									callItem = new TreeItem(interleavingItem, SWT.NULL);
-									functionName = env.getFunctionName();
-									fileName = new Path(env.getFilePath()).lastSegment().toString();
-									lineNumber = env.getLinenumber();
-									envRank = env.getRank();
-
-									// make all calls have same name length
-									while (functionName.length() < 12) {
-										functionName += " "; //$NON-NLS-1$
-									}
-
-									final StringBuffer stringBuffer = new StringBuffer();
-									stringBuffer.append("Rank: "); //$NON-NLS-1$
-									stringBuffer.append(envRank);
-									stringBuffer.append("\t\t"); //$NON-NLS-1$
-									stringBuffer.append(functionName);
-									stringBuffer.append("\t\t"); //$NON-NLS-1$
-									stringBuffer.append(fileName);
-									stringBuffer.append(":"); //$NON-NLS-1$
-									stringBuffer.append(lineNumber);
-									final String callItemText = stringBuffer.toString();
-									callItem.setText(callItemText);
-
-									// Mark the calls with errors red
-									if (env.getIssueIndex() == -1) {
-										callItem.setForeground(new Color(null, 255, 0, 0));
-									}
-
-									// Mark the current call(s) blue
-									String currentFile = null;
-									int currentLine = -1;
-									if (GemAnalyzer.this.transitions.getCurrentTransition() != null) {
-										currentFile = GemAnalyzer.this.transitions.getCurrentTransition().getFilePath();
-										currentLine = GemAnalyzer.this.transitions.getCurrentTransition().getLinenumber();
-									}
-									if (currentFile != null) {
-										if (currentLine == env.getLinenumber() && currentFile.equals(env.getFilePath())
-												&& currentInter == env.getInterleaving()) {
-											callItem.setForeground(new Color(null, 0, 0, 255));
-											// Comment this out if you don't want items expanded
-											revealTreeItem(callItem);
-										}
-									}
-								}
-							} catch (final Exception e) {
-								GemUtilities.logExceptionDetail(e);
-							}
-						}
-
-						// Open up the Call Browser window with the specified size
-						shell.setSize(550, 550);
-						shell.open();
-
-						if (GemAnalyzer.this.activeShells == null) {
-							GemAnalyzer.this.activeShells = new LinkedList<Shell>();
-						}
-						GemAnalyzer.this.activeShells.add(shell);
-
-						// Set up the event loop for disposal
-						while (!shell.isDisposed()) {
-							if (!display.readAndDispatch()) {
-								display.sleep();
-							}
-						}
-					}
-				}
-				final CallBrowserDisplay browser = new CallBrowserDisplay();
-				Display.getDefault().syncExec(browser);
-			}
-		});
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createStepOrderGroup(Composite parent) {
-		// Group and FormLayout data for step order radio buttons
-		this.stepOrderGroup = new Group(parent, SWT.SHADOW_IN);
-		this.stepOrderGroup.setText(Messages.GemAnalyzer_25);
-		this.stepOrderGroup.setToolTipText(Messages.GemAnalyzer_26);
-		final FormData stepOrderFormData = new FormData();
-		// stepOrderFormData.left = new FormAttachment(this.interleavingsGroup,
-		// 20);
-		stepOrderFormData.right = new FormAttachment(100, -5);
-		stepOrderFormData.bottom = new FormAttachment(100, -5);
-		this.stepOrderGroup.setLayoutData(stepOrderFormData);
-		this.stepOrderGroup.setLayout(new GridLayout(3, false));
-
-		// Step order radio buttons
-		this.internalIssueOrderButton = new Button(this.stepOrderGroup, SWT.RADIO);
-		this.internalIssueOrderButton.setText(Messages.GemAnalyzer_27);
-		this.internalIssueOrderButton.setToolTipText(Messages.GemAnalyzer_28);
-		this.programOrderButton = new Button(this.stepOrderGroup, SWT.RADIO);
-		this.programOrderButton.setText(Messages.GemAnalyzer_29);
-		this.programOrderButton.setToolTipText(Messages.GemAnalyzer_30);
-
-		// Choose which one is to be enabled from the Preference Store setting
-		final String stepOrder = GemPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.GEM_PREF_STEP_ORDER);
-		if (stepOrder.equals("issueOrder")) { //$NON-NLS-1$
-			this.internalIssueOrderButton.setSelection(true);
-		} else {
-			this.programOrderButton.setSelection(true);
-		}
-
-		// Font for the radio buttons
-		final Font buttonFont = setFontSize(this.programOrderButton.getFont(), 8);
-		this.internalIssueOrderButton.setFont(buttonFont);
-		this.programOrderButton.setFont(buttonFont);
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createTransitionsGroup(Composite parent) {
-		// Get images for buttons from image cache
-		final Image firstItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/first-item.gif")); //$NON-NLS-1$
-		final Image lastItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/last-item.gif")); //$NON-NLS-1$
-		final Image prevItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/prev-item.gif")); //$NON-NLS-1$
-		final Image nextItemImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/next-item.gif")); //$NON-NLS-1$
-
-		// Group and FormLayout data for transition buttons and labels
-		this.transitionsGroup = new Group(parent, SWT.SHADOW_IN);
-		this.transitionsGroup.setText(Messages.GemAnalyzer_32);
-		this.transitionsGroup.setToolTipText(Messages.GemAnalyzer_33);
-		final FormData transitionsFormData = new FormData();
-		transitionsFormData.left = new FormAttachment(0, 0);
-		transitionsFormData.bottom = new FormAttachment(100, -5);
-		this.transitionsGroup.setLayoutData(transitionsFormData);
-		this.transitionsGroup.setLayout(new FormLayout());
-
-		// First transition button
-		this.firstTransitionButton = new Button(this.transitionsGroup, SWT.PUSH);
-		this.firstTransitionButton.setImage(firstItemImage);
-		this.firstTransitionButton.setToolTipText(Messages.GemAnalyzer_34);
-		this.firstTransitionButton.setEnabled(false);
-		final FormData tfirstFormData = new FormData();
-		tfirstFormData.left = new FormAttachment(0, 5);
-		tfirstFormData.bottom = new FormAttachment(100, -5);
-		this.firstTransitionButton.setLayoutData(tfirstFormData);
-
-		// Previous transition button
-		this.previousTransitionButton = new Button(this.transitionsGroup, SWT.PUSH);
-		this.previousTransitionButton.setImage(prevItemImage);
-		this.previousTransitionButton.setToolTipText(Messages.GemAnalyzer_35);
-		this.previousTransitionButton.setEnabled(false);
-		final FormData tprevFormData = new FormData();
-		tprevFormData.left = new FormAttachment(this.firstTransitionButton, 3);
-		tprevFormData.bottom = new FormAttachment(100, -5);
-		this.previousTransitionButton.setLayoutData(tprevFormData);
-
-		// Next transition buttons
-		this.nextTransitionButton = new Button(this.transitionsGroup, SWT.PUSH);
-		this.nextTransitionButton.setImage(nextItemImage);
-		this.nextTransitionButton.setToolTipText(Messages.GemAnalyzer_36);
-		this.nextTransitionButton.setEnabled(false);
-		final FormData tnextFormData = new FormData();
-		tnextFormData.left = new FormAttachment(this.previousTransitionButton, 3);
-		tnextFormData.bottom = new FormAttachment(100, -5);
-		this.nextTransitionButton.setLayoutData(tnextFormData);
-
-		// Last transition button
-		this.lastTransitionButton = new Button(this.transitionsGroup, SWT.PUSH);
-		this.lastTransitionButton.setImage(lastItemImage);
-		this.lastTransitionButton.setToolTipText(Messages.GemAnalyzer_37);
-		this.lastTransitionButton.setEnabled(false);
-		final FormData tlastFormData = new FormData();
-		tlastFormData.left = new FormAttachment(this.nextTransitionButton, 3);
-		tlastFormData.bottom = new FormAttachment(100, -5);
-		this.lastTransitionButton.setLayoutData(tlastFormData);
-
-		// Lock ranks button
-		this.lockRanksComboList = new Combo(this.transitionsGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
-		final Font lockRanksComboFont = setFontSize(this.lockRanksComboList.getFont(), 8);
-		this.lockRanksComboList.setFont(lockRanksComboFont);
-		final String[] items = new String[] { Messages.GemAnalyzer_83 };
-		this.lockRanksComboList.setItems(items);
-		this.lockRanksComboList.setToolTipText(Messages.GemAnalyzer_39);
-		final FormData lockRanksFormData = new FormData();
-		lockRanksFormData.left = new FormAttachment(this.lastTransitionButton, 10);
-		lockRanksFormData.right = new FormAttachment(100, -5);
-		lockRanksFormData.bottom = new FormAttachment(100, -5);
-		this.lockRanksComboList.setLayoutData(lockRanksFormData);
-	}
-
-	/*
-	 * Uses the right code window to display all calls associated with the
-	 * collective operation displayed in the left code view window.
-	 */
-	private void displayCollectiveInfo() {
-		final Envelope env = this.transitions.getCurrentTransition();
-		final ArrayList<Envelope> matches = env.getCommunicator_matches();
-
-		if (matches != null) {
-			final int listSize = matches.size();
-			for (int i = 0; i < listSize; i++) {
-				final Envelope currentMatchEnvelope = matches.get(i);
-				final String matchFilePathString = currentMatchEnvelope.getFilePath();
-				final IFile sourceFile = GemUtilities.getSourceFile(matchFilePathString, this.activeFile);
-
-				// Add the match to the right code view window
-				this.rightViewer.add(new ListElement(sourceFile, sourceFile.getName() + Messages.GemAnalyzer_40
-						+ currentMatchEnvelope.getLinenumber()
-						+ Messages.GemAnalyzer_41
-						+ currentMatchEnvelope.getRank(), currentMatchEnvelope.getLinenumber(), false));
-			}
-		}
-	}
-
-	/*
-	 * Displays the specified envelope and it's matches if they exist.
-	 */
-	private void displayEnvelopes(Envelope env) {
-		// If the envelope is null, it's a new interleaving, start over
-		if (env == null) {
-			return;
-		}
-
-		// Set the indexes for the highlighted line updater
-		this.leftIndex = env.getLinenumber();
-		boolean hasMatch = true;
-		try {
-			final Envelope match = env.getMatch_envelope();
-			if (match != null) {
-				this.rightIndex = match.getLinenumber();
-			} else {
-				hasMatch = false;
-			}
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-
-		// Set font color for code window labels
-		Color textColor = new Color(this.parent.getShell().getDisplay(), new RGB(0, 0, 255));
-		this.leftCodeWindowLabel.setForeground(textColor);
-		this.rightCodeWindowLabel.setForeground(textColor);
-
-		// Build up the Strings for the Label text
-		final String leftResult = getCallText(env, true);
-		this.leftCodeWindowLabel.setText(leftResult);
-
-		// If a match exists update the right side
-		if (hasMatch) {
-			final Envelope match = env.getMatch_envelope();
-			final String rightResult = getCallText(match, false);
-			this.rightCodeWindowLabel.setText(rightResult);
-		} else {
-			this.rightIndex = -1;
-			this.rightViewer.getList().deselectAll();
-			this.rightCodeWindowLabel.setText(""); //$NON-NLS-1$
-		}
-
-		if (env.getIssueIndex() == -1) {
-			textColor = new Color(this.parent.getShell().getDisplay(), new RGB(255, 0, 0));
-			this.rightCodeWindowLabel.setForeground(textColor);
-			if (env.getFunctionName().equals("MPI_Abort")) { //$NON-NLS-1$
-				this.rightCodeWindowLabel.setText(""); //$NON-NLS-1$
-			} else if (this.transitions.hasDeadlock()) {
-				this.rightCodeWindowLabel.setText(Messages.GemAnalyzer_46);
-			} else {
-				this.rightCodeWindowLabel.setText(Messages.GemAnalyzer_47);
-			}
-		}
-	}
-
-	/**
-	 * Disposes of all shell windows when the instance of Eclipse that created
-	 * them exits.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	@Override
-	public void dispose() {
-		if (this.activeShells != null) {
-			for (final Shell s : this.activeShells) {
-				if (s != null) {
-					s.dispose();
-				}
-			}
-		}
-		super.dispose();
-	}
-
-	/*
-	 * Populates the view context menu.
-	 */
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(this.terminateButton);
-		this.terminateButton.setText(Messages.GemAnalyzer_48);
-		manager.add(this.getHelp);
-		this.getHelp.setText(Messages.GemAnalyzer_49);
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Populates the view pull-down menu.
-	 */
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(this.terminateButton);
-		this.terminateButton.setText(Messages.GemAnalyzer_50);
-		manager.add(new Separator());
-		manager.add(this.getHelp);
-		this.getHelp.setText(Messages.GemAnalyzer_51);
-		manager.add(new Separator());
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Contributes icons and actions to the tool bar.
-	 */
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(this.terminateButton);
-		manager.add(this.getHelp);
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Returns a String representing all information relative to a particular
-	 * successful MPI call.
-	 */
-	private String getCallText(Envelope env, boolean isLeft) {
-		final String newline = System.getProperty("line.separator"); //$NON-NLS-1$
-		final String sourceFilePathString = env.getFilePath();
-		final IFile sourceFile = GemUtilities.getSourceFile(sourceFilePathString, this.activeFile);
-		final String fileName = sourceFile.getName();
-		final StringBuffer stringBuffer = new StringBuffer();
-
-		// determine which ranks are involved; by default only call's rank
-		String ranks = Messages.GemAnalyzer_53 + env.getRank()
-				+ (System.getProperty("os.name").contains("Windows") ? "\t" : newline); //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$
-		if (env.isCollective() && this.lockedRank == -1) {
-
-			// If it was a group call then discover who else is here
-			final int numRanksInvolved[] = new int[1];
-			if (this.lockedRank == -1) {
-				// Also see if we're looking at a single rank or not
-				ranks = this.transitions.getRanksInvolved(numRanksInvolved);
-			}
-
-			// This is currently the max #processes GEM drop-down boxes allow
-			final int MAX = 16;
-			if (numRanksInvolved[0] > MAX) {
-				// display only first ten ranks
-				String tempRanks = ranks;
-				int total = 0;
-				for (int i = 0; i < MAX; i++) {
-					// May be multi-digit numbers, hence this code
-					total += tempRanks.indexOf(",") + 1; //$NON-NLS-1$
-					tempRanks = tempRanks.substring(tempRanks.indexOf(",") + 1); //$NON-NLS-1$
-				}
-				stringBuffer.append(Messages.GemAnalyzer_22);
-				stringBuffer.append(ranks.substring(0, total - 1));
-				stringBuffer.append("..."); //$NON-NLS-1$
-				stringBuffer.append(newline);
-			} else {
-				stringBuffer.append(Messages.GemAnalyzer_55);
-				stringBuffer.append(ranks);
-				stringBuffer.append(newline);
-			}
-
-			// count number of ":" to determine how many ranks involved
-			int ranksCommunicatedTo = 0;
-			String communicator = env.getCommunicator_ranks_string();
-			while (communicator != null && communicator.contains(":")) { //$NON-NLS-1$
-				communicator = communicator.substring(communicator.indexOf(":") + 1); //$NON-NLS-1$
-				ranksCommunicatedTo++;
-			}
-
-			if (ranksCommunicatedTo != 0 && numRanksInvolved[0] / ranksCommunicatedTo > 1) {
-				stringBuffer.append(Messages.GemAnalyzer_56);
-				stringBuffer.append(numRanksInvolved[0] / ranksCommunicatedTo);
-				stringBuffer.append(Messages.GemAnalyzer_57);
-				stringBuffer.append(ranksCommunicatedTo);
-				stringBuffer.append(Messages.GemAnalyzer_58);
-			}
-		}
-		if (!env.isCollective()) {
-			stringBuffer.append(ranks);
-		}
-		stringBuffer.append(Messages.GemAnalyzer_60);
-		stringBuffer.append(fileName);
-		stringBuffer.append("\t"); //$NON-NLS-1$
-		stringBuffer.append(Messages.GemAnalyzer_61);
-		stringBuffer.append(isLeft ? this.leftIndex : this.rightIndex);
-
-		return stringBuffer.toString();
-	}
-
-	/*
-	 * Adds MenuListeners to hook selections from the context menu.
-	 */
-	private void hookContextMenu() {
-		final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				GemAnalyzer.this.fillContextMenu(manager);
-			}
-		});
-		final Menu leftMenu = menuMgr.createContextMenu(this.leftViewer.getControl());
-		this.leftViewer.getControl().setMenu(leftMenu);
-		getSite().registerContextMenu(menuMgr, this.leftViewer);
-
-		final Menu rightMenu = menuMgr.createContextMenu(this.rightViewer.getControl());
-		this.rightViewer.getControl().setMenu(rightMenu);
-		getSite().registerContextMenu(menuMgr, this.rightViewer);
-	}
-
-	/**
-	 * Initializing everything and creates threads to be used by the main UI
-	 * thread to do updates.
-	 * 
-	 * @param resource
-	 *            The resource to initialize this view with.
-	 * @return void
-	 */
-	public void init(IResource resource) {
-
-		this.activeFile = GemUtilities.adaptResource(resource);
-
-		this.analyzerUpdateThread = new Thread() {
-			@Override
-			public void run() {
-				// If just aborted then don't fill viewers with incomplete data
-				if (GemAnalyzer.this.aborted) {
-					Display.getDefault().syncExec(GemAnalyzer.this.disableTerminateButtonThread);
-					Display.getDefault().syncExec(GemAnalyzer.this.clearAnalyzerThread);
-					GemAnalyzer.this.aborted = false;
-					return;
-				}
-
-				// if the log file contained no MPI calls
-				if (GemAnalyzer.this.activeFile == null) {
-					Display.getDefault().syncExec(GemAnalyzer.this.disableTerminateButtonThread);
-					clear();
-					return;
-				}
-
-				reset();
-				parseSourceFile(GemAnalyzer.this.activeFile, GemAnalyzer.this.activeFile);
-				Display.getDefault().syncExec(GemAnalyzer.this.disableTerminateButtonThread);
-			}
-		};
-
-		this.clearAnalyzerThread = new Thread() {
-			@Override
-			public void run() {
-				final String emptyString = ""; //$NON-NLS-1$
-				GemAnalyzer.this.transitionsGroup.setText("Transition:" + " 0/0"); //$NON-NLS-1$ //$NON-NLS-2$
-				GemAnalyzer.this.interleavingsGroup.setText("Interleaving:" + " 0/0"); //$NON-NLS-1$ //$NON-NLS-2$
-				GemAnalyzer.this.firstTransitionButton.setEnabled(false);
-				GemAnalyzer.this.previousTransitionButton.setEnabled(false);
-				GemAnalyzer.this.nextTransitionButton.setEnabled(false);
-				GemAnalyzer.this.lastTransitionButton.setEnabled(false);
-				GemAnalyzer.this.firstInterleavingButton.setEnabled(false);
-				GemAnalyzer.this.previousInterleavingButton.setEnabled(false);
-				GemAnalyzer.this.nextInterleavingButton.setEnabled(false);
-				GemAnalyzer.this.lastInterleavingButton.setEnabled(false);
-				GemAnalyzer.this.deadlockInterleavingButton.setEnabled(false);
-				GemAnalyzer.this.internalIssueOrderButton.setEnabled(false);
-				GemAnalyzer.this.programOrderButton.setEnabled(false);
-				GemAnalyzer.this.launchHpvButton.setEnabled(false);
-				GemAnalyzer.this.browseCallsButton.setEnabled(false);
-				GemAnalyzer.this.terminateButton.setEnabled(false);
-				GemAnalyzer.this.errorMessageLabel.setText(emptyString);
-				GemAnalyzer.this.transitions = null;
-				GemAnalyzer.this.leftViewer.refresh();
-				GemAnalyzer.this.rightViewer.refresh();
-				GemAnalyzer.this.leftCodeWindowLabel.setText(emptyString);
-				GemAnalyzer.this.rightCodeWindowLabel.setText(emptyString);
-				final String[] items = new String[] { emptyString };
-				GemAnalyzer.this.lockRanksComboList.setItems(items);
-				GemUtilities.setTaskStatus(GemUtilities.TaskStatus.IDLE);
-				GemAnalyzer.this.runGemButton.setEnabled(true);
-			}
-		};
-
-		this.disableTerminateButtonThread = new Thread() {
-			@Override
-			public void run() {
-				GemAnalyzer.this.terminateButton.setEnabled(false);
-				GemAnalyzer.this.runGemButton.setEnabled(true);
-				GemAnalyzer.this.internalIssueOrderButton.setEnabled(true);
-				GemAnalyzer.this.programOrderButton.setEnabled(true);
-			}
-		};
-
-		// start things up now
-		this.terminateButton.setEnabled(true);
-		this.runGemButton.setEnabled(false);
-	}
-
-	/*
-	 * Launches the call browser as a separate shell window. This will yield a
-	 * list of MPI calls sorted by interleaving -> rank -> MPI call. Calls are
-	 * also color coded to distinguish the currently selected line in analyzer
-	 * code windows (blue), as well as uncompleted calls due to a deadlock in
-	 * the particular interleaving (red).
-	 */
-
-	/*
-	 * Creates the actions associated with the action bar buttons and context
-	 * menu items.
-	 */
-	private void makeActions() {
-		this.getHelp = new Action() {
-			@Override
-			public void run() {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelpResource("/org.eclipse.ptp.gem.help/html/analyzerView.html"); //$NON-NLS-1$
-			}
-		};
-		this.getHelp.setToolTipText(Messages.GemAnalyzer_73);
-		this.getHelp.setImageDescriptor(GemPlugin.getImageDescriptor("icons/help-contents.gif")); //$NON-NLS-1$
-
-		this.terminateButton = new Action() {
-			@Override
-			public void run() {
-				GemAnalyzer.this.aborted = true;
-				GemUtilities.terminateOperation();
-			}
-		};
-		this.terminateButton.setImageDescriptor(GemPlugin.getImageDescriptor("icons/progress_stop.gif")); //$NON-NLS-1$
-		this.terminateButton.setToolTipText(Messages.GemAnalyzer_74);
-		this.terminateButton.setEnabled(false);
-	}
-
-	/*
-	 * Opens the editor with the current source file active and jump to the line
-	 * number that is passed in.
-	 */
-	private void openEditor(int lineNum, IFile sourceFile) {
-		try {
-			final IEditorPart editor = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
-					sourceFile, true);
-			final IMarker marker = sourceFile.createMarker(IMarker.MARKER);
-			marker.setAttribute(IMarker.LINE_NUMBER, lineNum);
-			IDE.gotoMarker(editor, marker);
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-	}
-
-	/*
-	 * Returns whether or not the specified String has a matching number of left
-	 * and right. parenthesis.
-	 */
-	private boolean parenthesesMatched(String call) {
-		int numRightParens = 0;
-		int numLeftParens = 0;
-
-		call = removeComments(call);
-		for (int i = 0; i < call.length(); i++) {
-			if (call.charAt(i) == '(') {
-				numLeftParens++;
-			}
-			if (call.charAt(i) == ')') {
-				numRightParens++;
-			}
-		}
-		return (numRightParens == numLeftParens);
-	}
-
-	/**
-	 * Reads in the contents of the specified file and populates the
-	 * ListViewers.
-	 * 
-	 * @param leftSourceFile
-	 *            The handle on the file resource for the left code view window.
-	 * @param rightSourceFile
-	 *            The handle on the file resource for the right code view
-	 *            window.
-	 * @return void
-	 */
-	public void parseSourceFile(IFile leftSourceFile, IFile rightSourceFile) {
-
-		final Boolean updateLeftFile = this.currLeftFile == null || !this.currLeftFile.equals(leftSourceFile);
-		final Boolean updateRightFile = this.currRightFile == null || rightSourceFile == null
-				|| !this.currRightFile.equals(rightSourceFile);
-		this.currLeftFile = leftSourceFile;
-		this.currRightFile = rightSourceFile;
-
-		// Clear the left viewer list
-		if (updateLeftFile) {
-			this.leftViewer.getList().removeAll();
-		}
-
-		boolean isCollective = false;
-		if (this.transitions != null && this.transitions.getCurrentTransition() != null) {
-			isCollective = this.transitions.getCurrentTransition().isCollective();
-		}
-
-		// Clear the right viewer list
-		if (isCollective || updateRightFile) {
-			this.rightViewer.getList().removeAll();
-		}
-
-		// Populate the viewers with the source file contents
-		InputStream leftSourceFileStream = null;
-		InputStream rightSourceFileStream = null;
-		String line = ""; //$NON-NLS-1$
-
-		// Populate the left code window
-		try {
-			leftSourceFileStream = leftSourceFile.getContents(true);
-			final Scanner s = new Scanner(leftSourceFileStream);
-			int lineNum = 0;
-			while (updateLeftFile && s.hasNext()) {
-				lineNum++;
-				line = s.nextLine();
-				this.leftViewer.add(new ListElement(leftSourceFile, line, lineNum, false));
-			}
-		} catch (final CoreException e) {
-			GemUtilities.logExceptionDetail(e);
-			this.leftViewer.add(new ListElement(null, Messages.GemAnalyzer_76, -1, false));
-		}
-
-		// Populate the right code window
-		try {
-			if (rightSourceFile != null) {
-				rightSourceFileStream = rightSourceFile.getContents();
-				final Scanner s = new Scanner(rightSourceFileStream);
-				int lineNum = 0;
-				while (s.hasNext()) {
-					lineNum++;
-					line = s.nextLine();
-					this.rightViewer.add(new ListElement(rightSourceFile, line, lineNum, false));
-				}
-			} else {
-				final Envelope env = this.transitions.getCurrentTransition();
-				if (env.isCollective()) {
-					displayCollectiveInfo();
-				} else {
-					this.rightViewer.add(new ListElement(null, "", -1, false)); //$NON-NLS-1$
-				}
-			}
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-			this.rightViewer.add(new ListElement(null, Messages.GemAnalyzer_78, -1, false));
-		}
-
-		// Close the open InputStreams
-		try {
-			if (leftSourceFileStream != null) {
-				leftSourceFileStream.close();
-			}
-			if (rightSourceFileStream != null) {
-				rightSourceFileStream.close();
-			}
-		} catch (final IOException e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-	}
-
-	/*
-	 * Removes comments from the specified call String.
-	 */
-	private String removeComments(String call) {
-		// remove any c-style comments
-		while (call.contains("/*")) { //$NON-NLS-1$
-			if (!call.contains("*/")) { //$NON-NLS-1$
-				break;
-			}
-			call = call.substring(0, call.indexOf("/*")) + call.substring(call.indexOf("*/") + 2); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// remove any c++-style comments
-		while (call.contains("//")) { //$NON-NLS-1$
-			call = call.substring(0, call.indexOf("//")); //$NON-NLS-1$
-		}
-		return call;
-	}
-
-	/*
-	 * Resets everything to default values. Used when a new file is analyzed.
-	 */
-	private void reset() {
-		// By making the current files null we force the code viewers to update
-		this.currLeftFile = null;
-		this.currRightFile = null;
-		this.transitions.currentInterleaving = 0;
-		this.transitions.currentTransitionIndex = 0;
-
-		// Update labels and combo lists
-		setMessageLabelText();
-		setLockRankItems();
-		setNumProcItems();
-
-		// Update global indices
-		this.leftIndex = 0;
-		this.rightIndex = 0;
-		this.lockedRank = -1;
-
-		// Runtime group buttons
-		this.deadlockInterleavingButton.setEnabled(this.transitions.getDeadlockInterleavings() != null);
-		this.browseCallsButton.setEnabled(true);
-		this.browseCallsButton.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/browse.gif"))); //$NON-NLS-1$
-		this.launchHpvButton.setEnabled(true);
-
-		// Update transition related items w/o displaying
-		updateTransitionLabels(false);
-
-		// TODO Let's clean this up
-		// This section is needed since the scroll bars are unresponsive
-		// until the view is fully created. For this reason we need to back up
-		// to Transition 0 and update the labels.
-		this.transitionLabelIndex = 0;
-		this.transitionsGroup.setText("Transition " + this.transitionLabelIndex + "/" + this.transitionLabelCount); //$NON-NLS-1$ //$NON-NLS-2$ 
-		this.transitions.currentTransitionIndex = -1;
-		this.leftIndex = 0;
-		this.rightIndex = 0;
-		this.previousLeftIndex = 0;
-		setButtonEnabledState();
-		updateSelectedLine(true);
-		setMessageLabelText();
-		GemUtilities.setTaskStatus(GemUtilities.TaskStatus.IDLE);
-	}
-
-	/*
-	 * To make an item visible we must expand each of its parents. Sadly the
-	 * root must be expanded first and work its way down to the goal. So we
-	 * recursively find parents and then expand once all of the current item's
-	 * parents has been expanded.
-	 */
-	private void revealTreeItem(TreeItem callItem) {
-		if (callItem.getParentItem() == null) {
-			callItem.setExpanded(true);
-		} else {
-			revealTreeItem(callItem.getParentItem());
-			callItem.setExpanded(true);
-		}
-	}
-
-	/*
-	 * Sets the enabled property of all buttons to the appropriate state.
-	 */
-	private void setButtonEnabledState() {
-		this.firstTransitionButton.setEnabled(this.transitions.hasValidPreviousTransition(this.lockedRank));
-		this.previousTransitionButton.setEnabled(this.transitions.hasValidPreviousTransition(this.lockedRank));
-		this.nextTransitionButton.setEnabled(this.transitions.hasValidNextTransition(this.lockedRank));
-		this.lastTransitionButton.setEnabled(this.transitions.hasValidNextTransition(this.lockedRank));
-		this.firstInterleavingButton.setEnabled(this.transitions.hasPreviousInterleaving());
-		this.previousInterleavingButton.setEnabled(this.transitions.hasPreviousInterleaving());
-		this.nextInterleavingButton.setEnabled(this.transitions.hasNextInterleaving());
-		this.lastInterleavingButton.setEnabled(this.transitions.hasNextInterleaving());
-		this.deadlockInterleavingButton.setEnabled(this.transitions.getDeadlockInterleavings() != null);
-
-	}
-
-	/**
-	 * see org.eclipse.ui.IWorkbenchPart
-	 */
-	@Override
-	public void setFocus() {
-		this.runGemButton.setFocus();
-	}
-
-	/*
-	 * Given the initial Font, this helper method returns that Font with the new
-	 * specified size.
-	 */
-	private Font setFontSize(Font font, int size) {
-		final FontData[] fontData = font.getFontData();
-		for (final FontData element : fontData) {
-			element.setHeight(size);
-		}
-		return new Font(this.parent.getDisplay(), fontData);
-	}
-
-	/*
-	 * Populates the lock ranks combo-box with the correct number of entries for
-	 * the current analyzation.
-	 */
-	private void setLockRankItems() {
-		final String[] ranks = new String[this.numRanks + 1];
-		ranks[0] = Messages.GemAnalyzer_83;
-		for (int i = 1; i <= this.numRanks; i++) {
-			final StringBuffer stringBuffer = new StringBuffer();
-			stringBuffer.append(Messages.GemAnalyzer_84);
-			stringBuffer.append((Integer) (i - 1));
-			stringBuffer.append(Messages.GemAnalyzer_85);
-			ranks[i] = stringBuffer.toString();
-		}
-		this.lockRanksComboList.setItems(ranks);
-		this.lockRanksComboList.setText(ranks[0]);
-	}
-
-	/*
-	 * Sets the label text in the interleavings buttons group.
-	 */
-	private void setMessageLabelText() {
-		// This is for foreground coloring
-		final Display display = this.parent.getShell().getDisplay();
-		final Color RED = new Color(display, new RGB(255, 0, 0));
-		final Color GREEN = new Color(display, new RGB(0, 200, 0));
-		final Color BLUE = new Color(display, new RGB(0, 0, 255));
-
-		// Interleaving label
-		this.interleavingsGroup.setText("Interleaving: " + this.transitions.getCurrentInterleaving() + "/" //$NON-NLS-1$ //$NON-NLS-2$
-				+ this.transitions.getTotalInterleavings());
-
-		// Transition Label
-		this.transitionsGroup.setText("Transition: " + this.transitionLabelIndex + "/" + this.transitionLabelCount); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// Error message label
-		if (this.transitions.hasDeadlock()) {
-			this.errorMessageLabel.setForeground(RED);
-			final ArrayList<Integer> deadlockList = this.transitions.getDeadlockInterleavings();
-			String deadlocks = ""; //$NON-NLS-1$
-			if (deadlockList.size() == 1) {
-				deadlocks = deadlockList.get(0).toString();
-			} else {
-				for (int i = 0; i < deadlockList.size(); i++) {
-					final String num = deadlockList.get(i).toString();
-					deadlocks += (i != deadlockList.size() - 1) ? num + ", " : num; //$NON-NLS-1$
-				}
-			}
-			String errorMsg = Messages.GemAnalyzer_89;
-			errorMsg += deadlocks.length() == 1 ? " " : "s "; //$NON-NLS-1$ //$NON-NLS-2$
-			this.errorMessageLabel.setText(errorMsg + deadlocks);
-		} else if (this.transitions.hasAssertion()) {
-			this.errorMessageLabel.setForeground(RED);
-			this.errorMessageLabel.setText(Messages.GemAnalyzer_91 + this.transitions.getTotalInterleavings());
-		} else if (this.transitions.hasError()) {
-			this.errorMessageLabel.setForeground(RED);
-			this.errorMessageLabel.setText(Messages.GemAnalyzer_92);
-		} else {
-			if (this.transitions.hasResourceLeak() || this.transitions.hasFIB()) {
-				this.errorMessageLabel.setForeground(BLUE);
-				this.errorMessageLabel.setText(Messages.GemAnalyzer_93);
-			} else {
-				this.errorMessageLabel.setForeground(GREEN);
-				this.errorMessageLabel.setText(Messages.GemAnalyzer_31);
-			}
-		}
-	}
-
-	/*
-	 * Populates the num-procs combo-box with choices the user can use to set
-	 * the number of processes for the next analyzer run.
-	 */
-	private void setNumProcItems() {
-		final String[] ranks = new String[16];
-		for (int i = 1; i <= 16; i++) {
-			ranks[i - 1] = ((Integer) i).toString();
-		}
-		this.setNumProcsComboList.setItems(ranks);
-		final Integer nprocs = GemPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		this.setNumProcsComboList.setText(nprocs.toString());
-	}
-
-	/*
-	 * This method eliminates displaying of redundant collective call
-	 * information in the Analyzer code windows. If you are moving forward
-	 * direction should be 1, if backward -1, otherwise the behavior is
-	 * undefined.
-	 */
-	private Envelope skipRepeats(int direction) {
-		Envelope env = this.transitions.getCurrentTransition();
-		while (true) {
-			if (env == null) {
-				return null;
-			}
-			if (env.getLinenumber() == this.previousLeftIndex) {
-				if (direction == 1) {
-					env = this.transitions.getNextTransition(this.lockedRank);
-				} else {
-					env = this.transitions.getPreviousTransition(this.lockedRank);
-				}
-			} else {
-				break;
-			}
-		}
-		return env;
-	}
-
-	/**
-	 * Updates the Analyzer view.
-	 * 
-	 * @param sourceFile
-	 *            The source file resource to display in the Analyzer View's
-	 *            code windows.
-	 * @param transitions
-	 *            The Transitions object holding holding all transitions per
-	 *            interleaving.
-	 * @return void
-	 */
-	public void update(IFile sourceFile, Transitions transitions) {
-		if (transitions == null) {
-			clear();
-			return;
-		}
-		this.transitions = transitions;
-		this.numRanks = transitions.getNumRanks();
-		this.activeFile = sourceFile;
-		Display.getDefault().syncExec(this.analyzerUpdateThread);
-	}
-
-	/*
-	 * Only changes the code windows content, does not change the highlighting.
-	 * First time through, current Envelope is null, no update needed.
-	 */
-	private void updateCodeViewers() {
-		final String emptyString = ""; //$NON-NLS-1$
-		Envelope env = this.transitions.getCurrentTransition();
-		if (env != null) {
-			final String nextLeftFileInfo = env.getFilePath();
-			String nextRightFileInfo = emptyString;
-
-			env = this.transitions.getCurrentTransition().getMatch_envelope();
-			if (env != null) {
-				nextRightFileInfo = env.getFilePath();
-			}
-
-			final IPath nextLeftFilePath = new Path(nextLeftFileInfo);
-			final String nextLeftFileName = nextLeftFilePath.lastSegment();
-			String nextRightFileName = emptyString;
-
-			if (nextRightFileInfo.length() != 0) {
-				final IPath nextRightFilePath = new Path(nextRightFileInfo);
-				nextRightFileName = nextRightFilePath.lastSegment();
-			}
-
-			final boolean updateWindowContent = this.currLeftFile == null || this.currRightFile == null
-					|| !nextLeftFileName.equals(this.currLeftFile.getName())
-					|| !nextRightFileName.equals(this.currRightFile.getName()) || nextRightFileInfo.equals(emptyString);
-
-			if (updateWindowContent) {
-				final String projectName = this.activeFile.getProject().getName();
-				final IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-
-				// Get the next left and right source files for the code viewers
-				final IFile nextLeftSourceFile = GemUtilities.getSourceFile(nextLeftFileInfo, this.activeFile);
-				if (!nextLeftSourceFile.exists()) {
-					GemUtilities.refreshProject(currentProject);
-				}
-
-				IFile nextRightSourceFile = null;
-				final boolean isEmptyPath = nextRightFileInfo.length() == 0;
-				if (!isEmptyPath) {
-					nextRightSourceFile = GemUtilities.getSourceFile(nextRightFileInfo, this.activeFile);
-					if (!nextRightSourceFile.exists()) {
-						GemUtilities.refreshProject(currentProject);
-					}
-				}
-
-				// Now parse the files for new code viewer window content
-				parseSourceFile(nextLeftSourceFile, (isEmptyPath) ? null : nextRightSourceFile);
-			}
-		}
-	}
-
-	/**
-	 * Calling this method will update the drop down so that it has the correct
-	 * number of processes displayed. This method is used when another location
-	 * changes the number of processes preference.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void updateDropDown() {
-		final Integer nprocs = GemPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		this.setNumProcsComboList.setText(nprocs.toString());
-	}
-
-	/*
-	 * Goes to the First Transition and updates all relevant data
-	 */
-	private void updateFirstTransition(boolean update) {
-		// Goes to null
-		Envelope env = this.transitions.getFirstTransition(this.lockedRank);
-		env = this.transitions.getCurrentTransition();
-
-		if (env != null) {
-			this.previousLeftIndex = env.getLinenumber();
-		}
-
-		if (env == null) {
-			GemUtilities.showInformationDialog(Messages.GemAnalyzer_94);
-			return;
-		}
-
-		if (update) {
-			setButtonEnabledState();
-			updateCodeViewers();
-			displayEnvelopes(env);
-			updateSelectedLine(true);
-			this.transitionLabelIndex = 1;
-			setMessageLabelText();
-		}
-	}
-
-	/*
-	 * Goes to the last transition and updates relevant information
-	 */
-	private void updateLastTransition() {
-		Envelope env = this.transitions.getLastTransition(this.lockedRank);
-
-		// stepToLastTransition puts us at the last iteration of Finalize
-		// other code always assumes we are on the first iteration of
-		// each call though, so here we go back to the first iteration
-		if (env.getFunctionName().equals("MPI_Finalize")) { //$NON-NLS-1$
-			while (true) {
-				env = this.transitions.getPreviousTransition(this.lockedRank);
-
-				if (env == null) {
-					GemUtilities.showInformationDialog(Messages.GemAnalyzer_95);
-					return;
-				}
-				// If there was only one finalize go back to it
-				if (!env.getFunctionName().equals("MPI_Finalize")) { //$NON-NLS-1$
-					env = this.transitions.getNextTransition(this.lockedRank);
-					break;
-				}
-			}
-		}
-
-		if (env == null) {
-			GemUtilities.showInformationDialog(Messages.GemAnalyzer_96);
-			return;
-		}
-		this.previousLeftIndex = env.getLinenumber();
-		setButtonEnabledState();
-		updateCodeViewers();
-		displayEnvelopes(env);
-		updateSelectedLine(true);
-		this.transitionLabelIndex = this.transitionLabelCount;
-		setMessageLabelText();
-	}
-
-	/*
-	 * This method is used to highlight ALL lines involved in a call when the
-	 * call is spread over multiple lines in the source code file.
-	 */
-	private void updateLineCount() {
-		final List leftList = this.leftViewer.getList();
-		final List rightList = this.rightViewer.getList();
-		final String emptyString = ""; //$NON-NLS-1$
-
-		String curr = emptyString;
-		this.leftLines = 1;
-		if (this.leftIndex <= 0) {
-			this.leftLines = 0;
-			return;
-		}
-		while (this.leftLines < this.leftIndex + 1) {
-			// Get current string
-			curr = emptyString;
-			for (int i = this.leftLines; i > 0; i--) {
-				curr += leftList.getItem(this.leftIndex - i);
-				curr = removeComments(curr);
-			}
-
-			if (this.parenthesesMatched(curr)) {
-				break;
-			}
-			this.leftLines++;
-		}
-		// Be sure to include the MPI Call
-		curr = curr.substring(0, curr.indexOf("(") - 1); //$NON-NLS-1$
-		if (curr.trim().length() == 0) {
-			this.leftLines++;
-		}
-
-		if (this.rightIndex == -1) {
-			return;
-		}
-		this.rightLines = 1;
-
-		while (this.rightLines < this.rightIndex + 1) {
-			// Get current string
-			curr = emptyString;
-			for (int i = this.rightLines; i > 0; i--) {
-				curr += rightList.getItem(this.rightIndex - i);
-				curr = removeComments(curr);
-			}
-
-			if (this.parenthesesMatched(curr)) {
-				break;
-			}
-			this.rightLines++;
-		}
-		curr = curr.substring(0, curr.indexOf("(") - 1); //$NON-NLS-1$
-		if (curr.trim().length() == 0) {
-			this.rightLines++;
-		}
-	}
-
-	/*
-	 * Go to the next transition. Returns 1 if successful, -1 if there was no
-	 * where to go.
-	 */
-	private int updateNextTransition(boolean update) {
-		int returnValue = 1;
-		Envelope env = this.transitions.getNextTransition(this.lockedRank);
-
-		if (env.isCollective() && this.lockedRank == -1) {
-			env = skipRepeats(1);
-		}
-
-		if (env == null) {
-			returnValue = -1;
-		} else {
-			this.previousLeftIndex = env.getLinenumber();
-		}
-
-		if (update) {
-			setButtonEnabledState();
-			updateCodeViewers();
-			displayEnvelopes(env);
-			updateSelectedLine(true);
-			this.transitionLabelIndex++;
-			setMessageLabelText();
-		}
-		return returnValue;
-	}
-
-	/*
-	 * Goes to the previous transition and updates relevant data
-	 */
-	private void updatePreviousTransition() {
-		Envelope env = this.transitions.getPreviousTransition(this.lockedRank);
-		this.previousLeftIndex = env.getLinenumber();
-
-		// Go back until you reach the first call or beginning
-		if (env.isCollective() && this.lockedRank == -1) {
-			while (true) {
-				env = this.transitions.getPreviousTransition(this.lockedRank);
-				if (env == null) {
-					updateFirstTransition(true);
-					return;
-				}
-				if (env.getLinenumber() != this.previousLeftIndex) {
-					env = this.transitions.getNextTransition(this.lockedRank);
-					break;
-				}
-			}
-		}
-
-		this.previousLeftIndex = env.getLinenumber();
-		setButtonEnabledState();
-		updateCodeViewers();
-		displayEnvelopes(env);
-		updateSelectedLine(true);
-		this.transitionLabelIndex--;
-		setMessageLabelText();
-	}
-
-	/*
-	 * Updates the relative position of the scroll bar for the list viewers in
-	 * the code windows.
-	 */
-	private void updateScrollBars() {
-		final List leftList = this.leftViewer.getList();
-		final List rightList = this.rightViewer.getList();
-
-		try {
-			if (leftList != null && leftList.getSelection().length != 0) {
-				this.leftViewer.reveal(this.leftViewer.getElementAt(0));
-				this.leftViewer.reveal(this.leftViewer.getElementAt(this.leftIndex - 1));
-			}
-			if (rightList != null && rightList.getSelection().length != 0) {
-				this.rightViewer.reveal(this.rightViewer.getElementAt(0));
-				this.rightViewer.reveal(this.rightViewer.getElementAt(this.rightIndex - 1));
-			}
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-	}
-
-	/*
-	 * Updates which line of the log file that is currently in focus.
-	 */
-	private void updateSelectedLine(Boolean scroll) {
-		updateCodeViewers();
-
-		// Deselect Everything
-		final List leftList = this.leftViewer.getList();
-		final List rightList = this.rightViewer.getList();
-		leftList.deselectAll();
-		rightList.deselectAll();
-
-		updateLineCount();
-
-		// Update left view (-1, 0-based)
-		for (int i = 0; i < this.leftLines; i++) {
-			leftList.select((this.leftIndex - i) - 1);
-		}
-
-		// Update right view (-1, 0-based)
-		for (int i = 0; i < this.rightLines; i++) {
-			rightList.select((this.rightIndex - i) - 1);
-		}
-
-		if (scroll) {
-			updateScrollBars();
-		}
-	}
-
-	// ONLY CALL WHEN YOU HAVE STARTED A NEW INTERLEAVING!!!
-	// As it searches it will never display the envelope
-	// displayEnvelope decides whether or not the final destination is displayed
-	private void updateTransitionLabels(boolean displayEnvelope) {
-		updateFirstTransition(false);
-
-		// because only incremented if next transition is also valid
-		this.transitionLabelCount = 1;
-		final Envelope env = this.transitions.getCurrentTransition();
-
-		int test = 1;
-		while (test == 1 && env != null) {
-			if (this.transitions.hasValidNextTransition(this.lockedRank)) {
-				this.transitionLabelCount++;
-				test = updateNextTransition(false);
-			} else {
-				break;
-			}
-		}
-		updateFirstTransition(displayEnvelope);
-	}
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemBrowser.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemBrowser.java
deleted file mode 100644
index be8b027..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemBrowser.java
+++ /dev/null
@@ -1,1029 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.views;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.preferences.PreferenceConstants;
-import org.eclipse.ptp.internal.gem.util.Envelope;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.ptp.internal.gem.util.Transitions;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The GEM Analyzer View.
- */
-public class GemBrowser extends ViewPart {
-
-	// The ID for this view
-	public static final String ID = "org.eclipse.ptp.gem.views.GemBrowser"; //$NON-NLS-1$
-
-	// Data structures and more complex members
-	private Transitions transitions;
-
-	// Container objects and actions
-	private Composite parent;
-	private Action getHelpAction;
-	private Action terminateOperationAction;
-	private Action writeToLocalFileAction;
-
-	// SWT widgets
-	private Button runGemButton;
-	private Combo setNumProcsComboList;
-	private CTabFolder tabFolder;
-	private CLabel summaryLabel;
-
-	// Threads
-	private Thread browserUpdateThread;
-	private Thread clearBrowserThread;
-	private Thread disableTerminateButtonThread;
-
-	// Misc
-	private int errorCount;
-	private int warningCount;
-
-	// Create a listener to allow "jumps" to the Editor
-	SelectionListener listener = new SelectionAdapter() {
-		@Override
-		public void widgetSelected(SelectionEvent event) {
-			String eventText = null;
-			IFile sourceFile = null;
-			Integer lineNumber = null;
-
-			final Object o = event.getSource();
-			if (o instanceof Tree) {
-				final TreeItem selectionItem = (TreeItem) event.item;
-
-				// Only child items will have a non-null parent
-				// then see if child item text matches regex
-				if (selectionItem.getParentItem() != null) {
-					eventText = selectionItem.toString();
-					final Pattern browserLinePattern = Pattern.compile("^(.+?)\\s+(.+?)\\s+(.+?)\\s+(.+?)\\s+(.+?)"); //$NON-NLS-1$
-					final Matcher browserLineMatcher = browserLinePattern.matcher(eventText);
-
-					if (browserLineMatcher.matches()) {
-						final String filePathString = browserLineMatcher.group(3);
-						String lineNumStr = browserLineMatcher.group(5);
-
-						final Pattern lineNumberPattern = Pattern.compile("(^[0-9]+)?+(.+?)"); //$NON-NLS-1$
-						final Matcher lineNumberMatcher = lineNumberPattern.matcher(lineNumStr);
-
-						if (lineNumberMatcher.matches()) {
-							lineNumStr = lineNumberMatcher.group(1);
-							lineNumber = Integer.parseInt(lineNumStr);
-							sourceFile = GemUtilities.getSourceFile(filePathString, GemUtilities.getProjectLogFile());
-							if (sourceFile != null) {
-								openEditor(lineNumber, sourceFile);
-							} else {
-								final String message = Messages.GemBrowser_0 + filePathString;
-								GemUtilities.showErrorDialog(message);
-								return;
-							}
-						}
-					}
-				}
-			}
-		}
-	};
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param none
-	 */
-	public GemBrowser() {
-		super();
-	}
-
-	/**
-	 * Brings this ViewPart to the front and gives it focus.
-	 * 
-	 * @param none
-	 * @return none
-	 */
-	public void activate() {
-		final Thread activationThread = new Thread() {
-			@Override
-			public void run() {
-				final IWorkbench wb = PlatformUI.getWorkbench();
-				final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-				if (page != null) {
-					page.activate(GemBrowser.this);
-				}
-			}
-		};
-
-		// We need to switch to the thread that is allowed to change the UI
-		Display.getDefault().syncExec(activationThread);
-	}
-
-	/**
-	 * Runs a thread that clears the Browser view.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void clear() {
-		Display.getDefault().syncExec(this.clearBrowserThread);
-	}
-
-	/*
-	 * Calls finer grained methods, populating the view action bar.
-	 */
-	private void contributeToActionBars() {
-		final IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	/*
-	 * Creates a single string containing all information on the issues found.
-	 * This string is formatted for easy parsing/reading
-	 */
-	private String createBrowserSummary() {
-		String result = ""; //$NON-NLS-1$
-		final String newline = System.getProperty("line.separator"); //$NON-NLS-1$
-		try {
-			final int tabCount = this.tabFolder.getItemCount();
-			for (int tabIndex = 0; tabIndex < tabCount; tabIndex++) {
-				final CTabItem currentTab = this.tabFolder.getItem(tabIndex);
-				final String tabTitle = currentTab.getText();
-				final Tree tree = (Tree) currentTab.getControl();
-				result += tabTitle + newline;
-
-				final int numInterleavings = tree.getItemCount();
-				for (int interIndex = 0; interIndex < numInterleavings; interIndex++) {
-					final TreeItem currInter = tree.getItem(interIndex);
-					final String interleavingName = "\t" + currInter.getText() + newline; //$NON-NLS-1$
-
-					result += interleavingName;
-					final int itemCount = currInter.getItemCount();
-					for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) {
-						final TreeItem item = currInter.getItem(itemIndex);
-						String line = item.getText() + newline;
-						line = "\t\t" + line; //$NON-NLS-1$
-						result += line;
-					}
-				}
-				result += newline;
-			}
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-			result = Messages.GemBrowser_6;
-		}
-		return result;
-	}
-
-	/**
-	 * Callback that allows us to create the viewer and initialize it.
-	 * 
-	 * @param parent
-	 *            The parent Composite for this View.
-	 * @return void
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-		this.parent = parent;
-
-		// Create layout for the parent Composite
-		final GridLayout parentLayout = new GridLayout();
-		parentLayout.numColumns = 1;
-		parentLayout.marginHeight = 10;
-		parentLayout.marginWidth = 10;
-		parent.setLayout(parentLayout);
-
-		// Creates groups and selection listeners
-		createRuntimeComposite(parent);
-
-		// create actions & connect to buttons, context menus and pull-downs
-		createSelectionListeners();
-		makeActions();
-		contributeToActionBars();
-
-		// Create the Tab Folder
-		this.tabFolder = new CTabFolder(parent, SWT.TOP);
-		this.tabFolder.setSimple(false);
-		this.tabFolder.setSingle(false);
-		this.tabFolder.setBorderVisible(true);
-		this.tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createRuntimeComposite(Composite parent) {
-		final Image trident = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/trident.gif")); //$NON-NLS-1$
-		final Composite runtimeComposite = new Composite(parent, SWT.NULL);
-		runtimeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
-		runtimeComposite.setLayout(new FormLayout());
-
-		// Call ISP button
-		this.runGemButton = new Button(runtimeComposite, SWT.PUSH);
-		this.runGemButton.setImage(trident);
-		this.runGemButton.setToolTipText(Messages.GemBrowser_7);
-		this.runGemButton.setEnabled(true);
-		final FormData launchIspUIFormData = new FormData();
-		launchIspUIFormData.right = new FormAttachment(100, -5);
-		launchIspUIFormData.bottom = new FormAttachment(100, -5);
-		this.runGemButton.setLayoutData(launchIspUIFormData);
-
-		// Set number of processes button
-		this.setNumProcsComboList = new Combo(runtimeComposite, SWT.DROP_DOWN);
-		final Font setRankComboFont = setFontSize(this.setNumProcsComboList.getFont(), 9);
-		this.setNumProcsComboList.setFont(setRankComboFont);
-		final String[] items = new String[] {};
-		this.setNumProcsComboList.setItems(items);
-		this.setNumProcsComboList.setText(" "); //$NON-NLS-1$
-		this.setNumProcsComboList.setToolTipText(Messages.GemBrowser_8);
-		final FormData setRankFormData = new FormData();
-		setRankFormData.width = 50;
-		setRankFormData.right = new FormAttachment(this.runGemButton, -5);
-		setRankFormData.bottom = new FormAttachment(100, -5);
-		this.setNumProcsComboList.setLayoutData(setRankFormData);
-		this.setNumProcsComboList.setEnabled(true);
-		setNumProcItems();
-		updateDropDown();
-
-		// Add a label explaining how to use this view
-		this.summaryLabel = new CLabel(runtimeComposite, SWT.BORDER_SOLID);
-		this.summaryLabel.setRightMargin(275);
-		final FormData labelData = new FormData();
-		labelData.width = 200;
-		labelData.right = new FormAttachment(this.setNumProcsComboList, -5);
-		labelData.bottom = new FormAttachment(0, 0);
-		this.setNumProcsComboList.setLayoutData(setRankFormData);
-	}
-
-	/*
-	 * Helper method called by createPartControl.
-	 */
-	private void createSelectionListeners() {
-		// To conveniently run GEM from this view
-		this.runGemButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				final IPreferenceStore pstore = GemPlugin.getDefault().getPreferenceStore();
-				URI inputLocation = null;
-				IPath path = null;
-
-				try {
-					inputLocation = new URI(pstore.getString(PreferenceConstants.GEM_PREF_MOST_RECENT_FILE));
-				} catch (final URISyntaxException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-				if (inputLocation != null) {
-					path = new Path(inputLocation.getPath());
-				}
-				if (!GemUtilities.isProjectActive()) {
-					GemUtilities.setTaskStatus(GemUtilities.TaskStatus.ABORTED);
-					return;
-				}
-				final IFile file = GemUtilities.getCurrentProject().getFile(path.lastSegment());
-				path = file.getFullPath();
-				final String extension = file.getFileExtension();
-				boolean isSourceFile = false;
-
-				if (extension != null) {
-					// The most common C & C++ source file extensions
-					isSourceFile = extension.equals("c") //$NON-NLS-1$
-							|| extension.equals("cpp") || extension.equals("c++") //$NON-NLS-1$ //$NON-NLS-2$
-							|| extension.equals("cc") || extension.equals("cp"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-
-				// ask for command line arguments
-				GemUtilities.setCommandLineArgs();
-
-				// Open Analyzer and Browser Views in preference order
-				// Find the active editor
-				final IWorkbench wb = PlatformUI.getWorkbench();
-				final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-
-				try {
-					final String activeView = pstore.getString(PreferenceConstants.GEM_ACTIVE_VIEW);
-					if (activeView.equals("analyzer")) { //$NON-NLS-1$
-						page.showView(GemBrowser.ID);
-						page.showView(GemAnalyzer.ID);
-					} else {
-						page.showView(GemAnalyzer.ID);
-						page.showView(GemBrowser.ID);
-					}
-					GemUtilities.initGemViews(file, isSourceFile, true);
-				} catch (final PartInitException e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			}
-		});
-
-		this.setNumProcsComboList.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent event) {
-				if (GemBrowser.this.setNumProcsComboList.getText() == null) {
-					return;
-				}
-
-				final String nprocsStr = GemBrowser.this.setNumProcsComboList.getItems()[GemBrowser.this.setNumProcsComboList
-						.getSelectionIndex()];
-				final int newNumProcs = Integer.parseInt(nprocsStr);
-
-				// Reset the numProcs value in the preference store
-				GemPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.GEM_PREF_NUMPROCS, newNumProcs);
-
-				// If the analyzer is open updates its drop down
-				try {
-					final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-					final IViewPart gemViewPart = window.getActivePage().findView(GemAnalyzer.ID);
-					final GemAnalyzer analyzer = (GemAnalyzer) gemViewPart;
-					analyzer.updateDropDown();
-				} catch (final Exception e) {
-					GemUtilities.logExceptionDetail(e);
-				}
-			}
-		});
-	}
-
-	/*
-	 * Creates a tab in the specified folder at the specified index which is
-	 * filled with all assertion violations that were found or by a message
-	 * indicating that none are present.
-	 */
-	private void fillAssertionViolationTab(CTabFolder tabFolder, int tabIndex) {
-
-		// Create the tab and the tree it holds
-		new CTabItem(tabFolder, SWT.NONE, tabIndex).setText(Messages.GemBrowser_11);
-		final CTabItem assertTab = tabFolder.getItem(tabIndex);
-		assertTab.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif")));//$NON-NLS-1$
-		assertTab.setToolTipText(Messages.GemBrowser_12);
-		final Tree tree = new Tree(tabFolder, SWT.BORDER);
-		assertTab.setControl(tree);
-		tree.setLinesVisible(true);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(setFontSize(tree.getFont(), 8));
-		TreeItem interleavingItem = null;
-		TreeItem fileItem = null;
-
-		// Parse the resource leak list and populate tree.
-		final int totalInterleavings = this.transitions.getTotalInterleavings();
-		boolean errorFound = false;
-		for (int j = 0; j <= totalInterleavings; j++) {
-			if (this.transitions.getErrorCalls() == null || this.transitions.getErrorCalls().get(j) == null) {
-				continue;
-			}
-
-			final int listSize = this.transitions.getErrorCalls().get(j).size();
-			final HashMap<String, Envelope> map = this.transitions.getErrorCalls().get(j);
-			if (map == null) {
-				continue;
-			}
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText("Interleaving: " + j); //$NON-NLS-1$
-			for (int i = 0; i < listSize; i++) {
-				final Collection<Envelope> collection = map.values();
-				Object[] calls = new Object[collection.size()];
-				calls = collection.toArray();
-				final Envelope env = (Envelope) calls[i];
-
-				// If it is not an assertion violation move on
-				if (!env.getFunctionName().equalsIgnoreCase("mpi_assert")) { //$NON-NLS-1$
-					continue;
-				}
-
-				errorFound = true;
-
-				final IFile sourceFile = GemUtilities.getSourceFile(env.getFilePath(), GemUtilities.getProjectLogFile());
-				if (sourceFile != null) {
-					final String basePath = sourceFile.getFullPath().toPortableString();
-					fileItem = new TreeItem(interleavingItem, SWT.NULL);
-					fileItem.setText(env.getFunctionName() + "\t" + basePath + "\tLine: " + env.getLinenumber()); //$NON-NLS-1$ //$NON-NLS-2$
-					this.errorCount++;
-				} else {
-					clear();
-					GemUtilities.showErrorDialog(Messages.GemBrowser_1);
-					break;
-				}
-			}
-			// If nothing was added for this interleaving remove the item
-			if (interleavingItem.getItemCount() < 1) {
-				interleavingItem.dispose();
-			}
-		}
-		if (!errorFound) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_14);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif"));//$NON-NLS-1$
-			assertTab.setImage(noErrorImage);
-		}
-
-		// Add a selection listener so a click will open the entry in the editor
-		tree.addSelectionListener(this.listener);
-	}
-
-	/*
-	 * Populates the this viewer with tabs holding the problems that were found.
-	 */
-	private void fillBrowserTabs() {
-		final Boolean FIB = GemPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.GEM_PREF_FIB);
-
-		int tabIndex = 0;
-		fillDeadlockTab(this.tabFolder, tabIndex++);
-		fillAssertionViolationTab(this.tabFolder, tabIndex++);
-		fillResourceLeaksTab(this.tabFolder, tabIndex++);
-		if (FIB) {
-			fillIrrelevantBarrierTab(this.tabFolder, tabIndex++);
-		}
-		fillTypeMismatchTab(this.tabFolder, tabIndex++);
-
-		// Open up the first tab
-		this.tabFolder.setSelection(this.tabFolder.getItem(0));
-		this.tabFolder.showSelection();
-
-		// Set the label's text and icon
-		final String errString = (this.errorCount == 1) ? Messages.GemBrowser_15 : Messages.GemBrowser_16;
-		final String warnString = (this.warningCount == 1) ? Messages.GemBrowser_17 : Messages.GemBrowser_18;
-		this.summaryLabel.setText(this.errorCount + " " + errString + " " + this.warningCount + " " + warnString); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		if (this.errorCount == 0 && this.warningCount == 0) {
-			this.summaryLabel.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif")));//$NON-NLS-1$
-		} else {
-			this.summaryLabel.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif")));//$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * Calling this will create a tab filled with the errors found or a message
-	 * indicating your clean bill of health
-	 */
-	private void fillDeadlockTab(CTabFolder tabFolder, int tabIndex) {
-
-		// Create the Tab and the tree it holds
-		new CTabItem(tabFolder, SWT.NONE, tabIndex).setText(Messages.GemBrowser_19);
-		final CTabItem errorTab = tabFolder.getItem(tabIndex);
-		errorTab.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif")));//$NON-NLS-1$
-		errorTab.setToolTipText(Messages.GemBrowser_20);
-		final Tree tree = new Tree(tabFolder, SWT.BORDER);
-		errorTab.setControl(tree);
-		tree.setLinesVisible(true);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(setFontSize(tree.getFont(), 8));
-		TreeItem interleavingItem = null;
-		TreeItem fileItem = null;
-
-		// Parse the resource leak list and populate tree.
-		final int totalInterleavings = this.transitions.getTotalInterleavings();
-		boolean errorFound = false;
-		for (int i = 0; i <= totalInterleavings; i++) {
-			if (this.transitions.getErrorCalls() == null || this.transitions.getErrorCalls().get(i) == null) {
-				continue;
-			}
-			final HashMap<String, Envelope> map = this.transitions.getErrorCalls().get(i);
-			if (map == null) {
-				continue;
-			}
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText("Interleaving: " + i); //$NON-NLS-1$
-			final Collection<Envelope> collection = map.values();
-			final Iterator<Envelope> itr = collection.iterator();
-			while (itr.hasNext()) {
-				final Envelope env = itr.next();
-
-				// If it is an assertion violation move on
-				if (env.getFunctionName().equalsIgnoreCase("mpi_assert")) { //$NON-NLS-1$
-					continue;
-				}
-				errorFound = true;
-
-				final IFile sourceFile = GemUtilities.getSourceFile(env.getFilePath(), GemUtilities.getProjectLogFile());
-				if (sourceFile != null) {
-					final String basePath = sourceFile.getFullPath().toPortableString();
-					fileItem = new TreeItem(interleavingItem, SWT.NULL);
-					fileItem.setText(env.getFunctionName() + "\t" + basePath + "\tLine: " + env.getLinenumber()); //$NON-NLS-1$ //$NON-NLS-2$
-					this.errorCount++;
-				} else {
-					clear();
-					GemUtilities.showErrorDialog(Messages.GemBrowser_2);
-					break;
-				}
-			}
-
-			// If nothing was added for this interleaving remove the item
-			if (interleavingItem.getItemCount() < 1) {
-				interleavingItem.dispose();
-			}
-		}
-		if (!errorFound) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_22);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif"));//$NON-NLS-1$
-			errorTab.setImage(noErrorImage);
-		}
-
-		// Add a selection listener so a click will open the entry in the editor
-		tree.addSelectionListener(this.listener);
-	}
-
-	/*
-	 * Creates a tab in the specified folder at the specified index that is
-	 * filled with all irrelevant barriers that were found or by a message that
-	 * either says that there are no irrelevant barriers or that FIB is
-	 * disabled.
-	 */
-	private void fillIrrelevantBarrierTab(CTabFolder tabFolder, int tabIndex) {
-
-		// Create the tab and the tree inside it
-		new CTabItem(tabFolder, SWT.NONE, tabIndex).setText(Messages.GemBrowser_23);
-		final CTabItem IBTab = tabFolder.getItem(tabIndex);
-		IBTab.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif")));//$NON-NLS-1$
-		IBTab.setToolTipText(Messages.GemBrowser_24);
-		final Tree tree = new Tree(tabFolder, SWT.BORDER);
-		IBTab.setControl(tree);
-		tree.setLinesVisible(true);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(setFontSize(tree.getFont(), 8));
-		TreeItem interleavingItem = null;
-		TreeItem fileItem = null;
-
-		/* Populate the tab */
-		// If FIB is disabled tell the user
-		final Boolean FIB = GemPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.GEM_PREF_FIB);
-		if (!FIB) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_25);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/help-contents.gif"));//$NON-NLS-1$
-			IBTab.setImage(noErrorImage);
-		}
-		// If there is a deadlock then FIB does not function properly
-		else if (this.transitions.hasDeadlock()) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_26);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/help-contents.gif"));//$NON-NLS-1$
-			IBTab.setImage(noErrorImage);
-		} else if (this.transitions.getIrrelevantBarriers() == null) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_27);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif"));//$NON-NLS-1$
-			IBTab.setImage(noErrorImage);
-		}
-
-		else {
-			final HashMap<Integer, String> fibs = this.transitions.getIrrelevantBarriers();
-			TreeItem group = null;
-			int groupNumber = 0;
-
-			final Collection<String> fibList = fibs.values();
-			final Iterator<String> itr = fibList.iterator();
-			while (itr.hasNext()) {
-				final String line = itr.next();
-				if (group == null) {
-					group = new TreeItem(tree, SWT.NULL);
-					group.setText("Interleaving: " + (++groupNumber)); //$NON-NLS-1$
-				}
-
-				final StringTokenizer tokenizer = new StringTokenizer(line);
-				final String filePathString = tokenizer.nextToken();
-				final String lineNumber = tokenizer.nextToken();
-
-				final IFile sourceFile = GemUtilities.getSourceFile(filePathString, GemUtilities.getProjectLogFile());
-				if (sourceFile != null) {
-					final String basePath = sourceFile.getFullPath().toPortableString();
-					final String text = "FIB" + "\t" + basePath + "\tLine: " + lineNumber; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					fileItem = new TreeItem(group, SWT.NULL);
-					fileItem.setText(text);
-					this.warningCount++;
-				} else {
-					clear();
-					GemUtilities.showErrorDialog(Messages.GemBrowser_3);
-					break;
-				}
-			}
-
-			// Add selection listener so a click will open entry in the editor
-			tree.addSelectionListener(this.listener);
-		}
-	}
-
-	/*
-	 * Populates the view pull-down menu.
-	 */
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(this.terminateOperationAction);
-		this.terminateOperationAction.setText(Messages.GemBrowser_29);
-		manager.add(new Separator());
-		manager.add(this.writeToLocalFileAction);
-		this.writeToLocalFileAction.setText(Messages.GemBrowser_30);
-		manager.add(new Separator());
-		manager.add(this.getHelpAction);
-		manager.add(new Separator());
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Contributes icons and actions to the tool bar.
-	 */
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(this.terminateOperationAction);
-		manager.add(this.writeToLocalFileAction);
-		manager.add(this.getHelpAction);
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Creates a tab in the specified folder at the specified index filled with
-	 * all leaks that were found or by a message indicating that there are none.
-	 */
-	private void fillResourceLeaksTab(CTabFolder tabFolder, int tabIndex) {
-
-		// Create the tab and the tree
-		new CTabItem(tabFolder, SWT.NONE, tabIndex).setText(Messages.GemBrowser_31);
-		final CTabItem leakTab = tabFolder.getItem(tabIndex);
-		leakTab.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif"))); //$NON-NLS-1$
-		leakTab.setToolTipText(Messages.GemBrowser_32);
-		final Tree tree = new Tree(tabFolder, SWT.BORDER);
-		leakTab.setControl(tree);
-		tree.setLinesVisible(true);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(setFontSize(tree.getFont(), 8));
-		TreeItem interleavingItem = null;
-		TreeItem fileItem = null;
-
-		// Parse the resource leak list and populate tree.
-		int prevInterleaving = -1;
-		final HashMap<Integer, Envelope> leaks = this.transitions.getResourceLeaks();
-
-		if (leaks == null) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText(Messages.GemBrowser_33);
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif")); //$NON-NLS-1$
-			leakTab.setImage(noErrorImage);
-		} else {
-			final Collection<Envelope> leakList = leaks.values();
-			final Iterator<Envelope> itr = leakList.iterator();
-			while (itr.hasNext()) {
-				final Envelope env = itr.next();
-				if (prevInterleaving != env.getInterleaving()) {
-					interleavingItem = new TreeItem(tree, SWT.NULL);
-					interleavingItem.setText("Interleaving: " + env.getInterleaving()); //$NON-NLS-1$
-					prevInterleaving = env.getInterleaving();
-				}
-
-				final IFile sourceFile = GemUtilities.getSourceFile(env.getFilePath(), GemUtilities.getProjectLogFile());
-				if (sourceFile != null) {
-					final String basePath = sourceFile.getFullPath().toPortableString();
-					final String text = env.getLeakResource() + "\t" + basePath + "\tLine: " + env.getLinenumber(); //$NON-NLS-1$ //$NON-NLS-2$
-					fileItem = new TreeItem(interleavingItem, SWT.NULL);
-					fileItem.setText(text);
-					this.warningCount++;
-				} else {
-					clear();
-					GemUtilities.showErrorDialog(Messages.GemBrowser_4);
-					break;
-				}
-			}
-		}
-
-		// Add a selection listener so a click will open the entry in the editor
-		tree.addSelectionListener(this.listener);
-	}
-
-	/*
-	 * Creates a tab in the specified folder at the specified index that is
-	 * filled with all MPI type mismatches that were found.
-	 */
-	private void fillTypeMismatchTab(CTabFolder tabFolder, int tabIndex) {
-
-		// Create the tab and the tree inside it
-		new CTabItem(tabFolder, SWT.NONE, tabIndex).setText("Type Mismatches"); //$NON-NLS-1$
-		final CTabItem IBTab = tabFolder.getItem(tabIndex);
-		IBTab.setImage(GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/magnified-trident.gif")));//$NON-NLS-1$
-		IBTab.setToolTipText("Browse Type Mismatches"); //$NON-NLS-1$
-		final Tree tree = new Tree(tabFolder, SWT.BORDER);
-		IBTab.setControl(tree);
-		tree.setLinesVisible(true);
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setFont(setFontSize(tree.getFont(), 8));
-		TreeItem interleavingItem = null;
-		TreeItem fileItem = null;
-
-		/* Populate the tab */
-		if (this.transitions.getTypeMismatches() == null) {
-			interleavingItem = new TreeItem(tree, SWT.NULL);
-			interleavingItem.setText("No Type Mismatches Found"); //$NON-NLS-1$
-			final Image noErrorImage = GemPlugin.getImage(GemPlugin.getImageDescriptor("icons/no-error.gif"));//$NON-NLS-1$
-			IBTab.setImage(noErrorImage);
-		} else {
-			final HashMap<Integer, String> mismatches = this.transitions.getTypeMismatches();
-			TreeItem group = null;
-			int groupNumber = 0;
-
-			final Collection<String> mismatchList = mismatches.values();
-			final Iterator<String> itr = mismatchList.iterator();
-			while (itr.hasNext()) {
-				final String line = itr.next();
-				if (group == null) {
-					group = new TreeItem(tree, SWT.NULL);
-					group.setText("Interleaving: " + (++groupNumber)); //$NON-NLS-1$
-				}
-
-				final StringTokenizer tokenizer = new StringTokenizer(line);
-				final String filePathString = tokenizer.nextToken();
-				final String lineNumber = tokenizer.nextToken();
-
-				final IFile sourceFile = GemUtilities.getSourceFile(filePathString, GemUtilities.getProjectLogFile());
-				if (sourceFile != null) {
-					final String basePath = sourceFile.getFullPath().toPortableString();
-					final String text = "Type_Mismatch" + "\t" + basePath + "\tLine: " + lineNumber; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					fileItem = new TreeItem(group, SWT.NULL);
-					fileItem.setText(text);
-					this.warningCount++;
-				} else {
-					clear();
-					GemUtilities.showErrorDialog(Messages.GemBrowser_5);
-					break;
-				}
-			}
-
-			// Add selection listener so a click will open entry in the editor
-			tree.addSelectionListener(this.listener);
-		}
-	}
-
-	/**
-	 * Initializing everything for this view and creates threads to be used by
-	 * the main UI thread to do updates.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void init() {
-
-		this.browserUpdateThread = new Thread() {
-			@Override
-			public void run() {
-				reset();
-				fillBrowserTabs();
-				Display.getDefault().syncExec(GemBrowser.this.disableTerminateButtonThread);
-			}
-		};
-
-		this.clearBrowserThread = new Thread() {
-			@Override
-			public void run() {
-				GemBrowser.this.terminateOperationAction.setEnabled(false);
-				GemBrowser.this.writeToLocalFileAction.setEnabled(false);
-				GemBrowser.this.runGemButton.setEnabled(true);
-				GemBrowser.this.transitions = null;
-				GemBrowser.this.errorCount = 0;
-				GemBrowser.this.warningCount = 0;
-				GemBrowser.this.summaryLabel.setText(""); //$NON-NLS-1$
-				GemBrowser.this.summaryLabel.setImage(null);
-				removeTabs();
-				GemUtilities.setTaskStatus(GemUtilities.TaskStatus.IDLE);
-			}
-		};
-
-		this.disableTerminateButtonThread = new Thread() {
-			@Override
-			public void run() {
-				GemBrowser.this.terminateOperationAction.setEnabled(false);
-				GemBrowser.this.writeToLocalFileAction.setEnabled(true);
-				GemBrowser.this.runGemButton.setEnabled(true);
-			}
-		};
-
-		// start things up now
-		this.writeToLocalFileAction.setEnabled(false);
-		this.terminateOperationAction.setEnabled(true);
-		this.runGemButton.setEnabled(false);
-	}
-
-	/*
-	 * Creates the actions associated with the action bar buttons and context
-	 * menu items.
-	 */
-	private void makeActions() {
-		// Get Help Action
-		this.getHelpAction = new Action() {
-			@Override
-			public void run() {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelpResource("/org.eclipse.ptp.gem.help/html/browserView.html"); //$NON-NLS-1$
-			}
-		};
-		this.getHelpAction.setToolTipText(Messages.GemBrowser_39);
-		this.getHelpAction.setImageDescriptor(GemPlugin.getImageDescriptor("icons/help-contents.gif")); //$NON-NLS-1$
-
-		// Terminate Process Action
-		this.terminateOperationAction = new Action() {
-			@Override
-			public void run() {
-				GemUtilities.terminateOperation();
-			}
-		};
-		this.terminateOperationAction.setImageDescriptor(GemPlugin.getImageDescriptor("icons/progress_stop.gif")); //$NON-NLS-1$
-		this.terminateOperationAction.setToolTipText(Messages.GemBrowser_40);
-		this.terminateOperationAction.setEnabled(false);
-
-		// Save Browser summary to local file
-		this.writeToLocalFileAction = new Action() {
-			@Override
-			public void run() {
-
-				// Let the user indicate where to save local file
-				final JFileChooser fc = new JFileChooser();
-				final JFrame frame = new JFrame();
-				int result = fc.showSaveDialog(frame);
-
-				if (result == JFileChooser.APPROVE_OPTION) {
-					final File file = fc.getSelectedFile();
-					if (file.exists()) {
-						result = fc.showDialog(frame, Messages.GemBrowser_41);
-					}
-					if (result == JFileChooser.APPROVE_OPTION) {
-						GemUtilities.saveToLocalFile(file, createBrowserSummary());
-					}
-				} else if (result == JFileChooser.ERROR_OPTION) {
-					GemUtilities.showErrorDialog(Messages.GemBrowser_42);
-				}
-			}
-		};
-		this.writeToLocalFileAction.setToolTipText(Messages.GemBrowser_43);
-		this.writeToLocalFileAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_ETOOL_SAVE_EDIT));
-		this.writeToLocalFileAction.setEnabled(false);
-	}
-
-	/*
-	 * Opens the editor with the current source file active and jump to the line
-	 * number that is passed in.
-	 */
-	private void openEditor(int lineNumber, IFile sourceFile) {
-		try {
-			final IEditorPart editor = org.eclipse.ui.ide.IDE.openEditor(PlatformUI
-					.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
-					sourceFile, true);
-			final IMarker marker = sourceFile.createMarker(IMarker.MARKER);
-			marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
-			org.eclipse.ui.ide.IDE.gotoMarker(editor, marker);
-		} catch (final Exception e) {
-			GemUtilities.logExceptionDetail(e);
-		}
-	}
-
-	/*
-	 * Removes all tabs, used when clearing the browser or in preparation for
-	 * the next analysis.
-	 */
-	private void removeTabs() {
-		final CTabItem[] items = this.tabFolder.getItems();
-		final int numItems = items.length;
-		for (int i = 0; i < numItems; i++) {
-			items[i].dispose();
-		}
-	}
-
-	/*
-	 * Resets everything to default values. Used when a new file is analyzed or
-	 * when an exception or some other error occurs that interrupts the current
-	 * GEM operation.
-	 */
-	private void reset() {
-		setNumProcItems();
-		removeTabs();
-		GemUtilities.setTaskStatus(GemUtilities.TaskStatus.IDLE);
-		Display.getDefault().syncExec(GemBrowser.this.disableTerminateButtonThread);
-	}
-
-	/**
-	 * see org.eclipse.ui.IWorkbenchPart
-	 */
-	@Override
-	public void setFocus() {
-		this.runGemButton.setFocus();
-	}
-
-	/*
-	 * Given the initial Font, this helper method returns that Font with the new
-	 * specified size.
-	 */
-	private Font setFontSize(Font font, int size) {
-		final FontData[] fontData = font.getFontData();
-		for (final FontData element : fontData) {
-			element.setHeight(size);
-		}
-		return new Font(this.parent.getDisplay(), fontData);
-	}
-
-	/*
-	 * Populates the num-procs combo-box with choices the user can use to set
-	 * the number of processes for the next analyzer run.
-	 */
-	private void setNumProcItems() {
-		final String[] ranks = new String[16];
-		for (int i = 1; i <= 16; i++) {
-			ranks[i - 1] = ((Integer) i).toString();
-		}
-		this.setNumProcsComboList.setItems(ranks);
-		final Integer numProcs = GemPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		this.setNumProcsComboList.setText(numProcs.toString());
-	}
-
-	/**
-	 * Called on each new GEM analysis This method resets the transitions object
-	 * along with warning/error counters and invokes the BrowserUppdate thread.
-	 * 
-	 * @param transitions
-	 *            The Transitions object associated with this GEM update.
-	 * @return void
-	 */
-	public void update(Transitions transitions) {
-		this.transitions = transitions;
-		this.errorCount = 0;
-		this.warningCount = 0;
-
-		// Create a thread to perform the update
-		Display.getDefault().syncExec(this.browserUpdateThread);
-	}
-
-	/**
-	 * This method is used when another location changes the number of processes
-	 * preference. Calling this method will update the drop down so that it has
-	 * the correct number of processes displayed.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void updateDropDown() {
-		final Integer nprocs = GemPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.GEM_PREF_NUMPROCS);
-		this.setNumProcsComboList.setText(nprocs.toString());
-	}
-
-}
diff --git a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemConsole.java b/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemConsole.java
deleted file mode 100644
index 2bfc13f..0000000
--- a/tools/gem/org.eclipse.ptp.gem/src/org/eclipse/ptp/internal/gem/views/GemConsole.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2013 University of Utah School of Computing
- * 50 S Central Campus Dr. 3190 Salt Lake City, UT 84112
- * http://www.cs.utah.edu/formal_verification/
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Alan Humphrey - Initial API and implementation
- *    Christopher Derrick - Initial API and implementation
- *    Prof. Ganesh Gopalakrishnan - Project Advisor
- *******************************************************************************/
-
-package org.eclipse.ptp.internal.gem.views;
-
-import java.io.File;
-
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ptp.internal.gem.GemPlugin;
-import org.eclipse.ptp.internal.gem.messages.Messages;
-import org.eclipse.ptp.internal.gem.util.GemUtilities;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The GEM Console View.
- */
-public class GemConsole extends ViewPart {
-
-	// The ID for this view
-	public static final String ID = "org.eclipse.ptp.gem.views.GemConsole"; //$NON-NLS-1$
-
-	private Action clearConsoleAction;
-	private Action writeToLocalFileAction;
-	private Action getHelpAction;
-	private Action terminateOperationAction;
-	private MessageConsole msgConsole;
-	private StyledText txtConViewer;
-	private Thread disableTerminateButtonThread;
-	private Thread clearConsoleThread;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param none
-	 */
-	public GemConsole() {
-		super();
-	}
-
-	/**
-	 * Brings this ViewPart to the front and gives it focus.
-	 * 
-	 * @param none
-	 * @return none
-	 */
-	public void activate() {
-		final Thread activationThread = new Thread() {
-			@Override
-			public void run() {
-				final IWorkbench wb = PlatformUI.getWorkbench();
-				final IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
-				final IWorkbenchPage page = window.getActivePage();
-				if (page != null) {
-					page.activate(GemConsole.this);
-				}
-			}
-		};
-
-		// We need to switch to the thread that is allowed to change the UI
-		Display.getDefault().syncExec(activationThread);
-	}
-
-	/**
-	 * Changes status of the terminate process button (Action) to disabled.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void cancel() {
-		Display.getDefault().syncExec(this.disableTerminateButtonThread);
-	}
-
-	/**
-	 * Clears all text from the Gem Console via the main UI thread.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void clear() {
-		Display.getDefault().syncExec(this.clearConsoleThread);
-	}
-
-	/*
-	 * Calls finer grained methods, populating the view action bar.
-	 */
-	private void contributeToActionBars() {
-		final IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	/**
-	 * Callback that allows us to create the viewer and initialize it.
-	 * 
-	 * @param parent
-	 *            The parent Composite to this View.
-	 * @return void
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-
-		// Initializations
-		this.txtConViewer = new StyledText(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		this.txtConViewer.setFont(new Font(null, "Courier", 10, SWT.NORMAL)); //$NON-NLS-1$
-
-		// Create actions and connect them to buttons
-		makeActions();
-		contributeToActionBars();
-	}
-
-	/*
-	 * Populates the view pull-down menu.
-	 */
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(this.clearConsoleAction);
-		this.clearConsoleAction.setText(Messages.GemConsole_3);
-		manager.add(this.writeToLocalFileAction);
-		this.writeToLocalFileAction.setText(Messages.GemConsole_4);
-		manager.add(this.getHelpAction);
-		this.getHelpAction.setText(Messages.GemConsole_5);
-		manager.add(new Separator());
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Contributes icons and actions to the tool bar.
-	 */
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(this.terminateOperationAction);
-		manager.add(this.clearConsoleAction);
-		manager.add(this.writeToLocalFileAction);
-		manager.add(this.getHelpAction);
-
-		// Other plug-ins can contribute their actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/**
-	 * Initializes everything for this view and creates threads to be used by
-	 * the main UI thread to perform view updates.
-	 * 
-	 * @param none
-	 * @return void
-	 */
-	public void init() {
-
-		this.disableTerminateButtonThread = new Thread() {
-			@Override
-			public void run() {
-				GemConsole.this.terminateOperationAction.setEnabled(false);
-			}
-		};
-
-		this.clearConsoleThread = new Thread() {
-			@Override
-			public void run() {
-				GemConsole.this.txtConViewer.setText(""); //$NON-NLS-1$
-			}
-		};
-
-		this.terminateOperationAction.setEnabled(true);
-	}
-
-	/*
-	 * Creates the actions associated with the action bar buttons and context
-	 * menu items.
-	 */
-	private void makeActions() {
-
-		// terminateOperationAction
-		this.terminateOperationAction = new Action() {
-			@Override
-			public void run() {
-				GemUtilities.terminateOperation();
-			}
-		};
-		this.terminateOperationAction.setImageDescriptor(GemPlugin.getImageDescriptor("icons/progress_stop.gif")); //$NON-NLS-1$
-		this.terminateOperationAction.setToolTipText(Messages.GemAnalyzer_74);
-		this.terminateOperationAction.setEnabled(false);
-
-		// clearConsoleAction
-		this.clearConsoleAction = new Action() {
-			@Override
-			public void run() {
-				GemConsole.this.txtConViewer.setText(""); //$NON-NLS-1$
-			}
-		};
-		this.clearConsoleAction.setToolTipText(Messages.GemConsole_6);
-		this.clearConsoleAction.setImageDescriptor(GemPlugin.getImageDescriptor("icons/clear-console.gif")); //$NON-NLS-1$
-
-		// write ToLocalFileAction
-		this.writeToLocalFileAction = new Action() {
-			@Override
-			public void run() {
-
-				// Let the user indicate where to save local file
-				final JFileChooser fc = new JFileChooser();
-				final JFrame frame = new JFrame();
-				int result = fc.showSaveDialog(frame);
-
-				if (result == JFileChooser.APPROVE_OPTION) {
-					final File file = fc.getSelectedFile();
-					if (file.exists()) {
-						result = fc.showDialog(frame, Messages.GemConsole_7);
-					}
-					if (result == JFileChooser.APPROVE_OPTION) {
-						GemUtilities.saveToLocalFile(file, GemConsole.this.msgConsole.getDocument().get());
-					}
-				} else if (result == JFileChooser.ERROR_OPTION) {
-					GemUtilities.showErrorDialog(Messages.GemConsole_8);
-				}
-			}
-		};
-		this.writeToLocalFileAction.setToolTipText(Messages.GemConsole_9);
-		this.writeToLocalFileAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_ETOOL_SAVE_EDIT));
-
-		// getHelpAction
-		this.getHelpAction = new Action() {
-			@Override
-			public void run() {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelpResource("/org.eclipse.ptp.gem.help/html/consoleView.html"); //$NON-NLS-1$
-			}
-		};
-		this.getHelpAction.setToolTipText(Messages.GemConsole_10);
-		this.getHelpAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_LCL_LINKTO_HELP));
-	}
-
-	/**
-	 * see org.eclipse.ui.IWorkbenchPart
-	 */
-	@Override
-	public void setFocus() {
-		this.txtConViewer.setFocus();
-	}
-
-	/**
-	 * Appends the specified message to the TextConsole. If the clear console
-	 * preference is set, the new message simply replaces the existing console
-	 * content.
-	 * 
-	 * @param message
-	 *            The string to append to the existing text in the text console
-	 *            viewer of this view part.
-	 * @return void
-	 */
-	public void write(String message) {
-		// this.txtConViewer.setText(this.txtConViewer.getText()+message);
-		this.txtConViewer.append(message);
-		this.txtConViewer.setTopIndex(this.txtConViewer.getLineCount() - 1);
-	}
-
-	/**
-	 * Writes the string to the console as an error message.
-	 * 
-	 * @param consoleStdErrMessage
-	 *            The string that represents stderr to write to this Console.
-	 * @return void
-	 */
-	public void writeStdErr(String consoleStdErrMessage) {
-		final int oldLen = this.txtConViewer.getText().length();
-		write(consoleStdErrMessage);
-
-		if (consoleStdErrMessage.length() > 2) {
-			final StyleRange styleRange = new StyleRange();
-			final Display display = Display.getDefault();
-			styleRange.start = oldLen;
-			styleRange.length = consoleStdErrMessage.length();
-			styleRange.foreground = display.getSystemColor(SWT.COLOR_RED);
-			styleRange.fontStyle = SWT.BOLD;
-			// styleRange1.fontStyle = SWT.BOLD | SWT.ITALIC;
-			this.txtConViewer.setStyleRange(styleRange);
-		}
-	}
-
-	/**
-	 * Writes the string to the console as a standard message.
-	 * 
-	 * @param consoleStdOutMessage
-	 *            The string that represents stdout to write to this Console.
-	 * @void
-	 */
-	public void writeStdOut(String consoleStdOutMessage) {
-		write(consoleStdOutMessage);
-	}
-
-}
diff --git a/tools/pldt/pom.xml b/tools/pldt/pom.xml
index a85a496..83d05b2 100644
--- a/tools/pldt/pom.xml
+++ b/tools/pldt/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
 
diff --git a/tools/pom.xml b/tools/pom.xml
index b8910c9..f3fd7d3 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -6,7 +6,7 @@
   <parent>
     <groupId>org.eclipse.ptp</groupId>
     <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
+    <version>9.3.1-SNAPSHOT</version>
   </parent>
 
   <artifactId>tools-parent</artifactId>
diff --git a/tools/sci/org.eclipse.ptp.sci/.cproject b/tools/sci/org.eclipse.ptp.sci/.cproject
deleted file mode 100644
index 427512f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/.cproject
+++ /dev/null
@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
-	<storageModule moduleId="org.eclipse.cdt.core.settings">
-		<cconfiguration id="0.2009535681">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.2009535681" moduleId="org.eclipse.cdt.core.settings" name="Default">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.2009535681" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
-					<folderInfo id="0.2009535681." name="/" resourcePath="">
-						<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1594998210" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
-							<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1594998210.2064958559" name=""/>
-							<builder id="org.eclipse.cdt.build.core.settings.default.builder.984714857" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1654805868" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.143460927" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.113121391" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.92741190" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1046866184" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.2013909110" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1776969854" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-						</toolChain>
-					</folderInfo>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="scannerConfiguration">
-				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="makefileGenerator">
-						<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<scannerConfigBuildInfo instanceId="0.2009535681">
-					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="makefileGenerator">
-							<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-				</scannerConfigBuildInfo>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-			<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
-			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
-			<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
-				<buildTargets>
-					<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
-						<buildCommand>make</buildCommand>
-						<buildTarget>all</buildTarget>
-						<stopOnError>true</stopOnError>
-						<useDefaultCommand>true</useDefaultCommand>
-						<runAllBuilders>true</runAllBuilders>
-					</target>
-					<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
-						<buildCommand>make</buildCommand>
-						<buildArguments/>
-						<buildTarget>clean</buildTarget>
-						<stopOnError>true</stopOnError>
-						<useDefaultCommand>true</useDefaultCommand>
-						<runAllBuilders>true</runAllBuilders>
-					</target>
-				</buildTargets>
-			</storageModule>
-		</cconfiguration>
-	</storageModule>
-	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-		<project id="org.eclipse.ptp.sci.null.763117367" name="org.eclipse.ptp.sci"/>
-	</storageModule>
-</cproject>
diff --git a/tools/sci/org.eclipse.ptp.sci/.cvsignore b/tools/sci/org.eclipse.ptp.sci/.cvsignore
deleted file mode 100644
index 5520d05..0000000
--- a/tools/sci/org.eclipse.ptp.sci/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-autom4te.cache
-stamp-h1
-config.status
-config.h
-Makefile
-a.out.dSYM
-libtool
diff --git a/tools/sci/org.eclipse.ptp.sci/.project b/tools/sci/org.eclipse.ptp.sci/.project
deleted file mode 100644
index bda8d41..0000000
--- a/tools/sci/org.eclipse.ptp.sci/.project
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.sci</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-			<triggers>clean,full,incremental,</triggers>
-			<arguments>
-				<dictionary>
-					<key>?name?</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.append_environment</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildArguments</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildCommand</key>
-					<value>make</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
-					<value>clean</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.contents</key>
-					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
-					<value>false</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.stopOnError</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
-					<value>true</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.core.ccnature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-	</natures>
-</projectDescription>
diff --git a/tools/sci/org.eclipse.ptp.sci/AUTHORS b/tools/sci/org.eclipse.ptp.sci/AUTHORS
deleted file mode 100644
index 4f5304e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/AUTHORS
+++ /dev/null
@@ -1,4 +0,0 @@
-Tu Hong Jun   Email: tuhongj@cn.ibm.com, Msn: redsand@263.net
-Rong Li       Email: ronglli@cn.ibm.com
-Nicole Nie
-Liu Wei
diff --git a/tools/sci/org.eclipse.ptp.sci/COPYING b/tools/sci/org.eclipse.ptp.sci/COPYING
deleted file mode 100644
index 623b625..0000000
--- a/tools/sci/org.eclipse.ptp.sci/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  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
-this service 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.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the 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 a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE 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.
-
-		     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
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the 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 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
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/tools/sci/org.eclipse.ptp.sci/ChangeLog b/tools/sci/org.eclipse.ptp.sci/ChangeLog
deleted file mode 100644
index e69de29..0000000
--- a/tools/sci/org.eclipse.ptp.sci/ChangeLog
+++ /dev/null
diff --git a/tools/sci/org.eclipse.ptp.sci/INSTALL b/tools/sci/org.eclipse.ptp.sci/INSTALL
deleted file mode 100644
index 23e5f25..0000000
--- a/tools/sci/org.eclipse.ptp.sci/INSTALL
+++ /dev/null
@@ -1,236 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-These are generic installation instructions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
-By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
-
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF b/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF
deleted file mode 100644
index 4ada794..0000000
--- a/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.sci
-Bundle-Version: 9.3.0.qualifier
-Bundle-Vendor: %pluginProvider
-Bundle-Localization: plugin
diff --git a/tools/sci/org.eclipse.ptp.sci/Makefile.am b/tools/sci/org.eclipse.ptp.sci/Makefile.am
deleted file mode 100644
index 76727b1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-SUBDIRS = common libsci scid scia usecase
-if OPEN_SSL
-    SUBDIRS += secmod
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/Makefile.in b/tools/sci/org.eclipse.ptp.sci/Makefile.in
deleted file mode 100644
index 2897096..0000000
--- a/tools/sci/org.eclipse.ptp.sci/Makefile.in
+++ /dev/null
@@ -1,719 +0,0 @@
-# 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@
-@OPEN_SSL_TRUE@am__append_1 = secmod
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
-	$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
-	compile config.guess config.sub depcomp install-sh ltmain.sh \
-	missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-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 = config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_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 = common libsci scid scia usecase secmod
-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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-SUBDIRS = common libsci scid scia usecase $(am__append_1)
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-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) --gnu'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu 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):
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _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) config.h.in $(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) config.h.in $(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) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(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
-	-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 config.h
-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)
-
-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 mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr \
-	distclean-libtool 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-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-	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 ctags ctags-recursive dist dist-all dist-bzip2 \
-	dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
-	distcheck distclean distclean-generic distclean-hdr \
-	distclean-libtool 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-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am tags tags-recursive uninstall uninstall-am
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/NEWS b/tools/sci/org.eclipse.ptp.sci/NEWS
deleted file mode 100644
index e69de29..0000000
--- a/tools/sci/org.eclipse.ptp.sci/NEWS
+++ /dev/null
diff --git a/tools/sci/org.eclipse.ptp.sci/README b/tools/sci/org.eclipse.ptp.sci/README
deleted file mode 100644
index bdf4b2d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/README
+++ /dev/null
@@ -1 +0,0 @@
-under aix, users should install gmake first and type gmake instead of make to do the compiling
diff --git a/tools/sci/org.eclipse.ptp.sci/about.html b/tools/sci/org.eclipse.ptp.sci/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/tools/sci/org.eclipse.ptp.sci/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/sci/org.eclipse.ptp.sci/aclocal.m4 b/tools/sci/org.eclipse.ptp.sci/aclocal.m4
deleted file mode 100644
index 77bfcdb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/aclocal.m4
+++ /dev/null
@@ -1,8935 +0,0 @@
-# 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.63],,
-[m4_warning([this file was generated for autoconf 2.63.
-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)
-  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
-
-  # Add ABI-specific directories to the system library path.
-  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
-  # 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="$sys_lib_dlsearch_path_spec $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'
-  ;;
-
-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)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  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)
-	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*)
-	;;
-      *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)
-      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'
-  ;;
-  *)
-    _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
-    ;;
-  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
-      *\ [[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)
-      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*)
-      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
-      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*)
-      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)
-        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
-])
-
-# Copyright (C) 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_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
-# 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/tools/sci/org.eclipse.ptp.sci/build.properties b/tools/sci/org.eclipse.ptp.sci/build.properties
deleted file mode 100644
index ef8244d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-bin.includes = about.html,\
-               META-INF/,\
-               common/,\
-               libsci/,\
-               man/,\
-               scia/,\
-               plugin.properties,\
-               scid/,\
-               usecase/,\
-               include/
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/.cvsignore b/tools/sci/org.eclipse.ptp.sci/common/.cvsignore
deleted file mode 100644
index e55e634..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.64o
-.deps
-Makefile
-*.a
diff --git a/tools/sci/org.eclipse.ptp.sci/common/Makefile.am b/tools/sci/org.eclipse.ptp.sci/common/Makefile.am
deleted file mode 100644
index c0d883f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/Makefile.am
+++ /dev/null
@@ -1,26 +0,0 @@
-if SYSTEM_AIX
-noinst_LIBRARIES = libcmn.a libcmn64.a
-else
-noinst_LIBRARIES = libcmn.a
-endif
-SOURCES = \
-    envvar.cpp     group.cpp        log.cpp     range.cpp   sshfunc.cpp  thread.cpp \
-    exception.cpp  ipconverter.cpp  packer.cpp  socket.cpp  stream.cpp   tools.cpp
-
-ARFLAGS = -rv
-libcmn_a_SOURCES = $(SOURCES)
-libcmn_a_CPPFLAGS = -I../secmod -fPIC
-
-noinst_HEADERS = \
-    envvar.hpp     group.hpp        log.hpp     range.hpp   sshfunc.hpp  thread.hpp \
-    exception.hpp  ipconverter.hpp  packer.hpp  socket.hpp  stream.hpp   tools.hpp 
-
-if SYSTEM_AIX
-ARFLAGS += -X32_64
-libcmn64_a_SOURCES = $(SOURCES)
-libcmn64_a_CPPFLAGS = -q64 -I../secmod -fPIC -D__64BIT__
-else
-if BIT64
-libcmn_a_CPPFLAGS += -D__64BIT__
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/common/Makefile.in b/tools/sci/org.eclipse.ptp.sci/common/Makefile.in
deleted file mode 100644
index 0f0b714..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/Makefile.in
+++ /dev/null
@@ -1,864 +0,0 @@
-# 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@
-@SYSTEM_AIX_TRUE@am__append_1 = -X32_64
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@am__append_2 = -D__64BIT__
-subdir = common
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-libcmn_a_AR = $(AR) $(ARFLAGS)
-libcmn_a_LIBADD =
-am__objects_1 = libcmn_a-envvar.$(OBJEXT) libcmn_a-group.$(OBJEXT) \
-	libcmn_a-log.$(OBJEXT) libcmn_a-range.$(OBJEXT) \
-	libcmn_a-sshfunc.$(OBJEXT) libcmn_a-thread.$(OBJEXT) \
-	libcmn_a-exception.$(OBJEXT) libcmn_a-ipconverter.$(OBJEXT) \
-	libcmn_a-packer.$(OBJEXT) libcmn_a-socket.$(OBJEXT) \
-	libcmn_a-stream.$(OBJEXT) libcmn_a-tools.$(OBJEXT)
-am_libcmn_a_OBJECTS = $(am__objects_1)
-libcmn_a_OBJECTS = $(am_libcmn_a_OBJECTS)
-libcmn64_a_AR = $(AR) $(ARFLAGS)
-libcmn64_a_LIBADD =
-am__libcmn64_a_SOURCES_DIST = envvar.cpp group.cpp log.cpp range.cpp \
-	sshfunc.cpp thread.cpp exception.cpp ipconverter.cpp \
-	packer.cpp socket.cpp stream.cpp tools.cpp
-am__objects_2 = libcmn64_a-envvar.$(OBJEXT) libcmn64_a-group.$(OBJEXT) \
-	libcmn64_a-log.$(OBJEXT) libcmn64_a-range.$(OBJEXT) \
-	libcmn64_a-sshfunc.$(OBJEXT) libcmn64_a-thread.$(OBJEXT) \
-	libcmn64_a-exception.$(OBJEXT) \
-	libcmn64_a-ipconverter.$(OBJEXT) libcmn64_a-packer.$(OBJEXT) \
-	libcmn64_a-socket.$(OBJEXT) libcmn64_a-stream.$(OBJEXT) \
-	libcmn64_a-tools.$(OBJEXT)
-@SYSTEM_AIX_TRUE@am_libcmn64_a_OBJECTS = $(am__objects_2)
-libcmn64_a_OBJECTS = $(am_libcmn64_a_OBJECTS)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-DIST_SOURCES = $(libcmn_a_SOURCES) $(am__libcmn64_a_SOURCES_DIST)
-HEADERS = $(noinst_HEADERS)
-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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-@SYSTEM_AIX_FALSE@noinst_LIBRARIES = libcmn.a
-@SYSTEM_AIX_TRUE@noinst_LIBRARIES = libcmn.a libcmn64.a
-SOURCES = \
-    envvar.cpp     group.cpp        log.cpp     range.cpp   sshfunc.cpp  thread.cpp \
-    exception.cpp  ipconverter.cpp  packer.cpp  socket.cpp  stream.cpp   tools.cpp
-
-ARFLAGS = -rv $(am__append_1)
-libcmn_a_SOURCES = $(SOURCES)
-libcmn_a_CPPFLAGS = -I../secmod -fPIC $(am__append_2)
-noinst_HEADERS = \
-    envvar.hpp     group.hpp        log.hpp     range.hpp   sshfunc.hpp  thread.hpp \
-    exception.hpp  ipconverter.hpp  packer.hpp  socket.hpp  stream.hpp   tools.hpp 
-
-@SYSTEM_AIX_TRUE@libcmn64_a_SOURCES = $(SOURCES)
-@SYSTEM_AIX_TRUE@libcmn64_a_CPPFLAGS = -q64 -I../secmod -fPIC -D__64BIT__
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .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) --gnu common/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu common/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-noinstLIBRARIES:
-	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-libcmn.a: $(libcmn_a_OBJECTS) $(libcmn_a_DEPENDENCIES) 
-	-rm -f libcmn.a
-	$(libcmn_a_AR) libcmn.a $(libcmn_a_OBJECTS) $(libcmn_a_LIBADD)
-	$(RANLIB) libcmn.a
-libcmn64.a: $(libcmn64_a_OBJECTS) $(libcmn64_a_DEPENDENCIES) 
-	-rm -f libcmn64.a
-	$(libcmn64_a_AR) libcmn64.a $(libcmn64_a_OBJECTS) $(libcmn64_a_LIBADD)
-	$(RANLIB) libcmn64.a
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-envvar.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-exception.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-group.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-ipconverter.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-log.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-range.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-socket.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-sshfunc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-stream.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-thread.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn64_a-tools.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-envvar.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-exception.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-group.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-ipconverter.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-log.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-range.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-socket.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-sshfunc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-stream.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-thread.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmn_a-tools.Po@am__quote@
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-libcmn_a-envvar.o: envvar.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-envvar.o -MD -MP -MF $(DEPDIR)/libcmn_a-envvar.Tpo -c -o libcmn_a-envvar.o `test -f 'envvar.cpp' || echo '$(srcdir)/'`envvar.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-envvar.Tpo $(DEPDIR)/libcmn_a-envvar.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='envvar.cpp' object='libcmn_a-envvar.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-envvar.o `test -f 'envvar.cpp' || echo '$(srcdir)/'`envvar.cpp
-
-libcmn_a-envvar.obj: envvar.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-envvar.obj -MD -MP -MF $(DEPDIR)/libcmn_a-envvar.Tpo -c -o libcmn_a-envvar.obj `if test -f 'envvar.cpp'; then $(CYGPATH_W) 'envvar.cpp'; else $(CYGPATH_W) '$(srcdir)/envvar.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-envvar.Tpo $(DEPDIR)/libcmn_a-envvar.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='envvar.cpp' object='libcmn_a-envvar.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-envvar.obj `if test -f 'envvar.cpp'; then $(CYGPATH_W) 'envvar.cpp'; else $(CYGPATH_W) '$(srcdir)/envvar.cpp'; fi`
-
-libcmn_a-group.o: group.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-group.o -MD -MP -MF $(DEPDIR)/libcmn_a-group.Tpo -c -o libcmn_a-group.o `test -f 'group.cpp' || echo '$(srcdir)/'`group.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-group.Tpo $(DEPDIR)/libcmn_a-group.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='group.cpp' object='libcmn_a-group.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-group.o `test -f 'group.cpp' || echo '$(srcdir)/'`group.cpp
-
-libcmn_a-group.obj: group.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-group.obj -MD -MP -MF $(DEPDIR)/libcmn_a-group.Tpo -c -o libcmn_a-group.obj `if test -f 'group.cpp'; then $(CYGPATH_W) 'group.cpp'; else $(CYGPATH_W) '$(srcdir)/group.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-group.Tpo $(DEPDIR)/libcmn_a-group.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='group.cpp' object='libcmn_a-group.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-group.obj `if test -f 'group.cpp'; then $(CYGPATH_W) 'group.cpp'; else $(CYGPATH_W) '$(srcdir)/group.cpp'; fi`
-
-libcmn_a-log.o: log.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-log.o -MD -MP -MF $(DEPDIR)/libcmn_a-log.Tpo -c -o libcmn_a-log.o `test -f 'log.cpp' || echo '$(srcdir)/'`log.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-log.Tpo $(DEPDIR)/libcmn_a-log.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='log.cpp' object='libcmn_a-log.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-log.o `test -f 'log.cpp' || echo '$(srcdir)/'`log.cpp
-
-libcmn_a-log.obj: log.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-log.obj -MD -MP -MF $(DEPDIR)/libcmn_a-log.Tpo -c -o libcmn_a-log.obj `if test -f 'log.cpp'; then $(CYGPATH_W) 'log.cpp'; else $(CYGPATH_W) '$(srcdir)/log.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-log.Tpo $(DEPDIR)/libcmn_a-log.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='log.cpp' object='libcmn_a-log.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-log.obj `if test -f 'log.cpp'; then $(CYGPATH_W) 'log.cpp'; else $(CYGPATH_W) '$(srcdir)/log.cpp'; fi`
-
-libcmn_a-range.o: range.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-range.o -MD -MP -MF $(DEPDIR)/libcmn_a-range.Tpo -c -o libcmn_a-range.o `test -f 'range.cpp' || echo '$(srcdir)/'`range.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-range.Tpo $(DEPDIR)/libcmn_a-range.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='range.cpp' object='libcmn_a-range.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-range.o `test -f 'range.cpp' || echo '$(srcdir)/'`range.cpp
-
-libcmn_a-range.obj: range.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-range.obj -MD -MP -MF $(DEPDIR)/libcmn_a-range.Tpo -c -o libcmn_a-range.obj `if test -f 'range.cpp'; then $(CYGPATH_W) 'range.cpp'; else $(CYGPATH_W) '$(srcdir)/range.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-range.Tpo $(DEPDIR)/libcmn_a-range.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='range.cpp' object='libcmn_a-range.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-range.obj `if test -f 'range.cpp'; then $(CYGPATH_W) 'range.cpp'; else $(CYGPATH_W) '$(srcdir)/range.cpp'; fi`
-
-libcmn_a-sshfunc.o: sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-sshfunc.o -MD -MP -MF $(DEPDIR)/libcmn_a-sshfunc.Tpo -c -o libcmn_a-sshfunc.o `test -f 'sshfunc.cpp' || echo '$(srcdir)/'`sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-sshfunc.Tpo $(DEPDIR)/libcmn_a-sshfunc.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sshfunc.cpp' object='libcmn_a-sshfunc.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-sshfunc.o `test -f 'sshfunc.cpp' || echo '$(srcdir)/'`sshfunc.cpp
-
-libcmn_a-sshfunc.obj: sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-sshfunc.obj -MD -MP -MF $(DEPDIR)/libcmn_a-sshfunc.Tpo -c -o libcmn_a-sshfunc.obj `if test -f 'sshfunc.cpp'; then $(CYGPATH_W) 'sshfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/sshfunc.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-sshfunc.Tpo $(DEPDIR)/libcmn_a-sshfunc.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sshfunc.cpp' object='libcmn_a-sshfunc.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-sshfunc.obj `if test -f 'sshfunc.cpp'; then $(CYGPATH_W) 'sshfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/sshfunc.cpp'; fi`
-
-libcmn_a-thread.o: thread.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-thread.o -MD -MP -MF $(DEPDIR)/libcmn_a-thread.Tpo -c -o libcmn_a-thread.o `test -f 'thread.cpp' || echo '$(srcdir)/'`thread.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-thread.Tpo $(DEPDIR)/libcmn_a-thread.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='thread.cpp' object='libcmn_a-thread.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-thread.o `test -f 'thread.cpp' || echo '$(srcdir)/'`thread.cpp
-
-libcmn_a-thread.obj: thread.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-thread.obj -MD -MP -MF $(DEPDIR)/libcmn_a-thread.Tpo -c -o libcmn_a-thread.obj `if test -f 'thread.cpp'; then $(CYGPATH_W) 'thread.cpp'; else $(CYGPATH_W) '$(srcdir)/thread.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-thread.Tpo $(DEPDIR)/libcmn_a-thread.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='thread.cpp' object='libcmn_a-thread.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-thread.obj `if test -f 'thread.cpp'; then $(CYGPATH_W) 'thread.cpp'; else $(CYGPATH_W) '$(srcdir)/thread.cpp'; fi`
-
-libcmn_a-exception.o: exception.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-exception.o -MD -MP -MF $(DEPDIR)/libcmn_a-exception.Tpo -c -o libcmn_a-exception.o `test -f 'exception.cpp' || echo '$(srcdir)/'`exception.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-exception.Tpo $(DEPDIR)/libcmn_a-exception.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exception.cpp' object='libcmn_a-exception.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-exception.o `test -f 'exception.cpp' || echo '$(srcdir)/'`exception.cpp
-
-libcmn_a-exception.obj: exception.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-exception.obj -MD -MP -MF $(DEPDIR)/libcmn_a-exception.Tpo -c -o libcmn_a-exception.obj `if test -f 'exception.cpp'; then $(CYGPATH_W) 'exception.cpp'; else $(CYGPATH_W) '$(srcdir)/exception.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-exception.Tpo $(DEPDIR)/libcmn_a-exception.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exception.cpp' object='libcmn_a-exception.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-exception.obj `if test -f 'exception.cpp'; then $(CYGPATH_W) 'exception.cpp'; else $(CYGPATH_W) '$(srcdir)/exception.cpp'; fi`
-
-libcmn_a-ipconverter.o: ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-ipconverter.o -MD -MP -MF $(DEPDIR)/libcmn_a-ipconverter.Tpo -c -o libcmn_a-ipconverter.o `test -f 'ipconverter.cpp' || echo '$(srcdir)/'`ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-ipconverter.Tpo $(DEPDIR)/libcmn_a-ipconverter.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ipconverter.cpp' object='libcmn_a-ipconverter.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-ipconverter.o `test -f 'ipconverter.cpp' || echo '$(srcdir)/'`ipconverter.cpp
-
-libcmn_a-ipconverter.obj: ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-ipconverter.obj -MD -MP -MF $(DEPDIR)/libcmn_a-ipconverter.Tpo -c -o libcmn_a-ipconverter.obj `if test -f 'ipconverter.cpp'; then $(CYGPATH_W) 'ipconverter.cpp'; else $(CYGPATH_W) '$(srcdir)/ipconverter.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-ipconverter.Tpo $(DEPDIR)/libcmn_a-ipconverter.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ipconverter.cpp' object='libcmn_a-ipconverter.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-ipconverter.obj `if test -f 'ipconverter.cpp'; then $(CYGPATH_W) 'ipconverter.cpp'; else $(CYGPATH_W) '$(srcdir)/ipconverter.cpp'; fi`
-
-libcmn_a-packer.o: packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-packer.o -MD -MP -MF $(DEPDIR)/libcmn_a-packer.Tpo -c -o libcmn_a-packer.o `test -f 'packer.cpp' || echo '$(srcdir)/'`packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-packer.Tpo $(DEPDIR)/libcmn_a-packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='packer.cpp' object='libcmn_a-packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-packer.o `test -f 'packer.cpp' || echo '$(srcdir)/'`packer.cpp
-
-libcmn_a-packer.obj: packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-packer.obj -MD -MP -MF $(DEPDIR)/libcmn_a-packer.Tpo -c -o libcmn_a-packer.obj `if test -f 'packer.cpp'; then $(CYGPATH_W) 'packer.cpp'; else $(CYGPATH_W) '$(srcdir)/packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-packer.Tpo $(DEPDIR)/libcmn_a-packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='packer.cpp' object='libcmn_a-packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-packer.obj `if test -f 'packer.cpp'; then $(CYGPATH_W) 'packer.cpp'; else $(CYGPATH_W) '$(srcdir)/packer.cpp'; fi`
-
-libcmn_a-socket.o: socket.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-socket.o -MD -MP -MF $(DEPDIR)/libcmn_a-socket.Tpo -c -o libcmn_a-socket.o `test -f 'socket.cpp' || echo '$(srcdir)/'`socket.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-socket.Tpo $(DEPDIR)/libcmn_a-socket.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='socket.cpp' object='libcmn_a-socket.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-socket.o `test -f 'socket.cpp' || echo '$(srcdir)/'`socket.cpp
-
-libcmn_a-socket.obj: socket.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-socket.obj -MD -MP -MF $(DEPDIR)/libcmn_a-socket.Tpo -c -o libcmn_a-socket.obj `if test -f 'socket.cpp'; then $(CYGPATH_W) 'socket.cpp'; else $(CYGPATH_W) '$(srcdir)/socket.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-socket.Tpo $(DEPDIR)/libcmn_a-socket.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='socket.cpp' object='libcmn_a-socket.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-socket.obj `if test -f 'socket.cpp'; then $(CYGPATH_W) 'socket.cpp'; else $(CYGPATH_W) '$(srcdir)/socket.cpp'; fi`
-
-libcmn_a-stream.o: stream.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-stream.o -MD -MP -MF $(DEPDIR)/libcmn_a-stream.Tpo -c -o libcmn_a-stream.o `test -f 'stream.cpp' || echo '$(srcdir)/'`stream.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-stream.Tpo $(DEPDIR)/libcmn_a-stream.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='stream.cpp' object='libcmn_a-stream.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-stream.o `test -f 'stream.cpp' || echo '$(srcdir)/'`stream.cpp
-
-libcmn_a-stream.obj: stream.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-stream.obj -MD -MP -MF $(DEPDIR)/libcmn_a-stream.Tpo -c -o libcmn_a-stream.obj `if test -f 'stream.cpp'; then $(CYGPATH_W) 'stream.cpp'; else $(CYGPATH_W) '$(srcdir)/stream.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-stream.Tpo $(DEPDIR)/libcmn_a-stream.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='stream.cpp' object='libcmn_a-stream.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-stream.obj `if test -f 'stream.cpp'; then $(CYGPATH_W) 'stream.cpp'; else $(CYGPATH_W) '$(srcdir)/stream.cpp'; fi`
-
-libcmn_a-tools.o: tools.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-tools.o -MD -MP -MF $(DEPDIR)/libcmn_a-tools.Tpo -c -o libcmn_a-tools.o `test -f 'tools.cpp' || echo '$(srcdir)/'`tools.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-tools.Tpo $(DEPDIR)/libcmn_a-tools.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='tools.cpp' object='libcmn_a-tools.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-tools.o `test -f 'tools.cpp' || echo '$(srcdir)/'`tools.cpp
-
-libcmn_a-tools.obj: tools.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn_a-tools.obj -MD -MP -MF $(DEPDIR)/libcmn_a-tools.Tpo -c -o libcmn_a-tools.obj `if test -f 'tools.cpp'; then $(CYGPATH_W) 'tools.cpp'; else $(CYGPATH_W) '$(srcdir)/tools.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn_a-tools.Tpo $(DEPDIR)/libcmn_a-tools.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='tools.cpp' object='libcmn_a-tools.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn_a-tools.obj `if test -f 'tools.cpp'; then $(CYGPATH_W) 'tools.cpp'; else $(CYGPATH_W) '$(srcdir)/tools.cpp'; fi`
-
-libcmn64_a-envvar.o: envvar.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-envvar.o -MD -MP -MF $(DEPDIR)/libcmn64_a-envvar.Tpo -c -o libcmn64_a-envvar.o `test -f 'envvar.cpp' || echo '$(srcdir)/'`envvar.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-envvar.Tpo $(DEPDIR)/libcmn64_a-envvar.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='envvar.cpp' object='libcmn64_a-envvar.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-envvar.o `test -f 'envvar.cpp' || echo '$(srcdir)/'`envvar.cpp
-
-libcmn64_a-envvar.obj: envvar.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-envvar.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-envvar.Tpo -c -o libcmn64_a-envvar.obj `if test -f 'envvar.cpp'; then $(CYGPATH_W) 'envvar.cpp'; else $(CYGPATH_W) '$(srcdir)/envvar.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-envvar.Tpo $(DEPDIR)/libcmn64_a-envvar.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='envvar.cpp' object='libcmn64_a-envvar.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-envvar.obj `if test -f 'envvar.cpp'; then $(CYGPATH_W) 'envvar.cpp'; else $(CYGPATH_W) '$(srcdir)/envvar.cpp'; fi`
-
-libcmn64_a-group.o: group.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-group.o -MD -MP -MF $(DEPDIR)/libcmn64_a-group.Tpo -c -o libcmn64_a-group.o `test -f 'group.cpp' || echo '$(srcdir)/'`group.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-group.Tpo $(DEPDIR)/libcmn64_a-group.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='group.cpp' object='libcmn64_a-group.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-group.o `test -f 'group.cpp' || echo '$(srcdir)/'`group.cpp
-
-libcmn64_a-group.obj: group.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-group.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-group.Tpo -c -o libcmn64_a-group.obj `if test -f 'group.cpp'; then $(CYGPATH_W) 'group.cpp'; else $(CYGPATH_W) '$(srcdir)/group.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-group.Tpo $(DEPDIR)/libcmn64_a-group.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='group.cpp' object='libcmn64_a-group.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-group.obj `if test -f 'group.cpp'; then $(CYGPATH_W) 'group.cpp'; else $(CYGPATH_W) '$(srcdir)/group.cpp'; fi`
-
-libcmn64_a-log.o: log.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-log.o -MD -MP -MF $(DEPDIR)/libcmn64_a-log.Tpo -c -o libcmn64_a-log.o `test -f 'log.cpp' || echo '$(srcdir)/'`log.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-log.Tpo $(DEPDIR)/libcmn64_a-log.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='log.cpp' object='libcmn64_a-log.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-log.o `test -f 'log.cpp' || echo '$(srcdir)/'`log.cpp
-
-libcmn64_a-log.obj: log.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-log.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-log.Tpo -c -o libcmn64_a-log.obj `if test -f 'log.cpp'; then $(CYGPATH_W) 'log.cpp'; else $(CYGPATH_W) '$(srcdir)/log.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-log.Tpo $(DEPDIR)/libcmn64_a-log.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='log.cpp' object='libcmn64_a-log.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-log.obj `if test -f 'log.cpp'; then $(CYGPATH_W) 'log.cpp'; else $(CYGPATH_W) '$(srcdir)/log.cpp'; fi`
-
-libcmn64_a-range.o: range.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-range.o -MD -MP -MF $(DEPDIR)/libcmn64_a-range.Tpo -c -o libcmn64_a-range.o `test -f 'range.cpp' || echo '$(srcdir)/'`range.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-range.Tpo $(DEPDIR)/libcmn64_a-range.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='range.cpp' object='libcmn64_a-range.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-range.o `test -f 'range.cpp' || echo '$(srcdir)/'`range.cpp
-
-libcmn64_a-range.obj: range.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-range.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-range.Tpo -c -o libcmn64_a-range.obj `if test -f 'range.cpp'; then $(CYGPATH_W) 'range.cpp'; else $(CYGPATH_W) '$(srcdir)/range.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-range.Tpo $(DEPDIR)/libcmn64_a-range.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='range.cpp' object='libcmn64_a-range.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-range.obj `if test -f 'range.cpp'; then $(CYGPATH_W) 'range.cpp'; else $(CYGPATH_W) '$(srcdir)/range.cpp'; fi`
-
-libcmn64_a-sshfunc.o: sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-sshfunc.o -MD -MP -MF $(DEPDIR)/libcmn64_a-sshfunc.Tpo -c -o libcmn64_a-sshfunc.o `test -f 'sshfunc.cpp' || echo '$(srcdir)/'`sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-sshfunc.Tpo $(DEPDIR)/libcmn64_a-sshfunc.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sshfunc.cpp' object='libcmn64_a-sshfunc.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-sshfunc.o `test -f 'sshfunc.cpp' || echo '$(srcdir)/'`sshfunc.cpp
-
-libcmn64_a-sshfunc.obj: sshfunc.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-sshfunc.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-sshfunc.Tpo -c -o libcmn64_a-sshfunc.obj `if test -f 'sshfunc.cpp'; then $(CYGPATH_W) 'sshfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/sshfunc.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-sshfunc.Tpo $(DEPDIR)/libcmn64_a-sshfunc.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sshfunc.cpp' object='libcmn64_a-sshfunc.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-sshfunc.obj `if test -f 'sshfunc.cpp'; then $(CYGPATH_W) 'sshfunc.cpp'; else $(CYGPATH_W) '$(srcdir)/sshfunc.cpp'; fi`
-
-libcmn64_a-thread.o: thread.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-thread.o -MD -MP -MF $(DEPDIR)/libcmn64_a-thread.Tpo -c -o libcmn64_a-thread.o `test -f 'thread.cpp' || echo '$(srcdir)/'`thread.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-thread.Tpo $(DEPDIR)/libcmn64_a-thread.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='thread.cpp' object='libcmn64_a-thread.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-thread.o `test -f 'thread.cpp' || echo '$(srcdir)/'`thread.cpp
-
-libcmn64_a-thread.obj: thread.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-thread.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-thread.Tpo -c -o libcmn64_a-thread.obj `if test -f 'thread.cpp'; then $(CYGPATH_W) 'thread.cpp'; else $(CYGPATH_W) '$(srcdir)/thread.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-thread.Tpo $(DEPDIR)/libcmn64_a-thread.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='thread.cpp' object='libcmn64_a-thread.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-thread.obj `if test -f 'thread.cpp'; then $(CYGPATH_W) 'thread.cpp'; else $(CYGPATH_W) '$(srcdir)/thread.cpp'; fi`
-
-libcmn64_a-exception.o: exception.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-exception.o -MD -MP -MF $(DEPDIR)/libcmn64_a-exception.Tpo -c -o libcmn64_a-exception.o `test -f 'exception.cpp' || echo '$(srcdir)/'`exception.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-exception.Tpo $(DEPDIR)/libcmn64_a-exception.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exception.cpp' object='libcmn64_a-exception.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-exception.o `test -f 'exception.cpp' || echo '$(srcdir)/'`exception.cpp
-
-libcmn64_a-exception.obj: exception.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-exception.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-exception.Tpo -c -o libcmn64_a-exception.obj `if test -f 'exception.cpp'; then $(CYGPATH_W) 'exception.cpp'; else $(CYGPATH_W) '$(srcdir)/exception.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-exception.Tpo $(DEPDIR)/libcmn64_a-exception.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='exception.cpp' object='libcmn64_a-exception.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-exception.obj `if test -f 'exception.cpp'; then $(CYGPATH_W) 'exception.cpp'; else $(CYGPATH_W) '$(srcdir)/exception.cpp'; fi`
-
-libcmn64_a-ipconverter.o: ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-ipconverter.o -MD -MP -MF $(DEPDIR)/libcmn64_a-ipconverter.Tpo -c -o libcmn64_a-ipconverter.o `test -f 'ipconverter.cpp' || echo '$(srcdir)/'`ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-ipconverter.Tpo $(DEPDIR)/libcmn64_a-ipconverter.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ipconverter.cpp' object='libcmn64_a-ipconverter.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-ipconverter.o `test -f 'ipconverter.cpp' || echo '$(srcdir)/'`ipconverter.cpp
-
-libcmn64_a-ipconverter.obj: ipconverter.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-ipconverter.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-ipconverter.Tpo -c -o libcmn64_a-ipconverter.obj `if test -f 'ipconverter.cpp'; then $(CYGPATH_W) 'ipconverter.cpp'; else $(CYGPATH_W) '$(srcdir)/ipconverter.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-ipconverter.Tpo $(DEPDIR)/libcmn64_a-ipconverter.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ipconverter.cpp' object='libcmn64_a-ipconverter.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-ipconverter.obj `if test -f 'ipconverter.cpp'; then $(CYGPATH_W) 'ipconverter.cpp'; else $(CYGPATH_W) '$(srcdir)/ipconverter.cpp'; fi`
-
-libcmn64_a-packer.o: packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-packer.o -MD -MP -MF $(DEPDIR)/libcmn64_a-packer.Tpo -c -o libcmn64_a-packer.o `test -f 'packer.cpp' || echo '$(srcdir)/'`packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-packer.Tpo $(DEPDIR)/libcmn64_a-packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='packer.cpp' object='libcmn64_a-packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-packer.o `test -f 'packer.cpp' || echo '$(srcdir)/'`packer.cpp
-
-libcmn64_a-packer.obj: packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-packer.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-packer.Tpo -c -o libcmn64_a-packer.obj `if test -f 'packer.cpp'; then $(CYGPATH_W) 'packer.cpp'; else $(CYGPATH_W) '$(srcdir)/packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-packer.Tpo $(DEPDIR)/libcmn64_a-packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='packer.cpp' object='libcmn64_a-packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-packer.obj `if test -f 'packer.cpp'; then $(CYGPATH_W) 'packer.cpp'; else $(CYGPATH_W) '$(srcdir)/packer.cpp'; fi`
-
-libcmn64_a-socket.o: socket.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-socket.o -MD -MP -MF $(DEPDIR)/libcmn64_a-socket.Tpo -c -o libcmn64_a-socket.o `test -f 'socket.cpp' || echo '$(srcdir)/'`socket.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-socket.Tpo $(DEPDIR)/libcmn64_a-socket.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='socket.cpp' object='libcmn64_a-socket.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-socket.o `test -f 'socket.cpp' || echo '$(srcdir)/'`socket.cpp
-
-libcmn64_a-socket.obj: socket.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-socket.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-socket.Tpo -c -o libcmn64_a-socket.obj `if test -f 'socket.cpp'; then $(CYGPATH_W) 'socket.cpp'; else $(CYGPATH_W) '$(srcdir)/socket.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-socket.Tpo $(DEPDIR)/libcmn64_a-socket.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='socket.cpp' object='libcmn64_a-socket.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-socket.obj `if test -f 'socket.cpp'; then $(CYGPATH_W) 'socket.cpp'; else $(CYGPATH_W) '$(srcdir)/socket.cpp'; fi`
-
-libcmn64_a-stream.o: stream.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-stream.o -MD -MP -MF $(DEPDIR)/libcmn64_a-stream.Tpo -c -o libcmn64_a-stream.o `test -f 'stream.cpp' || echo '$(srcdir)/'`stream.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-stream.Tpo $(DEPDIR)/libcmn64_a-stream.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='stream.cpp' object='libcmn64_a-stream.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-stream.o `test -f 'stream.cpp' || echo '$(srcdir)/'`stream.cpp
-
-libcmn64_a-stream.obj: stream.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-stream.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-stream.Tpo -c -o libcmn64_a-stream.obj `if test -f 'stream.cpp'; then $(CYGPATH_W) 'stream.cpp'; else $(CYGPATH_W) '$(srcdir)/stream.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-stream.Tpo $(DEPDIR)/libcmn64_a-stream.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='stream.cpp' object='libcmn64_a-stream.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-stream.obj `if test -f 'stream.cpp'; then $(CYGPATH_W) 'stream.cpp'; else $(CYGPATH_W) '$(srcdir)/stream.cpp'; fi`
-
-libcmn64_a-tools.o: tools.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-tools.o -MD -MP -MF $(DEPDIR)/libcmn64_a-tools.Tpo -c -o libcmn64_a-tools.o `test -f 'tools.cpp' || echo '$(srcdir)/'`tools.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-tools.Tpo $(DEPDIR)/libcmn64_a-tools.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='tools.cpp' object='libcmn64_a-tools.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-tools.o `test -f 'tools.cpp' || echo '$(srcdir)/'`tools.cpp
-
-libcmn64_a-tools.obj: tools.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcmn64_a-tools.obj -MD -MP -MF $(DEPDIR)/libcmn64_a-tools.Tpo -c -o libcmn64_a-tools.obj `if test -f 'tools.cpp'; then $(CYGPATH_W) 'tools.cpp'; else $(CYGPATH_W) '$(srcdir)/tools.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libcmn64_a-tools.Tpo $(DEPDIR)/libcmn64_a-tools.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='tools.cpp' object='libcmn64_a-tools.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcmn64_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcmn64_a-tools.obj `if test -f 'tools.cpp'; then $(CYGPATH_W) 'tools.cpp'; else $(CYGPATH_W) '$(srcdir)/tools.cpp'; fi`
-
-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 $(LIBRARIES) $(HEADERS)
-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)
-
-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-noinstLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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 -rf ./$(DEPDIR)
-	-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-noinstLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	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
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp b/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp
deleted file mode 100644
index 1f1c778..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code
-
-****************************************************************************/
-
-#include <assert.h>
-#include <stdio.h>
-
-#include "envvar.hpp"
-#include "tools.hpp"
-
-EnvVar::EnvVar()
-{
-}
-
-EnvVar::~EnvVar()
-{
-    envlist.clear();
-}
-
-void EnvVar::set(string &env, const char *value)
-{
-    if (value) {
-        envlist[env] = env + "=" + value;
-    }
-}
-
-void EnvVar::set(string &env, string &value)
-{
-    envlist[env] = env + "=" + value;
-}
-
-void EnvVar::set(string &env, int value)
-{
-    envlist[env] = env + "=" + SysUtil::itoa(value);
-}
-
-void EnvVar::set(string &env, long long value)
-{
-    envlist[env] = env + "=" + SysUtil::lltoa(value);
-}
-
-void EnvVar::set(const char *env, const char *value)
-{
-    assert(env);
-    if (value) {
-        envlist[env] = string(env) + "=" + value;
-    }
-}
-
-void EnvVar::set(const char *env, string &value)
-{
-    assert(env);
-    envlist[env] = string(env) + "=" + value;
-}
-
-void EnvVar::set(const char *env, int value)
-{
-    assert(env);
-    envlist[env] = string(env) + "=" + SysUtil::itoa(value);
-}
-
-void EnvVar::set(const char *env, long long value)
-{
-    assert(env);
-    envlist[env] = string(env) + "=" + SysUtil::lltoa(value);
-}
-
-string & EnvVar::get(string &env)
-{
-    retval = "";
-    
-    if (envlist.find(env) != envlist.end())
-        retval = envlist[env];
-    
-    return retval;
-}
-
-string & EnvVar::get(const char *env)
-{
-    retval = "";
-    
-    if (envlist.find(env) != envlist.end())
-        retval = envlist[env];
-    
-    return retval;
-}
-
-string & EnvVar::getExportcmd()
-{
-    retval = "";
-    
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) 
-        retval += "export " + p->second + ";";
-
-    return retval;
-}
-
-string & EnvVar::getEnvString()
-{
-    retval = "";
-    
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) {
-        retval += ";" + p->second;
-    }
-    
-    return retval;
-}
-
-void EnvVar::unsetAll()
-{
-    envlist.clear();
-}
-
-void EnvVar::dump()
-{
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) {
-        printf("%s\n", p->second.c_str());
-    }
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp b/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp
deleted file mode 100644
index efa4a02..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ENVVAR_HPP
-#define _ENVVAR_HPP
-
-#include <map>
-#include <string>
-
-using namespace std;
-
-class EnvVar 
-{
-    private:
-        map<string, string> envlist;
-        string              retval;
-        
-    public:
-        EnvVar();
-        ~EnvVar();
-        
-        void set(string &env, const char *val);
-        void set(string &env, string &val);
-        void set(string &env, int val);
-        void set(string &env, long long val);
-        void set(const char *env, const char *val);
-        void set(const char *env, string &val);
-        void set(const char *env, int val);
-        void set(const char *env, long long val);
-        string & get(string &env);
-        string & get(const char *env);
-
-        string & getExportcmd();
-        string & getEnvString();
-
-        void unsetAll();
-        void dump();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/exception.cpp b/tools/sci/org.eclipse.ptp.sci/common/exception.cpp
deleted file mode 100644
index 0c37e77..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/exception.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Exception
-
- Description: Wrapper for SCI's exceptions.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#include "exception.hpp"
-#include <assert.h>
-
-const char * ErrMsg[] = {
-    "Memory allocation failed.",
-    "Error occur when call getaddrinfo.",
-    "Invalid user credential.",
-    "Error occur when call some system call.",
-    "Invalid launch action.",
-    "Invalid message signature."
-};
-
-Exception::Exception(int code) throw()
-        : errCode(code)
-{
-}
-
-const char * Exception::getErrMsg() const throw()
-{
-    return ErrMsg[errCode];
-}
-
-int Exception::getErrCode() const throw()
-{
-    return errCode;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/exception.hpp b/tools/sci/org.eclipse.ptp.sci/common/exception.hpp
deleted file mode 100644
index 1fce57a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/exception.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Exception
-
- Description: Wrapper for SCI's exceptions.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _EXCEPTION_HPP
-#define _EXCEPTION_HPP
-
-class Exception
-{
-    public:
-        enum CODE {
-            MEM_BAD_ALLOC,
-            GET_ADDR_INFO,
-            INVALID_USER,
-            SYS_CALL,
-            INVALID_LAUNCH,
-            INVALID_SIGNATURE
-        };
-        
-    private:
-        int        errCode;
-        
-    public:
-        Exception(int code) throw();
-        
-        const char * getErrMsg() const throw();
-        int getErrCode() const throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/group.cpp b/tools/sci/org.eclipse.ptp.sci/common/group.cpp
deleted file mode 100644
index 980c5c9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/group.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Group
-
- Description: Group manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#include "group.hpp"
-#include <assert.h>
-#include <ctype.h>
-#include <stdio.h>
-
-Group::Group()
-{
-}
-
-Group::Group(ClientId clientId)
-{
-    Add(Range(clientId, clientId+1));
-}
-
-Group::Group(Range r)
-{
-    Add(r);
-}
-
-Group::Group(Group &group)
-{
-    Add(group);
-}
-
-bool Group::operator == (Group &g)
-{
-    if (rangeList.size() != g.rangeList.size())
-        return false;
-    for (int i = 0; i < (int)rangeList.size(); i++)
-        if (rangeList[i] != g.rangeList[i])
-            return false;
-    return true;
-}
-
-bool Group::HasMember(ClientId clientId)
-{
-    range_iterator it;
-    for (it=rangeList.begin(); it!=rangeList.end(); ++it) {
-        if (clientId >= (*it).end()) {
-            continue;
-        } else if (clientId >= (*it).begin()) {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool Group::HasRange(Range & r)
-{    
-    for(Range::iterator i=r.begin(); i< r.end(); i++ )
-        if (this->HasMember(i))
-            continue;
-        else 
-            return false;    
-    return true;
-}
-
-int Group::Index(ClientId clientId)
-{
-    int index = 0;
-    range_iterator it = rangeList.begin();
-    for ( ; it!=rangeList.end(); ++it) {
-        if (clientId < (*it).begin()) {
-            break;
-        } else if (clientId < (*it).end()) {
-            return index + clientId - (*it).begin();
-        } else {
-            index += (*it).end() - (*it).begin();
-        }
-    }
-       
-    assert(!"Should have found index");
-    return index;
-}
-
-range_iterator Group::Add(ClientId clientId)
-{
-    return Add(Range(clientId, clientId+1));
-}
-
-range_iterator Group::Add(Range r)
-{
-    return Add(r, rangeList.begin());
-}
-
-range_iterator Group::Add(Range r, range_iterator range)
-{
-    // shortcut for a higher range
-    if (!rangeList.empty() && !r.Touches(*rangeList.rbegin())
-            && !r.IsBefore(*rangeList.rbegin()))
-        return rangeList.insert(rangeList.end(), r);
-
-    for (; range != rangeList.end(); range++)
-        if (r.Touches(*range) || r.IsBefore(*range))
-            break;
-    if (range == rangeList.end()) {
-        return rangeList.insert(range, r);
-    } else if (r.Touches(*range)) {
-        *range = r.Union(*range);
-        while (range + 1 != rangeList.end() && range->Touches(*(range+1))) {
-            *range = range->Union(*(range+1));
-            rangeList.erase(range+1);
-        }
-        return range;
-    } else {
-        return rangeList.insert(range, r);
-    }
-}
-
-void Group::Add(Group &group)
-{
-    range_iterator pos = rangeList.begin();
-    range_iterator it = group.rangeList.begin();
-    for ( ; it!=group.rangeList.end(); ++it) {
-        pos = Add((*it), pos);
-    }
-}
-
-void Group::Delete(ClientId clientId)
-{
-    Delete(Range(clientId, clientId+1));
-}
-
-void Group::Delete(Range r)
-{
-    Delete(r, rangeList.begin());
-}
-
-range_iterator Group::Delete(Range r, range_iterator range)
-{
-    for (; range != rangeList.end(); range++)
-        if (r.Intersects(*range) || r.IsBefore(*range))
-            break;
-    if (range == rangeList.end())
-        return range;
-    else if (r.Intersects(*range)) {
-        range_iterator savedRange = range;
-        if (r.Splits(*range)) {
-            Range newRange(r.end(), range->end());
-            *range = Range(range->begin(), r.begin());
-            range = rangeList.insert(range+1, newRange);
-            return range;
-        } else {
-            while (range != rangeList.end()) {
-                if (r.Contains(*range)) {
-                    rangeList.erase(range);
-                } else {
-                    *range = range->Difference(r);
-                    range++;
-                }
-            }
-        }
-        return savedRange;
-    } else
-        return range;
-}
-
-void Group::Delete(Group &group)
-{
-    range_iterator pos = rangeList.begin();
-    range_iterator it = group.rangeList.begin();
-    for ( ; it!=group.rangeList.end(); ++it) {
-        pos = Delete((*it), pos);
-    }
-}
-
-void Group::Clear()
-{
-    rangeList.clear();
-}
-
-Group::iterator Group::begin()
-{
-    return iterator(rangeList.begin(), rangeList.end());
-}
-
-Group::iterator Group::end()
-{
-    return iterator(rangeList.end(), rangeList.end()); 
-}
-
-size_t Group::size()
-{
-    int len = 0;
-    range_iterator it = rangeList.begin();
-    for ( ; it!=rangeList.end(); ++it) {
-        len += (*it).end() - (*it).begin();
-    }
-
-    return len;
-}
-
-/////////////////////////////////////////
-
-Group::iterator::iterator(range_iterator first, range_iterator last)
-    : firstRange(first), lastRange(last)
-{
-    if (firstRange != lastRange)
-        clientId = firstRange->begin();
-    else
-        clientId = -1;
-}
-
-ClientId & Group::iterator::operator *()
-{
-    return clientId;
-}
-
-Group::iterator Group::iterator::operator ++ (int)
-{
-    if (++clientId == firstRange->end()) {
-        firstRange++;
-        if (firstRange != lastRange)
-            clientId = firstRange->begin();
-        else
-            clientId = -1;
-    }
-    return *this;
-}
-
-bool Group::iterator::operator == (Group::iterator it)
-{
-    return firstRange == it.firstRange && clientId == it.clientId;
-}
-
-bool Group::iterator::operator != (Group::iterator it)
-{
-    return !(*this == it);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/group.hpp b/tools/sci/org.eclipse.ptp.sci/common/group.hpp
deleted file mode 100644
index 5e3b618..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/group.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Group
-
- Description: Group manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _GROUP_HPP
-#define _GROUP_HPP
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "range.hpp"
-
-using namespace std;
-
-typedef int  ClientId;
-typedef int  GroupId;
-typedef vector<Range> RangeList;
-typedef RangeList::iterator range_iterator;
-
-class Group
-{
-    private:
-        RangeList  rangeList;
-
-    public:
-        Group();
-        Group(ClientId);
-        Group(Range r);
-        Group(Group &group);
-
-        bool operator == (Group &);
-        bool HasMember(ClientId);
-        bool HasRange(Range &);
-        int  Index(ClientId);
-
-        range_iterator Add(ClientId);
-        range_iterator Add(Range);
-        range_iterator Add(Range, range_iterator range);
-        void           Add(Group &group);
-        void           Delete(ClientId);
-        void           Delete(Range);
-        range_iterator Delete(Range, range_iterator range);
-        void           Delete(Group &group);
-        void           Clear();
-
-        class iterator { 
-            private:
-                range_iterator   firstRange;
-                range_iterator   lastRange;
-                ClientId         clientId;
-            public:
-                iterator(range_iterator first, range_iterator last);
-                iterator   operator ++ (int);
-                ClientId  &operator *  ();
-                bool       operator == (iterator it);
-                bool       operator != (iterator it);
-        };
-
-        iterator begin();
-        iterator end();
-        bool     empty() { return rangeList.empty(); }
-        size_t   size();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp b/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp
deleted file mode 100644
index 1f4013c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: IPConverter
-
- Description: Convert ifname to ip addresses.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/10/09 nieyy      Initial code
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "ipconverter.hpp"
-#include <assert.h>
-#include <netinet/in.h>
-#include <string.h>
-
-#include "exception.hpp"
-
-IPConverter::IPConverter() 
-    : ip_addr("")
-{
-    int ret = 0;
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-    ret = ::getifaddrs(&ifa);
-    if (ret != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-#else
-    int fd, ifsize;
-    if ((fd = ::socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-        ret = -1;
-    }
-
-    if (ret == 0 && ::ioctl(fd, SIOCGSIZIFCONF, (caddr_t)&ifsize) < 0) {
-        ret = -1;
-    }
-
-    if (ret == 0 && (ifc.ifc_req = (struct ifreq *)::malloc(ifsize)) == NULL) {
-        ret = -1;
-    }
-
-    ifc.ifc_len = ifsize;
-
-    if (ret == 0 && ::ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc) < 0) {
-        ret = -1;
-    }
-    if (ret != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-#endif
-}
-
-IPConverter::~IPConverter()
-{
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-    if (ifa) {
-        ::freeifaddrs(ifa);
-        ifa = NULL;
-    }
-#else
-    if (ifc.ifc_req) {
-        ::free(ifc.ifc_req);
-    }
-#endif
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, string &addr)
-{
-    if (getIP(ifname, ipv4)) {
-        return -1;
-    }
-    addr = ip_addr;
-    ip_addr = "";
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, struct sockaddr_in *addr)
-{
-    if (!ipv4 || getIP(ifname, ipv4)) {
-        return -1;
-    }
-    ::memcpy(addr, &sin, sizeof(struct sockaddr_in));
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, struct sockaddr_in6 *addr)
-{
-    if (ipv4 || getIP(ifname, ipv4)) {
-        return -1;
-    }
-    ::memcpy(addr, &sin6, sizeof(struct sockaddr_in6));
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4)
-{
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-    return getIPLinux(ifname, ipv4);
-#else
-    return getIPAIX(ifname, ipv4);
-#endif
-}
-
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-
-int IPConverter::getIPLinux(const string &ifname, bool ipv4)
-{
-    struct ifaddrs *ifa_tmp;
-    char addr[INET6_ADDRSTRLEN];
-    int ret = -1;
-
-    ifa_tmp = ifa;
-
-    for (; ifa_tmp; ifa_tmp = ifa_tmp->ifa_next) {
-        string name(ifa_tmp->ifa_name);
-        if (ifname != name ||
-            ifa_tmp->ifa_addr->sa_family != (ipv4 ? AF_INET : AF_INET6)) {
-            continue;
-        }
-
-        if (ifa_tmp->ifa_addr) {
-            if (ipv4) {
-                ::memcpy(&sin, ifa_tmp->ifa_addr, sizeof(struct sockaddr_in));
-                if (::inet_ntop(AF_INET, &sin.sin_addr, addr, sizeof(addr)) == NULL) {
-                    continue;
-                }
-            } else {
-                ::memcpy(&sin6, ifa_tmp->ifa_addr, sizeof(struct sockaddr_in6));
-                if (::inet_ntop(AF_INET6, &sin6.sin6_addr, addr, sizeof(addr)) == NULL) {
-                    continue;
-                }
-            }
-            ip_addr = addr;
-            ret = 0;
-            break;
-        }
-    }
-
-    return(ret);        //return 0 is okay
-}
-
-#else /* AIX */
-
-#define REAL_SIZE(a) (((a).sa_len) > (sizeof(a)) ? ((a).sa_len) : (sizeof(a)))
-
-int IPConverter::getIPAIX(const string &ifname, bool ipv4)
-{
-    char *ifr_ch, addr[INET6_ADDRSTRLEN];
-    struct ifreq *ifr = ifc.ifc_req;
-    struct sockaddr *sa;
-    int ret = -1;
-    /*
-     * On AIX, actual size of ifr->ifr_addr is possibly larger than
-     * size of the structure, real size is in sa_len
-     */
-    for (ifr_ch = (char *)ifc.ifc_req; ifr_ch < (char *)ifc.ifc_req + ifc.ifc_len;
-        ifr_ch += (sizeof(ifr->ifr_name) + REAL_SIZE(ifr->ifr_addr))) {
-        ifr = (struct ifreq *)ifr_ch;
-        sa = (struct sockaddr *)&(ifr->ifr_addr);
-
-        if (::strcasecmp(ifr->ifr_name, ifname.c_str()) ||
-            sa->sa_family != (ipv4 ? AF_INET : AF_INET6)) {
-            continue;
-        }
-
-        if (ipv4) {
-            ::memcpy((void *)&sin, (void *)sa, sizeof(struct sockaddr_in));
-            if (::inet_ntop(AF_INET, (void *)(&sin.sin_addr), addr, sizeof(addr)) == NULL) {
-                continue;
-            }
-        } else {
-            ::memcpy((void *)&sin6, (void *)sa, sizeof(struct sockaddr_in6));
-            if (::inet_ntop(AF_INET6, (void *)(&sin6.sin6_addr), addr, sizeof(addr)) == NULL) {
-                continue;
-            }
-        }
-        ip_addr = addr;
-        ret = 0;
-
-        break;
-    }
-
-    return ret;     //return 0 is okay
-}
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp b/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp
deleted file mode 100644
index 05666d3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: IPConverter
-
- Description: Convert ifname to ip addresses.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/10/09 nieyy      Initial code
-
-****************************************************************************/
-
-#ifndef _IPCONVERTER_HPP
-#define _IPCONVERTER_HPP
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <ifaddrs.h>
-#else /* AIX */
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <net/if_arp.h>
-#include <net/netopt.h>
-#include <arpa/inet.h>
-#endif
-
-#include <string>
-using namespace std;
-
-class IPConverter
-{
-    private:
-        string ip_addr;
-        struct sockaddr_in sin;
-        struct sockaddr_in6 sin6;
-
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-        struct ifaddrs *ifa;
-#else /* AIX */
-        struct ifconf ifc;
-#endif
-
-    public:
-        IPConverter();
-        ~IPConverter();
-        
-        int getIP(const string &ifname, bool ipv4, string &addr);
-        int getIP(const string &ifname, bool ipv4, struct sockaddr_in *addr);
-        int getIP(const string &ifname, bool ipv4, struct sockaddr_in6 *addr);
-
-    private:
-        int getIP(const string &ifname, bool ipv4);
-
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-        int getIPLinux(const string &ifname, bool ipv4);
-#else /* AIX */
-        #define REAL_SIZE(a) (((a).sa_len) > (sizeof(a)) ? ((a).sa_len) : (sizeof(a)))
-        int getIPAIX(const string &ifname, bool ipv4);
-#endif       
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/log.cpp b/tools/sci/org.eclipse.ptp.sci/common/log.cpp
deleted file mode 100644
index 0380887..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/log.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-   07/19/12 ronglli      Fix the log dir update issue 
-
-****************************************************************************/
-
-#include "log.hpp"
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <time.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <string.h>
-
-const char *logHeader[] = {
-    "[CRIT]",
-    "[ERROR]",
-    "[WARN]",
-    "[INFO]",
-    "[DEBUG]",
-    "[PERF]",
-    "[OTHER]",
-};
-
-Log *Log::logger = NULL;
-
-Log::Log()
-{
-}
-
-Log::~Log()
-{
-}
-
-void Log::init(const char *directory, const char * filename, int level, int m)
-{
-    assert(filename);
-    assert(directory);
-    
-    char node[256] = {0};
-    gethostname(node, sizeof(node));
-
-    logFile = filename;
-    logDir = directory;
-    sprintf(logPath, "%s/%s.%s.%d" , directory, node, filename, (int)getpid());
-    permitLevel = level;
-    mode = m;
-    unlink(logPath);
-}
-
-void Log::rename(const char *directory, int level, int m)
-{
-    int rc = -1;
-    char new_logPath[2 * MAX_PATH_LEN]; 
-    char node[256] = {0};
-
-    if ((level >= 0) && (permitLevel != level)) {
-        permitLevel = level;
-    }
-    if (m != INVALID)
-        mode = m;
-
-    if (directory == NULL) 
-        return; 
-
-    if (logDir == string(directory))
-        return;
-
-    gethostname(node, sizeof(node));
-    sprintf(new_logPath, "%s/%s.%s.%d" , directory, node, logFile.c_str(), (int)getpid());
-    if (::access(logPath, F_OK) == 0) {
-        rc = ::rename(logPath, new_logPath);
-        if (rc != 0) {
-            log_error("Unable to rename log file from %s to %s, rc is %d, errno=%d(%s)", 
-                    logPath, new_logPath, rc, errno, strerror(errno));
-        } else {
-            sprintf(logPath, "%s", new_logPath);
-            log_warn("Move log file from %s to %s", logDir.c_str(), directory);
-            logDir = directory;
-        }
-    } else { 
-        sprintf(logPath, "%s", new_logPath);
-        log_warn("Move log file from %s to %s", logDir.c_str(), directory);
-        logDir = directory;
-    }
-}
-
-void Log::print(int level, char *srcFile, int srcLine, const char *format, ...)
-{
-    if (mode != ENABLE)
-        return;
-
-    if(level > permitLevel)
-        return;
-    
-    char tmMsg[MAX_LOG_LEN];
-    time_t time1;
-    struct tm tm1;
-    va_list args;
-    
-    va_start(args, format);
-    memset(tmMsg, 0, MAX_LOG_LEN);
-    time(&time1);
-    localtime_r(&time1, &tm1);
-    strftime(tmMsg, MAX_LOG_LEN, "%y%m%d-%H:%M:%S", &tm1);
-    
-    FILE *fp = fopen(logPath, "a");
-    if (fp) {
-        fprintf(fp, "%s", tmMsg);
-        fprintf(fp, "%s ", (char *)logHeader[level]);
-        vfprintf(fp, format, args);
-        fprintf(fp, " (%s:%d|%lu)\n", srcFile, srcLine, pthread_self());
-        fclose(fp);
-    }
-    
-    va_end(args);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/log.hpp b/tools/sci/org.eclipse.ptp.sci/common/log.hpp
deleted file mode 100644
index 8723b17..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/log.hpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#ifndef _LOG_HPP
-#define _LOG_HPP
-
-#include <pthread.h>
-#include <string>
-
-#define MAX_LOG_LEN 1024
-#define MAX_PATH_LEN 512
-
-using namespace std;
-
-class Log 
-{
-    public:
-        enum LEVEL {
-            CRITICAL,
-            ERROR,
-            WARNING,
-            INFORMATION,
-            DEBUG,
-            PERFORMANCE,
-            OTHER
-        };
-
-        enum MODE {
-            INVALID = -1,
-            DISABLE = 0,
-            ENABLE = 1
-        };
-        
-    private:
-        Log();
-       
-        int mode; 
-        int permitLevel;
-        string logDir;
-        string logFile;
-        char logPath[2 * MAX_PATH_LEN];
-
-        static Log *logger;
-        
-    public:
-        ~Log();
-        static Log * getInstance() {
-            if(logger == NULL)
-                logger = new Log();
-            return logger;
-        }
-        
-        void init(const char *directory = "../log", const char * filename = "debug.log", int level = INFORMATION, int m = DISABLE);
-        void rename(const char *directory = "../log", int level = INFORMATION, int m = INVALID);
-        void print(int level, char * srcFile, int srcLine, const char * format, ...);
-
-        string & getLogDir() { return logDir; }
-        int getLogLevel() { return permitLevel; }
-};
-
-#ifdef _SCI_DEBUG
-
-#define log_init(a, b, c, d)  Log::getInstance()->init(a, b, c, d)
-#define log_rename(a, b, c)   Log::getInstance()->rename(a, b, c)
-#define log_crit(...)      Log::getInstance()->print(Log::CRITICAL, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_error(...)     Log::getInstance()->print(Log::ERROR, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_warn(...)      Log::getInstance()->print(Log::WARNING, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_info(...)      Log::getInstance()->print(Log::INFORMATION, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_debug(...)     Log::getInstance()->print(Log::DEBUG, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_perf(...)      Log::getInstance()->print(Log::PERFORMANCE, __FILE__, __LINE__,  __VA_ARGS__)
-
-#else
-
-#define log_init(...)   
-#define log_rename(...)   
-#define log_crit(...)
-#define log_error(...)
-#define log_warn(...)
-#define log_info(...)
-#define log_debug(...)
-#define log_perf(...)
-
-#endif
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/packer.cpp b/tools/sci/org.eclipse.ptp.sci/common/packer.cpp
deleted file mode 100644
index a8c0f76..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/packer.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Packer
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include "packer.hpp"
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <string.h>
-
-const int PACK_SIZE = 256;
-
-Packer::Packer()
-    : msgLen(0), bufSize(PACK_SIZE)
-{
-    msgBuf = new char[bufSize];
-    msgPtr = msgBuf;
-}
-
-Packer::Packer(char *msg)
-    : msgLen(0), bufSize(0)
-{
-    msgBuf = msg;
-    msgPtr = msgBuf;
-}
-
-char * Packer::getPackedMsg()
-{
-    return msgBuf;
-}
-
-int Packer::getPackedMsgLen()
-{
-    return msgLen;
-}
-
-
-void Packer::packInt(int value)
-{
-    int val = htonl(value);
-    int len = sizeof(val);
-
-    checkBuffer(len);
-    memcpy(msgPtr, &val, len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::packStr(const char *value)
-{
-    int len = strlen(value) + 1;
-    packInt(len);
-
-    checkBuffer(len);
-    memcpy(msgPtr, value, len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::packStr(const string &value)
-{
-    int len = strlen(value.c_str()) + 1;
-    packInt(len);
-
-    checkBuffer(len);
-    memcpy(msgPtr, value.c_str(), len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::setPackedMsg(const void * msg)
-{
-    msgBuf = (char *) msg;
-    msgPtr = msgBuf;
-}
-
-int Packer::unpackInt()
-{
-    int size, value;
-    memcpy(&size, msgPtr, sizeof(size));
-
-    value = ntohl(size);
-    msgPtr += sizeof(size);
-
-    return value;
-}
-
-char * Packer::unpackStr()
-{
-    int len;
-    char *value;
-
-    len = unpackInt();
-    value = msgPtr;
-    msgPtr += len;
-
-    return value;
-}
-
-void Packer::checkBuffer(int size)
-{
-    char *tmp = NULL;
-    int len = msgLen + size;
-
-    if (len <= bufSize) 
-        return;
-
-    while (bufSize < len)
-        bufSize *= 2;
-    tmp = new char[bufSize];
-    memcpy(tmp, msgBuf, msgLen);
-    msgPtr = tmp + (msgPtr - msgBuf);
-    delete []msgBuf;
-    msgBuf = tmp;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/packer.hpp b/tools/sci/org.eclipse.ptp.sci/common/packer.hpp
deleted file mode 100644
index 25dc3ce..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/packer.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Packer
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _PACKER_HPP
-#define _PACKER_HPP
-
-#include <vector>
-#include <map>
-#include <string>
-
-using namespace std;
-
-class Packer 
-{
-    private:
-        char        *msgBuf;
-        char        *msgPtr;
-        int         msgLen;
-        int         bufSize;
-        
-    public:
-        Packer();
-        Packer(char *msg);
-
-        // for message packing usage
-        void packInt(int value);
-        void packStr(const char *value);
-        void packStr(const string &value);
-        char * getPackedMsg();
-        int getPackedMsgLen();
-
-        // for message unpacking usage
-        void setPackedMsg(const void *msg);
-        int unpackInt();
-        char * unpackStr();
-
-    public:
-        void checkBuffer(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/range.cpp b/tools/sci/org.eclipse.ptp.sci/common/range.cpp
deleted file mode 100644
index 40226bd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/range.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Range
-
- Description: Range manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#include "range.hpp"
-#include <assert.h>
-#include <stdio.h>
-
-Range::Range()
-    : first(0), last(0)
-{
-}
-
-Range::Range(const Range &r)
-    : first(r.first), last(r.last)
-{
-}
-
-Range::Range(int _first, int _last)
-    : first(_first), last(_last)
-{
-}
-
-bool Range::operator == (Range &r)
-{
-    return first == r.first && last == r.last;
-}
-
-bool Range::operator != (Range &r)
-{
-    return first != r.first || last != r.last;
-}
-
-bool Range::Intersects(Range r)
-{
-    return (((first <= r.first) && (r.first < last))
-             || ((first < r.last) && (r.last <= last))
-             || this->Contains(r) || r.Contains(*this));
-}
-
-bool Range::Touches(Range r)
-{
-    return (((first <= r.first) && (r.first <= last))
-             || ((first <= r.last) && (r.last <= last))
-             || this->Contains(r) || r.Contains(*this));
-}
-
-bool Range::IsBefore(Range r)
-{
-    return last <= r.first;
-}
-
-bool Range::IsAfter(Range r)
-{
-    return r.last <= first;
-}
-
-bool Range::Contains(Range r)
-{
-    return (first <= r.first && r.last <= last);
-}
-
-bool Range::Splits(Range r)
-{
-    return (r.first < first && last < r.last);
-}
-
-Range Range::Union(Range r)
-{
-    assert(this->Touches(r));
-    return Range(min(first, r.first), max(last, r.last));
-}
-
-Range Range::Difference(Range r)
-{
-    assert(!r.Splits(*this));
-    if (this->Intersects(r)) {
-        if (first < r.first) {
-            return Range(first, r.first);
-        } else {
-            assert(r.last < last);
-            return Range(r.last, last);
-        }
-    } else
-        return *this;  // unchanged
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/range.hpp b/tools/sci/org.eclipse.ptp.sci/common/range.hpp
deleted file mode 100644
index 1a55c0f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/range.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Range
-
- Description: Range manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _RANGE_HPP
-#define _RANGE_HPP
-
-#include <string>
-
-using namespace std;
-
-#define RANGE_SEPARATOR ":"
-
-class Range
-{
-    private:
-        int   first;
-        int   last;
-    public:
-        Range();
-        Range(const Range &r);
-        Range(int _first, int _last);
-
-        typedef int iterator;
-        iterator begin() { return first; }
-        iterator end()   { return last; }
-
-        bool  operator == (Range &r);
-        bool  operator != (Range &r);
-        bool  Intersects(Range r);
-        bool  Touches(Range r);
-        bool  Splits(Range r);
-        bool  Contains(Range r);
-        bool  IsBefore(Range r);
-        bool  IsAfter(Range r);
-        Range Union(Range r);
-        Range Difference(Range r);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/socket.cpp b/tools/sci/org.eclipse.ptp.sci/common/socket.cpp
deleted file mode 100644
index a982e2d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/socket.cpp
+++ /dev/null
@@ -1,491 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Socket, SocketException
-
- Description: Socket manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <netinet/tcp.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <poll.h>
-
-#include "socket.hpp"
-#include "tools.hpp"
-#include "ipconverter.hpp"
-
-
-#define CONNECTING_TIMES 200
-
-int Socket::disableIpv6 = 0;
-int Socket::connTimes = CONNECTING_TIMES;
-
-Socket::Socket(int sockfd)
-    : socket(sockfd)
-{
-	int i = 0;
-
-    numListenfds = 0;
-	for (i = 0; i < NELEMS(accSockets); i++) {
-        accSockets[i] = -1;
-    }
-}
-
-Socket::~Socket()
-{
-	int i = 0;
-
-	for (i = 0; i < NELEMS(accSockets); i++) {
-        ::close(accSockets[i]);
-    }
-    ::close(socket);
-}
-
-int Socket::setMode(int sockfd, bool mode)
-{
-    int flags, newflags;
-
-    flags = ::fcntl(sockfd, F_GETFL);
-    if (flags < 0)
-        throw SocketException(SocketException::NET_ERR_FCNTL, errno);
-
-    if (mode)
-        newflags = flags & ~O_NONBLOCK;
-    else
-        newflags = flags | O_NONBLOCK;
-
-    if (newflags != flags) {
-        if (::fcntl(sockfd, F_SETFL, newflags) < 0) {
-            throw SocketException(SocketException::NET_ERR_FCNTL, errno);
-        }
-    }
-    
-    return 0;
-}
-
-int Socket::setFd(int fd)
-{
-    if (fd < 0) {
-        throw SocketException(SocketException::NET_ERR_SOCKET, errno);
-    }
-    int nodelay = 1;
-    ::setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
-    socket = fd;
-
-    return 0;
-}
-
-int Socket::listen(int &port, char *hname)
-{
-    int sockfd;
-    int yes, rc;
-	int accCount = 0;
-    struct addrinfo hints, *host, *ressave;
-    char service[NI_MAXSERV] = {0};
-
-    ::memset(&hints, 0, sizeof(struct addrinfo));
-    hints.ai_flags = (hname == NULL) ? AI_PASSIVE : 0;
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    ::sprintf(service, "%d", port);
-    ::getaddrinfo(hname, service, &hints, &host);
-    ressave = host;
-
-    while (host && (accCount < NELEMS(accSockets))) {
-		if ((host->ai_family != AF_INET) && (host->ai_family != AF_INET6)) {
-            host = host->ai_next;
-            continue;
-        }
-
-        if ((host->ai_family == AF_INET6) && (getDisableIPv6() == 1)) {
-            host = host->ai_next;
-            continue;
-        }
-
-        sockfd = ::socket(host->ai_family, host->ai_socktype, host->ai_protocol);
-        if (sockfd >= 0) {
-			yes = 1;
-			rc = ::setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
-			if (host->ai_family == AF_INET6) {
-				setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes));
-				sockaddr_in6 *addr6 = (sockaddr_in6 *)host->ai_addr;
-				if (port != 0)
-					addr6->sin6_port = htons(port);
-			} else {
-				sockaddr_in *addr4 = (sockaddr_in *)host->ai_addr;
-				if (port != 0)
-					addr4->sin_port = htons(port);
-			}
-			setMode(sockfd, false);
-            rc = ::bind(sockfd, host->ai_addr, host->ai_addrlen);
-            if (rc == 0) {
-                struct sockaddr_storage sockaddr;
-                socklen_t len = sizeof(sockaddr);
-
-                ::getsockname(sockfd, (struct sockaddr *)&sockaddr, &len);
-                ::getnameinfo((struct sockaddr *)&sockaddr, len, NULL, 0,
-                        service, sizeof(service), NI_NUMERICSERV);
-                port = ::atoi(service);
-				rc = ::listen(sockfd, SOMAXCONN);
-                accSockets[accCount] = sockfd;
-				accCount++;
-            } else {
-				::close(sockfd);
-			}
-        }
-        host = host->ai_next;
-    }
-
-    if (accCount <= 0) {
-        throw SocketException(SocketException::NET_ERR_BIND, errno);
-    }
-    ::freeaddrinfo(ressave);
-
-    numListenfds = accCount;
-    return accCount;
-}
-
-int Socket::iflisten(int & port, const string & ifname)
-{
-    int accCount = 0;
-    char service[NI_MAXSERV] = {0};
-    ::sprintf(service, "%d", port);
-    
-    int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
-    if (sockfd < 0) {
-        throw SocketException(SocketException::NET_ERR_SOCKET, errno);
-    }
-
-    int yes = 1;
-    ::setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
-
-    IPConverter converter;
-    struct sockaddr_in addr;
-    converter.getIP(ifname, true, &addr);
-
-    int rc = ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
-    if (rc == 0) {
-        struct sockaddr_storage sockaddr;
-        socklen_t len = sizeof(sockaddr);
-
-        ::getsockname(sockfd, (struct sockaddr *)&sockaddr, &len);
-        ::getnameinfo((struct sockaddr *)&sockaddr, len, NULL, 0,
-            service, sizeof(service), NI_NUMERICSERV);
-        port = ::atoi(service);
-    } else {
-        throw SocketException(SocketException::NET_ERR_BIND, errno);
-    }
-
-    ::listen(sockfd, SOMAXCONN);
-    accSockets[accCount] = sockfd;
-    accCount++;
-    numListenfds = accCount;
-
-    return sockfd;
-}
-
-int Socket::connect(const char *hostName, in_port_t port)
-{
-    int rc = -1;
-    int sockfd, nodelay;
-    char service[NI_MAXSERV] = {0};
-    struct addrinfo *host = NULL, *ressave;
-    int count = 0;
-	bool connected = false;
-
-    while (count < connTimes) {
-        struct addrinfo hints = {0};
-        ::sprintf(service, "%d", port);
-        hints.ai_family = AF_UNSPEC;
-        hints.ai_socktype = SOCK_STREAM;
-        hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
-
-        rc = ::getaddrinfo(hostName, service, &hints, &host);
-        if (rc == EAI_NONAME) {
-            hints.ai_flags = 0;
-            rc = ::getaddrinfo(hostName, service, &hints, &host);
-        }
-        if (!host) {
-            throw SocketException(SocketException::NET_ERR_GETADDRINFO, errno);
-        }
-
-		ressave = host;
-        while (host) {
-            if ((host->ai_family == AF_INET6) && (getDisableIPv6() == 1)) {
-                host = host->ai_next;
-                continue;
-            }
-
-			sockfd = ::socket(host->ai_family, host->ai_socktype, host->ai_protocol);
-			if (sockfd < 0) {
-				::freeaddrinfo(host);
-				throw SocketException(SocketException::NET_ERR_SOCKET, errno);
-			}
-			nodelay = 1;
-			rc = ::setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
-
-			rc = ::connect(sockfd, host->ai_addr, host->ai_addrlen);
-			if (rc == 0) {
-				connected = true;
-				break;
-			}
-			host = host->ai_next;
-		}
-        count++;
-        ::freeaddrinfo(ressave);
-		if (connected)
-			break;
-
-        ::close(sockfd);
-        ::sleep(1);
-    }
-    if (rc < 0) {
-        throw SocketException(SocketException::NET_ERR_CONNECT, errno);
-    }
-    socket = sockfd;
-
-    return sockfd;
-}
-
-int Socket::stopAccept()
-{
-	int i = 0;
-
-	for (i = 0; i < NELEMS(accSockets); i++) {
-        if (accSockets[i] != -1) {
-            ::shutdown(accSockets[i], SHUT_RDWR);
-            ::close(accSockets[i]);
-            accSockets[i] = -1;
-        }
-	}
-
-	return 0;
-}
-
-int Socket::accept()
-{
-    int client = -1;
-    int nodelay = 1;
-    struct sockaddr_storage sockaddr;
-    socklen_t len = sizeof(sockaddr);
-	int i = 0;
-	int n = 0;
-    struct pollfd fds[NELEMS(accSockets)] = {0};
-    int accCount = 0;
-
-    for (i = 0; i < NELEMS(accSockets); i++){
-        if (accSockets[i] == -1) {
-            break;
-        }
-        accCount++;
-        fds[i].fd = accSockets[i];
-        fds[i].events = POLLIN;
-    }
-
-    n = poll(fds, accCount, 500);
-    if (n > 0) {
-        for (i = 0; i < accCount; i++) {
-            if (fds[i].revents) {
-                client = ::accept(fds[i].fd, (struct sockaddr *)&sockaddr, &len);
-                if (client < 0) {
-                    throw (SocketException(SocketException::NET_ERR_ACCEPT, errno));
-                }
-                ::setsockopt(client, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
-                setMode(client, true);
-                break;
-            }
-        }
-    }
-
-    return client;
-}
-
-int Socket::send(const char *buf, int len)
-{
-    int n;
-    char *pos = NULL;
-    int left;
-
-    pos = (char *) buf;
-    left = len;
-
-    while (left > 0) {
-        n = ::send(socket, pos, left, 0);
-        if (n < 0) {
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) {
-                continue;
-            } 
-            throw (SocketException(SocketException::NET_ERR_SEND, errno));
-        }
-        pos += n;
-        left -= n;
-    }
-
-    return 0;
-}
-
-int Socket::recv(char *buf, int len)
-{
-    int n;
-    int left;
-    char *pos;
-
-    pos = buf;
-    left    = len;
-
-    while (left > 0) {
-        n = ::recv(socket, pos, left, 0);
-        if (n < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
-                break;
-            }
-            throw (SocketException(SocketException::NET_ERR_RECV, errno));
-        } else if (n == 0) {
-            throw (SocketException(SocketException::NET_ERR_CLOSED));
-        }
-
-        pos += n;
-        left -= n;
-    }
-
-    return (len - left);
-}
-
-void Socket::close(Socket::DIRECTION how)
-{
-    if (socket < 0)
-        return;
-
-    switch (how) {
-        case READ:
-            ::shutdown(socket, SHUT_RD); 
-            break;
-        case WRITE:
-            ::shutdown(socket, SHUT_WR);
-            break;
-        case BOTH:
-            ::shutdown(socket, SHUT_RDWR);
-            ::close(socket);
-        default:
-            break;
-    }
-}
-
-int Socket::getDisableIPv6()
-{
-    return disableIpv6;
-}
-
-void Socket::setDisableIPv6(int flag)
-{
-    disableIpv6 =  flag;
-}
-
-void Socket::setConnTimes(int cnt)
-{
-    connTimes = cnt;
-}
-
-int Socket::numOfListenFds()
-{
-    return numListenfds;
-}
-
-int Socket::getListenSockfds(int *fds)
-{
-    int i = 0;
-    for (i = 0; i < numListenfds; i++) {
-        fds[i] = accSockets[i];
-    }
-    return i;
-}
-
-SocketException::SocketException(int code) throw()
-    : errCode(code), errNum(0)
-{
-}
-
-SocketException::SocketException(int code, int num) throw()
-    : errCode(code), errNum(num)
-{
-}
-
-int SocketException::getErrCode() const throw()
-{
-    return errCode;
-}
-
-int SocketException::getErrNum() const throw()
-{
-    return errNum;
-}
-
-string & SocketException::getErrMsg() throw()
-{
-    switch (errCode) {
-        case NET_ERR_SOCKET:
-            errMsg = "Function ::socket()";
-            break;
-        case NET_ERR_CONNECT:
-            errMsg = "Function ::connect()";
-            break;
-        case NET_ERR_GETADDRINFO:
-            errMsg = "Function ::getaddrinfo()";
-            break;
-        case NET_ERR_SEND:
-            errMsg = "Function ::send()";
-            break;
-        case NET_ERR_RECV:
-            errMsg = "Function ::recv()";
-            break;
-        case NET_ERR_FCNTL:
-            errMsg = "Function ::fcntl()";
-            break;
-        case NET_ERR_CLOSED:
-            errMsg = "Function ::recv() connection was closed by peer";
-            break;
-        case NET_ERR_DATA:
-            errMsg = "Received unexpected data";
-            break;
-        case NET_ERR_BIND:
-            errMsg = "Function ::bind()";
-        default:
-            errMsg = "Unknown error";
-            break;
-    }
-
-    if (errNum != 0) {
-        errMsg += "; system error: ";
-        errMsg += ::strerror(errNum);
-    }
-
-    return errMsg;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/socket.hpp b/tools/sci/org.eclipse.ptp.sci/common/socket.hpp
deleted file mode 100644
index a72ea1f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/socket.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Socket, SocketException
-
- Description: Socket manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _SOCKET_HPP
-#define _SOCKET_HPP
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <string>
-
-using namespace std;
-
-class Socket 
-{
-    public:
-        enum DIRECTION 
-        {
-            READ,
-            WRITE,
-            BOTH
-        };
-        
-    private:
-        int socket;
-        int accSockets[32];
-        int numListenfds;
-        static int disableIpv6;
-        static int connTimes;
-
-    public:
-        Socket(int sockfd = -1);
-        ~Socket();
-
-        int setMode(int sockfd, bool mode); // blocking or non-blocking
-        int setFd(int fd);
-        int getFd() { return socket; }
-        
-        int listen(int &port, char *hname = NULL);
-        int iflisten(int &port, const string &ifname);
-        int connect(const char *hostName, in_port_t port);
-        int accept();
-        int stopAccept();
-        int send(const char *buf, int len);
-        int recv(char *buf, int len);
-        void close(DIRECTION how);
-
-        static int getDisableIPv6();
-        static void setDisableIPv6(int flag);
-        static void setConnTimes(int cnt);
-        int numOfListenFds();
-        int getListenSockfds(int *fds);
-};
-
-class SocketException 
-{
-    public:
-        enum CODE 
-        {
-            NET_ERR_SOCKET = -101,  
-            NET_ERR_CONNECT = -102,    
-            NET_ERR_GETADDRINFO = -103,
-            NET_ERR_SEND = -104,
-            NET_ERR_RECV = -105,
-            NET_ERR_CLOSED = -106,
-            NET_ERR_INTR = -107,
-            NET_ERR_FCNTL = -108,
-            NET_ERR_ACCEPT = -109,
-            NET_ERR_DATA = -110,
-            NET_ERR_BIND = -111
-        };
-        
-    private:
-        int       errCode;
-        int       errNum;
-        string    errMsg;
-
-    public:
-        SocketException(int code) throw();
-        SocketException(int code, int num) throw();
-
-        int getErrCode() const throw();
-        int getErrNum() const throw();
-        string & getErrMsg() throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/sshfunc.cpp b/tools/sci/org.eclipse.ptp.sci/common/sshfunc.cpp
deleted file mode 100644
index c1db386..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/sshfunc.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: SshFunc
-
- Description: ssh functions
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D16661)
-   11/26/10 ronglli      Modified the ssh functions
-
-****************************************************************************/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <dlfcn.h>
-#include <assert.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <arpa/inet.h>
-
-#include "sshfunc.hpp"
-#include "tools.hpp"
-#include "log.hpp"
-
-SshFunc *SshFunc::instance = NULL;
-
-SshFunc * SshFunc::getInstance()
-{
-    if (instance == NULL) {
-        instance = new SshFunc();
-        int rc = instance->load();
-        if (rc != 0) {
-            return NULL;
-        }
-    }
-    return instance;
-}
-
-SshFunc::SshFunc()
-    : sshAuth(false), dlopen_file(NULL), mdlhndl(0), set_auth_module_hndlr(NULL), get_id_token_hndlr(NULL), verify_id_token_hndlr(NULL), get_id_from_token_hndlr(NULL), free_id_token_hndlr(NULL), get_key_from_token_hndlr(NULL), sign_data_hndlr(NULL), verify_data_hndlr(NULL), free_signature_hndlr(NULL) 
-{
-    string out_val = "";
-    char * envp = NULL;
-    int rc;
-
-    user_token.iov_base = NULL;
-    user_token.iov_len = 0;
-
-    rc = SysUtil::read_config("SCI_ENABLE_SSHAUTH", out_val);
-    if(rc == 0) {
-        if (out_val == "yes") {
-            sshAuth = true;
-        } else if (out_val == "no") {
-            sshAuth = false;
-        } else {
-            log_warn("Wrong value of \"SCI_ENABLE_SSHAUTH\": %s\n", out_val.c_str());
-        }
-    }
-
-    envp = ::getenv("SCI_ENABLE_SSHAUTH");
-    if(envp != NULL) {
-        if (strcasecmp(envp, "yes") == 0) {
-            sshAuth = true;
-        } else if (strcasecmp(envp, "no") == 0) {
-            sshAuth = false;
-        }
-    }
-}
-
-SshFunc::~SshFunc()
-{
-    if (dlopen_file) {
-        ::dlclose(dlopen_file);
-    }
-    free_id_token(&user_token);
-}
-
-#ifdef PSEC_OPEN_SSL
-int SshFunc::load(char * libPath)
-{
-    int rc = -1;
-    string path = "";
-    string auth_mod = "";
-
-    if (!sshAuth) 
-        return 0;
-
-    if (libPath) {
-        path = libPath;
-    } else {
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-#ifdef __64BIT__  // 64-bit
-#ifdef INSTALL_PATH
-        path = string(INSTALL_PATH) + "/lib/sci64/libpsec.so"; // default library name on Linux
-        auth_mod = string(INSTALL_PATH) + "/lib/sci64/libpsec_ossh.so";
-#else
-        path = "libpsec.so"; // default library name on Linux
-        auth_mod = "/usr/lib64/libpsec_ossh.so";
-#endif
-#else  // 32-bit
-#ifdef INSTALL_PATH
-        path = string(INSTALL_PATH) + "/lib/sci32/libpsec.so"; // default library name on Linux
-        auth_mod = string(INSTALL_PATH) + "/lib/sci32/libpsec_ossh.so"; 
-#else
-        path = "libpsec.so"; // default library name on Linux
-        auth_mod = "/usr/lib/libpsec_ossh.so";
-#endif
-#endif 
-#else //AIX
-#ifdef __64BIT__
-#ifdef INSTALL_PATH
-        path = string(INSTALL_PATH) + "/lib/libpsec.a(shr_64.o)";
-        auth_mod = string(INSTALL_PATH) + "/lib/libpsec_ossh64.so";
-#else
-        path = "libpsec.a(shr_64.o)";
-        auth_mod = "/usr/lib/libpsec_ossh64.so";
-#endif
-#else  // 32-bit
-#ifdef INSTALL_PATH
-        path = string(INSTALL_PATH) + "/lib/libpsec.a(shr.o)";
-        auth_mod = string(INSTALL_PATH) + "/lib/libpsec_ossh.so";
-#else
-        path = "libpsec.a(shr.o)";
-        auth_mod = "/usr/lib/libpsec_ossh.so";
-#endif 
-#endif
-#endif
-    }
-
-#if defined(_SCI_LINUX)
-    dlopen_file = ::dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL);
-#elif defined(__APPLE__)
-    dlopen_file = ::dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL);
-#else // aix
-    dlopen_file = ::dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL | RTLD_MEMBER);
-#endif
-    if (NULL == dlopen_file) {
-        return -1;
-    }
-
-    set_auth_module_hndlr = (psec_set_auth_module_hndlr *) ::dlsym(dlopen_file, "psec_set_auth_module");
-    if (NULL == set_auth_module_hndlr) {
-        return -1;
-    }
-    get_id_token_hndlr = (psec_get_id_token_hndlr *) ::dlsym(dlopen_file, "psec_get_id_token");
-    if (NULL == get_id_token_hndlr) {
-        return -1;
-    }
-    verify_id_token_hndlr = (psec_verify_id_token_hndlr *) ::dlsym(dlopen_file, "psec_verify_id_token");
-    if (NULL == verify_id_token_hndlr) {
-        return -1;
-    }
-    get_id_from_token_hndlr = (psec_get_id_from_token_hndlr *) ::dlsym(dlopen_file, "psec_get_id_from_token");
-    if (NULL == get_id_from_token_hndlr) {
-        return -1;
-    }
-    free_id_token_hndlr = (psec_free_id_token_hndlr *) ::dlsym(dlopen_file, "psec_free_id_token");
-    if (NULL == free_id_token_hndlr) {
-        return -1;
-    }
-
-    get_key_from_token_hndlr = (psec_get_key_from_token_hndlr *) ::dlsym(dlopen_file, "psec_get_key_from_token");
-    if (NULL == get_key_from_token_hndlr) {
-        return -1;
-    }
-
-    sign_data_hndlr = (psec_sign_data_hndlr *) ::dlsym(dlopen_file, "psec_sign_data");
-    if(NULL == sign_data_hndlr) {
-        return -1;
-    }
-
-    verify_data_hndlr = (psec_verify_data_hndlr *) ::dlsym(dlopen_file, "psec_verify_data");
-    if(NULL == verify_data_hndlr) {
-        return -1;
-    }
-
-    free_signature_hndlr = (psec_free_signature_hndlr *) ::dlsym(dlopen_file, "psec_free_signature");
-    if(NULL == free_signature_hndlr) {
-        return -1;
-    }
-    
-    rc = set_auth_module(NULL, (char *)auth_mod.c_str(), "m[t=-1]");
-    if (rc == 0) {
-        get_id_token(NULL, NULL, &user_token);
-        key_len = sizeof(session_key);
-        get_key_from_token(NULL, &user_token, session_key, &key_len);
-    }
-
-    return rc;
-}
-
-int SshFunc::set_auth_module(char *name, char *fpath, char *opts)
-{
-    if (!sshAuth) 
-        return 0;
-
-    return set_auth_module_hndlr(name, fpath, opts, &mdlhndl);
-}
-
-int SshFunc::get_id_token(char *tname, char *thost, psec_idbuf_t idtok)
-{
-    if (!sshAuth) 
-        return 0;
-
-    return get_id_token_hndlr(mdlhndl, tname, thost, idtok);
-}
-
-int SshFunc::verify_id_token(char *uname, psec_idbuf_t idtok)
-{
-    if (!sshAuth) 
-        return 0;
-
-    return verify_id_token_hndlr(mdlhndl, uname, idtok);
-}
-
-int SshFunc::get_id_from_token(psec_idbuf_t idtok, char *usrid, size_t *usridlen)
-{
-    if (!sshAuth) 
-        return 0;
-
-    return get_id_from_token_hndlr(mdlhndl, idtok, usrid, usridlen);
-}
-
-int SshFunc::free_id_token(psec_idbuf_t id)
-{
-    if (!sshAuth) 
-        return 0;
-
-    return free_id_token_hndlr(mdlhndl, id);
-}
-
-int SshFunc::get_key_from_token(char *uname, psec_idbuf_t idtok , char *key, size_t *keylen) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return get_key_from_token_hndlr(mdlhndl, uname, idtok, key, keylen);
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return sign_data_hndlr(mdlhndl, key, keylen, inbufs, num_bufs, sigbufs);
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return verify_data_hndlr(mdlhndl, key, keylen, inbufs, num_bufs, sigbufs);
-}
-
-int SshFunc::sign_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return sign_data_hndlr(mdlhndl, session_key, key_len, inbufs, num_bufs, sigbufs);
-}
-
-int SshFunc::verify_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return verify_data_hndlr(mdlhndl, session_key, key_len, inbufs, num_bufs, sigbufs);
-}
-
-int SshFunc::free_signature(struct iovec *sigbufs) 
-{
-    if (!sshAuth) 
-        return 0;
-
-    return free_signature_hndlr(mdlhndl, sigbufs);
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    int i, rc;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    for (i = 0; i < num_bufs; i++) {
-        tmp_bufs[i].iov_base = bufs[i];
-        tmp_bufs[i].iov_len = sizes[i];
-    }
-    rc = sign_data(key, keylen, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    int i, rc;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    for (i = 0; i < num_bufs; i++) {
-        tmp_bufs[i].iov_base = bufs[i];
-        tmp_bufs[i].iov_len = sizes[i];
-    }
-    rc = verify_data(key, keylen, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-} 
-
-int SshFunc::sign_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    int i, rc;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    for (i = 0; i < num_bufs; i++) {
-        tmp_bufs[i].iov_base = bufs[i];
-        tmp_bufs[i].iov_len = sizes[i];
-    }
-    rc = sign_data(session_key, key_len, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::verify_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    int i, rc;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    for (i = 0; i < num_bufs; i++) {
-        tmp_bufs[i].iov_base = bufs[i];
-        tmp_bufs[i].iov_len = sizes[i];
-    }
-    rc = verify_data(session_key, key_len, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-} 
-
-int SshFunc::sign_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para, *p, *pos;
-    size_t para_len;
-    int num_bufs = get_sizes(fmt);
-    struct iovec *tmp_bufs;
-    int *d_nums;
-    char *skey = key;
-    size_t sklen = klen;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    d_nums = new int[num_bufs];
-    if (key == NULL) {
-        skey = session_key;
-        sklen = key_len;
-    }
-
-    va_start(argp, fmt);
-    pos = p = fmt;
-    i = -1;
-    while (*p != '\0') {
-        switch (*p) {
-            case 'd':
-                d_nums[i] = va_arg(argp, int);
-                d_nums[i] = htonl(d_nums[i]);
-                tmp_bufs[i].iov_len = sizeof(int);
-                tmp_bufs[i].iov_base = &d_nums[i];
-                break;
-            case 's':
-                tmp_bufs[i].iov_base = va_arg(argp, char *);
-                if (*pos != 's') {
-                    tmp_bufs[i].iov_len = atoi((const char *)pos);
-                } else {
-                    tmp_bufs[i].iov_len = strlen((char *)tmp_bufs[i].iov_base) + 1;
-                }
-                break;
-            case '%':
-                pos = p + 1;
-                i++;
-                break;
-        }
-        p++;
-    }
-    va_end(argp);
-
-    rc = sign_data(skey, key_len, tmp_bufs, num_bufs, sigbufs);
-    delete []d_nums;
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::get_sizes(char *fmt)
-{
-    int num_bufs = 0;
-    char *p = fmt;
-
-    if (!sshAuth) 
-        return 0;
-
-    while (*p != '\0') {
-        if (*p == '%') {
-            num_bufs++;
-        }
-        p++;
-    }
-
-    return num_bufs;
-}
-
-int SshFunc::verify_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para, *p, *pos;
-    size_t para_len;
-    int num_bufs = get_sizes(fmt);
-    struct iovec *tmp_bufs;
-    int *d_nums;
-    char *skey = key;
-    size_t sklen = klen;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    d_nums = new int[num_bufs];
-    if (key == NULL) {
-        skey = session_key;
-        sklen = key_len;
-    }
-    va_start(argp, fmt);
-    pos = p = fmt;
-    i = -1;
-    while (*p != '\0') {
-        switch (*p) {
-            case 'd':
-                d_nums[i] = va_arg(argp, int);
-                d_nums[i] = ntohl(d_nums[i]);
-                tmp_bufs[i].iov_len = sizeof(int);
-                tmp_bufs[i].iov_base = &d_nums[i];
-                break;
-            case 's':
-                tmp_bufs[i].iov_base = va_arg(argp, char *);
-                if (*pos != 's') {
-                    tmp_bufs[i].iov_len = atoi((const char *)pos);
-                } else {
-                    tmp_bufs[i].iov_len = strlen((char *)tmp_bufs[i].iov_base) + 1;
-                }
-                break;
-            case '%':
-                pos = p + 1;
-                i++;
-                break;
-        }
-        p++;
-    }
-    va_end(argp);
-
-    rc = verify_data(skey, sklen, tmp_bufs, num_bufs, sigbufs);
-    delete []d_nums;
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::sign_data(struct iovec *sigbufs, int num_bufs, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para;
-    size_t para_len;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    va_start(argp, num_bufs);
-    for (i = 0; i < num_bufs; i++) {
-        para = va_arg(argp, char *);
-        para_len = va_arg(argp, int);
-        tmp_bufs[i].iov_base = para;
-        tmp_bufs[i].iov_len = para_len;
-    }
-    va_end(argp); 
-    rc = sign_data(session_key, key_len, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::verify_data(struct iovec *sigbufs, int num_bufs, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para;
-    size_t para_len;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    va_start(argp, num_bufs);
-    for (i = 0; i < num_bufs; i++) {
-        para = va_arg(argp, char *);
-        para_len = va_arg(argp, int);
-        tmp_bufs[i].iov_base = para;
-        tmp_bufs[i].iov_len = para_len;
-    }
-    va_end(argp); 
-    rc = verify_data(session_key, key_len, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para;
-    size_t para_len;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    va_start(argp, num_bufs);
-    for (i = 0; i < num_bufs; i++) {
-        para = va_arg(argp, char *);
-        para_len = va_arg(argp, int);
-        tmp_bufs[i].iov_base = para;
-        tmp_bufs[i].iov_len = para_len;
-    }
-    va_end(argp); 
-    rc = sign_data(key, keylen, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...)
-{
-    int i, rc;
-    va_list argp;
-    char *para;
-    size_t para_len;
-    struct iovec *tmp_bufs;
-
-    if (!sshAuth) 
-        return 0;
-
-    tmp_bufs = new struct iovec[num_bufs];
-    va_start(argp, num_bufs);
-    for (i = 0; i < num_bufs; i++) {
-        para = va_arg(argp, char *);
-        para_len = va_arg(argp, int);
-        tmp_bufs[i].iov_base = para;
-        tmp_bufs[i].iov_len = para_len;
-    }
-    va_end(argp); 
-    rc = verify_data(key, keylen, tmp_bufs, num_bufs, sigbufs);
-    delete []tmp_bufs;
-
-    return rc;
-}
-
-int SshFunc::set_user_token(struct iovec *token)
-{
-    if (!sshAuth) 
-        return 0;
-
-    free_id_token(&user_token);
-    user_token.iov_len = token->iov_len;
-    user_token.iov_base = new char [token->iov_len];
-    memcpy(user_token.iov_base, token->iov_base, token->iov_len);
-    get_key_from_token(NULL, &user_token, session_key, &key_len);
-
-    return 0;
-}
-
-int SshFunc::set_session_key(struct iovec *sskey)
-{
-    if (!sshAuth) 
-        return 0;
-
-    key_len = sskey->iov_len;
-    memcpy(session_key, sskey->iov_base, key_len);
-
-    return 0;
-}
-#else 
-int SshFunc::load(char *libPath)
-{
-    return 0;
-}
-
-int SshFunc::get_id_token(char *tname, char *thost, psec_idbuf_t idtok)
-{
-    return 0;
-}
-
-int SshFunc::verify_id_token(char *uname, psec_idbuf_t idtok)
-{
-    return 0;
-}
-
-int SshFunc::get_id_from_token(psec_idbuf_t idtok, char *usrid, size_t *usridlen)
-{
-    return 0;
-}
-
-int SshFunc::free_id_token(psec_idbuf_t id)
-{
-    return 0;
-}
-
-int SshFunc::get_key_from_token(char *uname, psec_idbuf_t idtok , char *key, size_t *keylen)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::free_signature(struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::set_session_key(struct iovec *sskey)
-{
-    return 0;
-}
-
-int SshFunc::set_user_token(struct iovec *token)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(struct iovec *sigbufs, int num_bufs, ...)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(struct iovec *sigbufs, int num_bufs, ...)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...)
-{
-    return 0;
-}
-
-int SshFunc::sign_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...)
-{
-    return 0;
-}
-
-int SshFunc::verify_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...)
-{
-    return 0;
-}
-
-#endif
diff --git a/tools/sci/org.eclipse.ptp.sci/common/sshfunc.hpp b/tools/sci/org.eclipse.ptp.sci/common/sshfunc.hpp
deleted file mode 100644
index 12ee311..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/sshfunc.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: SshFunc
-
- Description: ssh functions
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D16661)
-
-****************************************************************************/
-#ifndef _SSHFUNC_H_
-#define _SSHFUNC_H_
-
-#include <stdlib.h>
-
-#include "psec.h"
-
-class SshFunc
-{
-    public:
-        typedef int (psec_set_auth_module_hndlr)(char *, char *, char *, unsigned int *);  
-        typedef int (psec_get_id_token_hndlr)(unsigned int, char *, char *, psec_idbuf_t); 
-        typedef int (psec_verify_id_token_hndlr)(unsigned int, char *, psec_idbuf_t);    
-        typedef int (psec_get_id_from_token_hndlr)(unsigned int, psec_idbuf_t, char *, size_t *);           
-        typedef int (psec_free_id_token_hndlr)(unsigned int, psec_idbuf_t); 
-        typedef int (psec_get_key_from_token_hndlr)(unsigned int, char *, psec_idbuf_t,	char *,	size_t *);
-        typedef int (psec_sign_data_hndlr)(unsigned int, char *, size_t, struct iovec *, int, struct iovec *);
-        typedef int (psec_verify_data_hndlr)(unsigned int, char *, size_t, struct iovec *, int, struct iovec *);
-        typedef int (psec_free_signature_hndlr)(unsigned int, struct iovec *);
-
-    private:
-        void *dlopen_file;
-        unsigned int mdlhndl;
-        char session_key[64];
-        size_t key_len;
-        struct iovec user_token;
-        
-        psec_set_auth_module_hndlr *set_auth_module_hndlr;
-        psec_get_id_token_hndlr *get_id_token_hndlr;
-        psec_verify_id_token_hndlr *verify_id_token_hndlr;
-        psec_get_id_from_token_hndlr *get_id_from_token_hndlr;
-        psec_free_id_token_hndlr *free_id_token_hndlr;
-        psec_get_key_from_token_hndlr *get_key_from_token_hndlr;
-        psec_sign_data_hndlr *sign_data_hndlr;
-        psec_verify_data_hndlr *verify_data_hndlr;
-        psec_free_signature_hndlr * free_signature_hndlr;
-
-    private:
-        SshFunc();
-        static SshFunc *instance;
-        int set_auth_module(char *name, char *fpath, char *opts);
-        int get_sizes(char *fmt);
-        bool sshAuth;
-        
-    public:
-        ~SshFunc();
-        static SshFunc *getInstance();
-        int load(char *libPath = NULL);
-
-        char *get_session_key() { return session_key; }
-        size_t get_key_len() {return key_len; }
-        int get_id_token(char *tname, char *thost, psec_idbuf_t idtok);
-        int verify_id_token(char *uname, psec_idbuf_t idtok);
-        int get_id_from_token(psec_idbuf_t idtok, char *usrid, size_t *usridlen);
-        int free_id_token(psec_idbuf_t id);
-        int get_key_from_token(char *uname, psec_idbuf_t idtok , char *key, size_t *keylen);
-        int sign_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs);
-        int verify_data(char *key, size_t keylen, struct iovec *inbufs, int num_bufs, struct iovec *sigbufs);
-        int free_signature(struct iovec *sigbufs);
-
-        int sign_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs);
-        int verify_data(char *key, size_t keylen, char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs);
-
-        struct iovec & get_token() { return user_token; }
-        int set_session_key(struct iovec *sskey);
-        int set_user_token(struct iovec *token);
-        int sign_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs);
-        int verify_data(struct iovec *inbufs, int num_bufs, struct iovec *sigbufs);
-        int sign_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs);
-        int verify_data(char *bufs[], int sizes[], int num_bufs, struct iovec *sigbufs);
-        int sign_data(struct iovec *sigbufs, int num_bufs, ...);
-        int verify_data(struct iovec *sigbufs, int num_bufs, ...);
-        int sign_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...);
-        int verify_data(char *key, size_t keylen, struct iovec *sigbufs, int num_bufs, ...);
-        int sign_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...);
-        int verify_data(char *key, size_t klen, struct iovec *sigbufs, char *fmt, ...);
-};
-
-#define SSHFUNC SshFunc::getInstance()
-#define psec_sign_data(sigbufs, ...)        SSHFUNC->sign_data(SSHFUNC->get_session_key(), SSHFUNC->get_key_len(), sigbufs, __VA_ARGS__)
-#define psec_verify_data(sigbufs, ...)      SSHFUNC->verify_data(SSHFUNC->get_session_key(), SSHFUNC->get_key_len(), sigbufs, __VA_ARGS__)
-#define psec_free_signature(sign)           SSHFUNC->free_signature(sign)
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/stream.cpp b/tools/sci/org.eclipse.ptp.sci/common/stream.cpp
deleted file mode 100644
index a63b242..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/stream.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Stream
-
- Description: Data stream processing.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "stream.hpp"
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-
-#include "socket.hpp"
-
-const int  BUFFER_SIZE = 16384;
-const int MAX_NETWORK_SIZE = 1024 * 1024 * 8; // Max length = 8M
-const char END_OF_LINE = '\n';
-
-void endl() {}
-
-Stream::Stream()
-    : socket(NULL)
-{
-    buffer = new char[BUFFER_SIZE];
-    cursor = buffer;
-    *cursor = '\0';
-
-    readActive = false;
-    writeActive = false;
-}
-
-Stream::~Stream()
-{
-    if (socket != NULL)
-        delete socket;
-    delete [] buffer;
-}
-
-int Stream::init(const char *nodeAddr, in_port_t port)
-{
-    if (socket != NULL) {
-        socket->close(Socket::BOTH);
-    } else {
-        socket = new Socket();
-    }
-   
-    if ((nodeAddr == NULL) || (port <= 0)) 
-        return -1;
-
-    socket->connect(nodeAddr, port);
-
-    readActive = true;
-    writeActive = true;
-    
-    return 0;
-}
-
-int Stream::init(int sockfd)
-{
-    if (socket != NULL) {
-        socket->close(Socket::BOTH);
-    } else {
-        socket = new Socket();
-    }
-    socket->setFd(sockfd);
-
-    readActive = true;
-    writeActive = true;
-    
-    return 0;
-}
-
-void Stream::read(char *buf, int size)
-{
-    int n = 0;
-    int count = size;
-    char *p = buf;
-    
-    while (n < size) {
-        count = size - n;
-        n += socket->recv(p, count);
-        p = buf + n;
-    }
-}
-
-void Stream::write(const char *buf, int size)
-{
-    int len = size; // including '\0' at the end
-    int count = len;
-    char *p = (char *) buf;
-
-    while (len > 0) {
-        checkBuffer(len);
-        count = (len - BUFFER_SIZE) > 0 ? BUFFER_SIZE : len;
-        memcpy(cursor, p, count);
-        cursor += count;
-        p += count;
-        len -= count;
-    }
-}
-
-void Stream::stop()
-{
-    stopRead();
-    stopWrite();
-}
-
-void Stream::stopRead()
-{
-    if (readActive) {
-        readActive = false;
-        socket->close(Socket::READ);
-    }
-}
-
-void Stream::stopWrite()
-{
-    if (writeActive) {
-        writeActive = false;
-        socket->close(Socket::WRITE);
-    }
-}
-
-bool Stream::isReadActive()
-{
-    return readActive;
-}
-
-bool Stream::isWriteActive()
-{
-    return writeActive;
-}
-
-Stream & Stream::flush()
-{
-    try {
-        socket->send(buffer, cursor - buffer);
-    } catch (SocketException &e) {
-        cursor = buffer;;
-        throw;
-    } catch (...) {
-        cursor = buffer;
-        throw;
-    }
-    cursor = buffer;
-
-    return *this;
-}
-
-Stream & Stream::operator >> (char &value) 
-{
-    read(&value, sizeof(value));
-
-    return *this;
-}
-
-Stream & Stream::operator >> (bool &value) 
-{
-    read((char *)&value, sizeof(value));
-
-    return *this;
-}
-
-Stream & Stream::operator >> (int &value)
-{
-    read((char *)&value, sizeof(value));
-    value = ntohl(value);
-    
-    return *this;
-}
-
-Stream & Stream::operator >> (long &value)
-{
-    int low = 0;
-    int high = 0;
-    int nbyte;
-
-    *this >> nbyte;
-    *this >> low;
-    nbyte -= sizeof(int);
-    if (nbyte != 0) {
-        *this >> high;
-    }
-    value = high << sizeof(int) | low;
-    
-    return *this;
-}
-
-Stream & Stream::operator >> (char *value)
-{
-    int len;
-    *this >> len;
-    read(value, len);
-    
-    return *this;
-}
-
-Stream & Stream::operator >> (string &value)
-{
-    int len;
-    char *buf = NULL;
-    *this >> len;
-    
-    if ((len < 0) || (len > MAX_NETWORK_SIZE))
-        throw SocketException(SocketException::NET_ERR_DATA);
-
-    buf = new char[len];
-    read(buf, len);
-    value = buf;
-    delete [] buf;
-   
-    return *this;
-}
-
-Stream & Stream::operator >> (struct iovec &value)
-{
-    *this >> (long &)value.iov_len;
-    if (value.iov_len > (int)MAX_NETWORK_SIZE)
-        throw SocketException(SocketException::NET_ERR_DATA);
-
-    if (value.iov_len > 0) {
-        value.iov_base = new char[value.iov_len]; // must free it outside
-        read((char *)value.iov_base, value.iov_len);
-    }
-
-    return *this;
-}
-
-Stream & Stream::operator >> (EndOfLine)
-{
-    char value;
-    *this >> value;
-    if (value != END_OF_LINE)
-        throw SocketException(SocketException::NET_ERR_DATA);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (char value)
-{
-    checkBuffer(sizeof(value));
-    *cursor = value;
-    cursor += sizeof(value);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (bool value)
-{
-    checkBuffer(sizeof(value));
-    *(bool *)cursor = value;
-    cursor += sizeof(value);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (int value)
-{
-    int tmp = htonl(value);
-    checkBuffer(sizeof(value));
-    memcpy(cursor, &tmp, sizeof(tmp));
-    cursor += sizeof(value);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (long value)
-{
-    *this << (int)sizeof(value);
-    if (sizeof(long) > sizeof(int)) {
-        int low = value << sizeof(int) >> sizeof(int);
-        int high = value >> sizeof(int);
-        *this << low << high;
-    } else {
-        *this << (int)value;
-    }
-   
-    return *this;
-}
-
-Stream & Stream::operator << (const char *value)
-{
-    int len = ::strlen(value) + 1; // including '\0' at the end
-    *this << len;
-
-    int count = len;
-    char *p = (char *)value;
-    while (len > 0) {
-        checkBuffer(len);
-        count = (len - BUFFER_SIZE) > 0 ? BUFFER_SIZE : len;
-        ::memcpy(cursor, p, count);
-        cursor += count;
-        p += count;
-        len -= count;
-    }
-    
-    return *this;
-}
-
-Stream & Stream::operator << (const string &value)
-{
-    *this << value.c_str();
-
-    return *this;
-}
-
-Stream & Stream::operator << (struct iovec &value)
-{
-    long len = (long)value.iov_len;
-    int count = len;
-    char *p = (char *)value.iov_base;
-
-    *this << len;
-    while (len > 0) {
-        checkBuffer(len);
-        count = (len - BUFFER_SIZE) > 0 ? BUFFER_SIZE : len;
-        ::memcpy(cursor, p, count);
-        cursor += count;
-        p += count;
-        len -= count;
-    }
-
-    return *this;
-}
-
-Stream & Stream::operator << (EndOfLine)
-{
-    *this << END_OF_LINE;
-
-    return flush();
-}
-
-void Stream::checkBuffer(int size)
-{
-    if ((cursor - buffer + size) >= BUFFER_SIZE)
-        flush();
-}
-
-int Stream::getSocket() 
-{
-   if (socket != NULL) {
-       return socket->getFd(); 
-   } else {
-       return -1;
-   }
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/common/stream.hpp b/tools/sci/org.eclipse.ptp.sci/common/stream.hpp
deleted file mode 100644
index 09f64bf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/stream.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Stream
-
- Description: Data stream processing.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _STREAM_HPP
-#define _STREAM_HPP
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <sys/uio.h>
-#include <string>
-
-#include "socket.hpp"
-
-
-using namespace std;
-
-typedef void (EndOfLine)();
-void endl();
-
-class Stream 
-{
-    private:
-        Socket       *socket;
-        char         *buffer;
-        char         *cursor;
-
-        bool         readActive;
-        bool         writeActive;
-
-    public:
-        Stream();
-        ~Stream();
-
-        int init(const char *nodeAddr, in_port_t port);
-        int init(int sockfd);
-        int getSocket(); 
-
-        void read(char *buf, int size);
-        void write(const char *buf, int size);
-        void stop();
-        void stopRead();
-        void stopWrite();
-        bool isReadActive();
-        bool isWriteActive();
-        Stream & flush();
-
-        Stream & operator >> (char &value);
-        Stream & operator >> (bool &value);
-        Stream & operator >> (int &value);
-        Stream & operator >> (long &value);
-        Stream & operator >> (char *value);
-        Stream & operator >> (string &value);
-        Stream & operator >> (struct iovec &value);
-        Stream & operator >> (EndOfLine);
-        
-        Stream & operator << (char value);
-        Stream & operator << (bool value);
-        Stream & operator << (int value);
-        Stream & operator << (long value);
-        Stream & operator << (const char *value);
-        Stream & operator << (const string &value);
-        Stream & operator << (struct iovec &value);
-        Stream & operator << (EndOfLine);
-
-    private:
-        void checkBuffer(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/thread.cpp b/tools/sci/org.eclipse.ptp.sci/common/thread.cpp
deleted file mode 100644
index 3322306..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/thread.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Thread, ThreadException
-
- Description: Thread manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include <assert.h>
-#include <string.h>
-#include <signal.h>
-
-#include "thread.hpp"
-
-using namespace std;
-
-pthread_key_t Thread::key = 0;
-pthread_once_t Thread::once = PTHREAD_ONCE_INIT;
-
-void makeKey()
-{
-    pthread_key_create(&(Thread::key), NULL);
-}
-
-void* init(void * pthis)
-{
-    Thread *p = (Thread *) pthis;
-    void *data = p->getSpecific();
-    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
-    int rc = pthread_once(&(Thread::once), makeKey);
-    if (data != NULL) {
-        rc = pthread_setspecific(Thread::key, data);
-    }
-    p->setState(true);
-    p->run();
-
-    return 0;
-}
-
-Thread::Thread(int hndl)
-    : handle(hndl), launched(false), running(false), data(NULL)
-{
-}
-
-Thread::~Thread() 
-{
-}
-
-void Thread::start()
-{
-    if (!launched) {
-        sigset_t sigs_to_block;
-        sigset_t old_sigs;
-        sigfillset(&sigs_to_block);
-        pthread_sigmask(SIG_SETMASK, &sigs_to_block, &old_sigs);
-        
-        if (pthread_create(&(thread), NULL, init, this) != 0) {
-            running = false;
-            pthread_sigmask(SIG_SETMASK, &old_sigs, NULL);
-            throw ThreadException(ThreadException::ERR_CREATE);
-        }
-        pthread_sigmask(SIG_SETMASK, &old_sigs, NULL);
-    } else {
-        throw ThreadException(ThreadException::ERR_LAUNCH);
-    }
-}
-
-void Thread::join()
-{
-    if (!launched)
-        return;
-    
-    pthread_join(thread, NULL);
-    running = false;
-}
-
-void Thread::detach()
-{
-    if (launched) {
-        pthread_detach(thread);
-    } else {
-        throw ThreadException(ThreadException::ERR_DETACH);
-    }
-}
-
-void Thread::cancel()
-{
-    pthread_cancel(thread);
-}
-
-void Thread::setSpecific(void *dat)
-{
-    data = dat;
-}
-
-void * Thread::getSpecific()
-{
-    return data;
-}
-
-ThreadException::ThreadException(int code) throw()
-    : errCode(code)
-{
-}
-
-int ThreadException::getErrCode() const throw()
-{
-    return errCode;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/thread.hpp b/tools/sci/org.eclipse.ptp.sci/common/thread.hpp
deleted file mode 100644
index e161042..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/thread.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Thread, ThreadException
-
- Description: Thread manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _THREAD_HPP
-#define _THREAD_HPP
-
-#include <pthread.h>
-
-#include <string>
-#include <vector>
-
-using namespace std;
-
-class Thread 
-{
-    private:
-
-    protected:
-        int          handle;
-        bool         launched;
-        bool         running;
-        pthread_t    thread;
-        void        *data;
-
-    public:
-        static pthread_key_t key;
-        static pthread_once_t once;
-        Thread(int hndl = 0);
-        virtual ~Thread();
-
-        void start();
-        void join();
-        void detach();
-        void cancel();
-        virtual void run() = 0;
-        
-        bool isLaunched() { return launched; }
-        bool getState() { return running; }
-        void setState(bool state) { running = state; launched = true; }
-        void setSpecific(void *data);
-        void *getSpecific();
-};
-
-class ThreadException
-{
-    public:
-        enum CODE
-        {
-            ERR_CREATE,
-            ERR_LAUNCH,
-            ERR_END,
-            ERR_PRIO,
-            ERR_LOCK,
-            ERR_UNLOCK,
-            ERR_SLEEP,
-            ERR_DETACH
-        };
-        
-    private:
-        int         errCode;
-
-    public:
-        ThreadException(int code) throw();
-
-        int getErrCode() const throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/tools.cpp b/tools/sci/org.eclipse.ptp.sci/common/tools.cpp
deleted file mode 100644
index c1c5166..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/tools.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Tool functions.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-   11/26/10 ronglli      To add config file reading functions
-
-****************************************************************************/
-
-#include "tools.hpp"
-#include <ctype.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netdb.h>                                                              
-#include <netinet/in.h>                                                         
-#include <sys/socket.h>   
-#include <string.h>
-#include <sys/param.h>
-#include <sys/time.h> 
-#include <dlfcn.h>
-
-#include <fstream>
-#include "exception.hpp"
-#include "log.hpp"
-
-string SysUtil::itoa(int value)
-{
-    static char buffer[32];
-    sprintf(buffer, "%d", value);
-    return string(buffer);
-}
-
-string SysUtil::lltoa(long long value)
-{
-    static char buffer[128];
-    sprintf(buffer, "%lld", value);
-    return string(buffer);
-}
-
-double SysUtil::microseconds()
-{
-    struct timeval time_v;
-    ::gettimeofday(&time_v, NULL);
-    return time_v.tv_sec * 1e6 + time_v.tv_usec;
-}
-
-void SysUtil::sleep(int usecs)
-{
-    struct timespec req;
-    req.tv_sec = usecs / 1000000;
-    req.tv_nsec = (usecs % 1000000) * 1000;
-    ::nanosleep (&req, NULL);
-}
-
-string SysUtil::get_hostname(const char * name)
-{
-    string uniquestring;
-    
-    struct addrinfo hints, *host = NULL;
-    memset(&hints, 0, sizeof(struct addrinfo));
-    hints.ai_flags = AI_CANONNAME | AI_NUMERICHOST;
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    int rc = ::getaddrinfo(name, NULL, &hints, &host);
-    if (rc == EAI_NONAME) {
-        hints.ai_flags = AI_CANONNAME;
-        rc = ::getaddrinfo(name, NULL, &hints, &host);
-    }
-    if (rc < 0)
-        throw Exception(Exception::GET_ADDR_INFO);
-    uniquestring = host->ai_canonname;
-    ::freeaddrinfo(host);
-
-    return uniquestring;
-}
-
-char* SysUtil::get_path_name(const char *program)
-{
-    static char path[MAXPATHLEN];
-    sprintf(path, "which %s", program);
-    FILE *fp = popen(path, "r");
-    if (!fp)
-        return NULL;
-    path[0] = '\0';
-    fscanf(fp, "%s", path);
-    pclose(fp);
-    if (!path[0]){
-        return NULL;
-    }
-    if (path[0] == '.' && path[1] == '/') {
-        char save_path[MAXPATHLEN];
-        strcpy(save_path, path);
-        strcpy(path, getenv("PWD"));
-        strcat(path, save_path + 1);
-    }
-    return path;
-}
-
-int SysUtil::read_config(const char* var, string & out_val)
-{
-#define FILE_PATH "/etc/sci.conf"
-#define VAR_PATTERN "^([^= ][^= ]*=[^= ][^= ]*)$"
-    int rc = -1;
-    ifstream fs;
-
-    string line;
-    size_t pos = 0;
-    string word;
-    bool found = false;
-    string::iterator it;
-
-    if (var == NULL) {
-        return -1;
-    }
-
-    fs.open(FILE_PATH);
-    if (!fs) {
-        return -1;
-    }
-
-    while(fs) {
-        size_t tmpp = 0;
-        getline(fs,line);
-        for (it = line.begin(); it != line.end(); ){
-            if ((*it == ' ') || *it == '\t')
-                it = line.erase(it);
-            else
-                it++;
-        }
-        if (line.length() == 0){
-            continue;
-        } else if (line[0] == '#') {
-            continue;         //The comments line will start with '#'
-        }
-
-        tmpp = line.find_first_of('#',0);
-        pos = line.find_first_of('=',0);
-        if ((pos == 0) || (pos == string::npos) || (pos >= tmpp)) { //Skip unused lines
-            continue;
-        }
-
-        word = line.substr(0, pos);
-        if (word.compare(var) == 0) {
-            pos += 1;
-            out_val = line.substr(pos, tmpp-pos); //The contents after '#' is regarded as comments
-            found = true;
-            break;
-        } else {
-            continue;
-        }
-    }
-
-    fs.close();
-
-    return (found ? 0 : -1);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/tools.hpp b/tools/sci/org.eclipse.ptp.sci/common/tools.hpp
deleted file mode 100644
index 0c9be3c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/tools.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Tool functions.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-   11/26/10 ronglli      To add config file reading functions
-
-****************************************************************************/
-
-#ifndef _TOOLS_HPP
-#define _TOOLS_HPP
-
-#include <string>
-#include <vector>
-
-using namespace std;
-
-class SysUtil 
-{       
-    public:
-        static string itoa(int value);
-        static string lltoa(long long value);
-        static double microseconds();
-        static void sleep(int usecs);
-
-        static string get_hostname(const char *name);
-        static char * get_path_name(const char *program);
-        static int read_config(const char* var, string & out_val);
-};
-
-#define NELEMS(array) (sizeof(array) / sizeof(array[0]))
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/compile b/tools/sci/org.eclipse.ptp.sci/compile
deleted file mode 100755
index 1b1d232..0000000
--- a/tools/sci/org.eclipse.ptp.sci/compile
+++ /dev/null
@@ -1,142 +0,0 @@
-#! /bin/sh
-# Wrapper for compilers which do not understand `-c -o'.
-
-scriptversion=2005-05-14.22
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
-# Written by Tom Tromey <tromey@cygnus.com>.
-#
-# 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, 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.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: compile [--help] [--version] PROGRAM [ARGS]
-
-Wrapper for compilers which do not understand `-c -o'.
-Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
-arguments, and rename the output as expected.
-
-If you are trying to build a whole package this is not the
-right script to run: please start by reading the file `INSTALL'.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "compile $scriptversion"
-    exit $?
-    ;;
-esac
-
-ofile=
-cfile=
-eat=
-
-for arg
-do
-  if test -n "$eat"; then
-    eat=
-  else
-    case $1 in
-      -o)
-	# configure might choose to run compile as `compile cc -o foo foo.c'.
-	# So we strip `-o arg' only if arg is an object.
-	eat=1
-	case $2 in
-	  *.o | *.obj)
-	    ofile=$2
-	    ;;
-	  *)
-	    set x "$@" -o "$2"
-	    shift
-	    ;;
-	esac
-	;;
-      *.c)
-	cfile=$1
-	set x "$@" "$1"
-	shift
-	;;
-      *)
-	set x "$@" "$1"
-	shift
-	;;
-    esac
-  fi
-  shift
-done
-
-if test -z "$ofile" || test -z "$cfile"; then
-  # If no `-o' option was seen then we might have been invoked from a
-  # pattern rule where we don't need one.  That is ok -- this is a
-  # normal compilation that the losing compiler can handle.  If no
-  # `.c' file was seen then we are probably linking.  That is also
-  # ok.
-  exec "$@"
-fi
-
-# Name of file we expect compiler to create.
-cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
-
-# Create the lock directory.
-# Note: use `[/.-]' here to ensure that we don't use the same name
-# that we are using for the .o file.  Also, base the name on the expected
-# object file name, since that is what matters with a parallel build.
-lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
-while true; do
-  if mkdir "$lockdir" >/dev/null 2>&1; then
-    break
-  fi
-  sleep 1
-done
-# FIXME: race condition here if user kills between mkdir and trap.
-trap "rmdir '$lockdir'; exit 1" 1 2 15
-
-# Run the compile.
-"$@"
-ret=$?
-
-if test -f "$cofile"; then
-  mv "$cofile" "$ofile"
-elif test -f "${cofile}bj"; then
-  mv "${cofile}bj" "$ofile"
-fi
-
-rmdir "$lockdir"
-exit $ret
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/tools/sci/org.eclipse.ptp.sci/config.guess b/tools/sci/org.eclipse.ptp.sci/config.guess
deleted file mode 100755
index b79252d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/config.guess
+++ /dev/null
@@ -1,1558 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
-
-timestamp='2013-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 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 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.  This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-#
-# Originally written by Per Bothner.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-#
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
-
-
-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 1992-2013 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
-
-case "${UNAME_SYSTEM}" in
-Linux|GNU|GNU/*)
-	# If the system lacks a compiler, then just pick glibc.
-	# We could probably try harder.
-	LIBC=gnu
-
-	eval $set_cc_for_build
-	cat <<-EOF > $dummy.c
-	#include <features.h>
-	#if defined(__UCLIBC__)
-	LIBC=uclibc
-	#elif defined(__dietlibc__)
-	LIBC=dietlibc
-	#else
-	LIBC=gnu
-	#endif
-	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	;;
-esac
-
-# 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 tuples: *-*-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 ;;
-    *:Bitrig:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_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'`
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
-    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:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	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:*:[4567])
-	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:*:*)
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case ${UNAME_PROCESSOR} in
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW64*:*)
-	echo ${UNAME_MACHINE}-pc-mingw64
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS*:*)
-	echo ${UNAME_MACHINE}-pc-msys
-	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		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-${LIBC}`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/[-(].*//'`-${LIBC}
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    aarch64_be:Linux:*:*)
-	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	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="gnulibc1" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    arc:Linux:*:* | arceb:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	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-${LIBC}
-	else
-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-		| grep -q __ARM_PCS_VFP
-	    then
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
-	    else
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
-	    fi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    cris:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
-    crisv32:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
-    frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    i*86:Linux:*:*)
-	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	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 | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
-	;;
-    or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    or32:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-${LIBC}
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-${LIBC}
-	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-${LIBC} ;;
-	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
-	  *)    echo hppa-unknown-linux-${LIBC} ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-${LIBC}
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-${LIBC}
-	exit ;;
-    ppc64le:Linux:*:*)
-	echo powerpc64le-unknown-linux-${LIBC}
-	exit ;;
-    ppcle:Linux:*:*)
-	echo powerpcle-unknown-linux-${LIBC}
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
-	exit ;;
-    sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
-	exit ;;
-    x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	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 ;;
-    x86_64:Haiku:*:*)
-	echo x86_64-unknown-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
-	eval $set_cc_for_build
-	if test "$UNAME_PROCESSOR" = unknown ; then
-	    UNAME_PROCESSOR=powerpc
-	fi
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
-	    fi
-	fi
-	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 ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk${UNAME_RELEASE}
-	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 ;;
-    x86_64:VMkernel:*:*)
-	echo ${UNAME_MACHINE}-unknown-esx
-	exit ;;
-esac
-
-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/tools/sci/org.eclipse.ptp.sci/config.h.in b/tools/sci/org.eclipse.ptp.sci/config.h.in
deleted file mode 100644
index eb6452d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/config.h.in
+++ /dev/null
@@ -1,95 +0,0 @@
-/* config.h.in.  Generated from configure.in by autoheader.  */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <openssl/aes.h> header file. */
-#undef HAVE_OPENSSL_AES_H
-
-/* Define to 1 if you have the <openssl/bio.h> header file. */
-#undef HAVE_OPENSSL_BIO_H
-
-/* Define to 1 if you have the <openssl/md5.h> header file. */
-#undef HAVE_OPENSSL_MD5_H
-
-/* Define to 1 if you have the <openssl/pem.h> header file. */
-#undef HAVE_OPENSSL_PEM_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_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 <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_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 if x86" */
-#undef INTEL_ARCH
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
-/* 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 version of this package. */
-#undef PACKAGE_VERSION
-
-/* "define if ppc" */
-#undef POWER_ARCH
-
-/* "define if enable openssl support" */
-#undef PSEC_OPEN_SSL
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-/* "define if linux" */
-#undef _AIX
-
-/* "define if linux" */
-#undef _LINUX
-
-/* "for debugging" */
-#undef _SCI_DEBUG
-
-/* "define if linux" */
-#undef _SCI_LINUX
diff --git a/tools/sci/org.eclipse.ptp.sci/config.sub b/tools/sci/org.eclipse.ptp.sci/config.sub
deleted file mode 100755
index 8b612ab..0000000
--- a/tools/sci/org.eclipse.ptp.sci/config.sub
+++ /dev/null
@@ -1,1788 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
-
-timestamp='2013-04-24'
-
-# 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 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 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.  This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-
-
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
-#
-# 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.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# 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 1992-2013 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-android* | linux-dietlibc | linux-newlib* | \
-  linux-musl* | 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/'`
-    ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
-  *)
-    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 | -microblaze*)
-		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*178)
-		os=-lynxos178
-		;;
-	-lynx*5)
-		os=-lynxos5
-		;;
-	-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 \
-	| aarch64 | aarch64_be \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arceb \
-	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
-	| avr | avr32 \
-	| be32 | be64 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| hexagon \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | microblazeel | 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 \
-	| mipsr5900 | mipsr5900el \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 | nios2eb | nios2el \
-	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| rl78 | rx \
-	| 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 \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-	xgate)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-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-* \
-	| aarch64-* | aarch64_be-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| 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-* \
-	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
-	| microblaze-* | microblazeel-* \
-	| 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-* \
-	| mipsr5900-* | mipsr5900el-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* | nios2eb-* | nios2el-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| rl78-* | romp-* | rs6000-* | rx-* \
-	| 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-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| 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
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	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 | 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*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
-		;;
-	microblaze*)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw64)
-		basic_machine=x86_64-pc
-		os=-mingw64
-		;;
-	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-/'`
-		;;
-	msys)
-		basic_machine=i386-pc
-		os=-msys
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
-	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
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	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 | ppcbe)	basic_machine=powerpc-unknown
-		;;
-	ppc-* | ppcbe-*)
-		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 | rdos64)
-		basic_machine=x86_64-pc
-		os=-rdos
-		;;
-	rdos32)
-		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
-		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	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
-		;;
-	tile*)
-		basic_machine=$basic_machine-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
-		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
-	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.
-	-auroraux)
-		os=-auroraux
-		;;
-	-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* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* | -plan9* \
-	      | -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* \
-	      | -bitrig* | -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* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-musl* | -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* | -es*)
-	# 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
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-	-nacl*)
-		;;
-	-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
-		;;
-	hexagon-*)
-		os=-elf
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		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
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or1k-*)
-		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/tools/sci/org.eclipse.ptp.sci/configure b/tools/sci/org.eclipse.ptp.sci/configure
deleted file mode 100755
index deb9778..0000000
--- a/tools/sci/org.eclipse.ptp.sci/configure
+++ /dev/null
Binary files differ
diff --git a/tools/sci/org.eclipse.ptp.sci/configure.in b/tools/sci/org.eclipse.ptp.sci/configure.in
deleted file mode 100644
index fe0d0a6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/configure.in
+++ /dev/null
@@ -1,107 +0,0 @@
-#                                               -*- Autoconf -*-
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ(2.59)
-AC_INIT(SCI, 2.0, ronglli@cn.ibm.com)
-AC_CONFIG_HEADER([config.h])
-AM_INIT_AUTOMAKE(SCI, 2.0)
-
-# Checks for programs.
-AC_PROG_CXX
-AC_PROG_CC
-AC_PROG_LIBTOOL
-AM_PROG_CC_C_O
-
-AC_PREFIX_DEFAULT("/opt/sci")
-
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_BIT=32
-AC_DEFINE(_SCI_DEBUG, 1, "for debugging")
-case "${UNAME_SYSTEM}" in
-    Linux)
-    AC_DEFINE(_SCI_LINUX, 1, "define if linux")
-    AC_DEFINE(_LINUX, 1, "define if linux")
-    ;;
-    AIX)
-    AC_DEFINE(_AIX, 1, "define if linux")
-    AC_DEFINE(POWER_ARCH, 1, "define if ppc")
-    UNAME_BIT=64
-    CC=xlc_r
-    ;;
-    Darwin)
-    # Nothing required yet
-    ;;
-esac
-case "${UNAME_MACHINE}" in
-    *86*)
-    AC_DEFINE(INTEL_ARCH, 1, "define if x86")
-    ;;
-    *ppc*)
-    AC_DEFINE(POWER_ARCH, 1, "define if ppc")
-    ;;
-esac
-case "${UNAME_MACHINE}" in
-    *64*)
-    libdir="\${exec_prefix}/lib64" 
-    UNAME_BIT=64
-    ;;
-esac
-
-AC_MSG_CHECKING([whether to compile with Open SSL support])
-AC_ARG_ENABLE(openssl,
-[  --enable-openssl            enable Open SSL client and server support [default is disabled]], [
-  if test "$enableval" = yes ; then
-    AC_MSG_RESULT(enabled)
-    AC_DEFINE(PSEC_OPEN_SSL, 1, "define if enable openssl support")
-    openssl=yes
-    AC_CHECK_HEADERS([openssl/pem.h openssl/bio.h openssl/md5.h openssl/aes.h])
-  else
-    openssl=no
-  fi
-],[
-  openssl=no
-])
-AM_CONDITIONAL(OPEN_SSL, test $openssl = yes)
-AM_CONDITIONAL(SYSTEM_LINUX, test $UNAME_SYSTEM = Linux)
-AM_CONDITIONAL(SYSTEM_AIX, test $UNAME_SYSTEM = AIX)
-AM_CONDITIONAL(SYSTEM_DARWIN, test $UNAME_SYSTEM = Darwin)
-AM_CONDITIONAL(BIT64, test $UNAME_BIT = 64)
-
-
-# Checks for header files.
-# AC_HEADER_STDC
-# AC_HEADER_SYS_WAIT
-# AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stddef.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h unistd.h])
-
-# Checks for typedefs, structures, and compiler characteristics.
-# AC_HEADER_STDBOOL
-# AC_C_CONST
-# AC_TYPE_PID_T
-# AC_TYPE_SIZE_T
-# AC_HEADER_TIME
-# AC_STRUCT_TM
-# AC_C_VOLATILE
-
-# Checks for library functions.
-# AC_FUNC_FORK
-# AC_PROG_GCC_TRADITIONAL
-# AC_FUNC_MEMCMP
-# AC_FUNC_SELECT_ARGTYPES
-# AC_FUNC_STAT
-# AC_FUNC_STRFTIME
-# AC_FUNC_VPRINTF
-# AC_CHECK_FUNCS([clock_gettime dup2 getcwd gethostname gettimeofday localtime_r memmove memset pow select setenv socket strcasecmp strchr strdup strerror strrchr strstr strtol])
-
-AC_CONFIG_FILES([Makefile
-                 common/Makefile
-                 libsci/Makefile
-                 scia/Makefile
-                 scid/Makefile
-                 secmod/Makefile
-				 usecase/Makefile
-				 usecase/dsh/Makefile
-				 usecase/dsh_2/Makefile
-				 usecase/dsh_filter/Makefile
-				 usecase/dsh_filter2/Makefile])
-AC_OUTPUT
diff --git a/tools/sci/org.eclipse.ptp.sci/depcomp b/tools/sci/org.eclipse.ptp.sci/depcomp
deleted file mode 100755
index 04701da..0000000
--- a/tools/sci/org.eclipse.ptp.sci/depcomp
+++ /dev/null
@@ -1,530 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2005-07-09.11
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 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 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, 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 Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
-  if test "$libtool" = yes; then
-    "$@" -Wc,-M
-  else
-    "$@" -M
-  fi
-  stat=$?
-
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-
-  if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/tools/sci/org.eclipse.ptp.sci/include/Makefile b/tools/sci/org.eclipse.ptp.sci/include/Makefile
deleted file mode 100644
index 38f65a8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/include/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-include ../makefile.define
-
-install: sci.h
-	-mkdir -p $(INC_DIR)
-	cp sci.h $(INC_DIR)
-	ln -sf $(INC_DIR)/sci.h /usr/include/sci.h
-
-clean:
diff --git a/tools/sci/org.eclipse.ptp.sci/include/sci.h b/tools/sci/org.eclipse.ptp.sci/include/sci.h
deleted file mode 100644
index ad8d1e7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/include/sci.h
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifndef _SCI_H
-#define _SCI_H
-/***************************************************************************
-"%Z% %I% %W% %D% %T%\0"
- Name: sci.h
-
- Description:
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
-***************************************************************************/
-
-/*
-** SCI Version 2.0.0.0
-*/
-#define SCI_VERSION 2000
-
-/*
-** SCI Return/Error Codes
-*/
-#define SCI_SUCCESS                  (0)
-#define SCI_ERR_INVALID_HOSTFILE     (-2001)
-#define SCI_ERR_INVALID_ENDTYPE      (-2002)   
-#define SCI_ERR_INITIALIZE_FAILED    (-2003)
-#define SCI_ERR_INVALID_CALLER       (-2004)
-#define SCI_ERR_GROUP_NOTFOUND       (-2005)
-#define SCI_ERR_FILTER_NOTFOUND      (-2006)
-#define SCI_ERR_INVALID_FILTER       (-2007)
-#define SCI_ERR_BACKEND_NOTFOUND     (-2008)
-#define SCI_ERR_UNKNOWN_INFO         (-2009)
-#define SCI_ERR_UNINTIALIZED         (-2010)
-#define SCI_ERR_GROUP_PREDEFINED     (-2011)
-#define SCI_ERR_GROUP_EMPTY          (-2012)
-#define SCI_ERR_INVALID_OPERATOR     (-2013)
-#define SCI_ERR_FILTER_PREDEFINED    (-2014)
-#define SCI_ERR_POLL_TIMEOUT         (-2015)
-#define SCI_ERR_INVALID_JOBKEY       (-2016)
-#define SCI_ERR_MODE                 (-2017)
-#define SCI_ERR_FILTER_ID            (-2018)
-#define SCI_ERR_INVALID_SUCCESSOR    (-2019)
-#define SCI_ERR_BACKEND_EXISTED      (-2020)
-#define SCI_ERR_NO_MEM               (-2021)
-#define SCI_ERR_LAUNCH_FAILED        (-2022)
-#define SCI_ERR_POLL_INVALID         (-2023)
-#define SCI_ERR_INVALID_USER         (-2024)
-#define SCI_ERR_INVALID_MODE         (-2025)
-#define SCI_ERR_AGENT_NOTFOUND       (-2026)
-#define SCI_ERR_VERSION              (-2027)
-#define SCI_ERR_SSHAUTH              (-2028)
-#define SCI_ERR_EXCEPTION            (-2029)
-#define SCI_ERR_MSG                  (-2030) 
-
-#define SCI_ERR_PARENT_BROKEN        (-5000)
-#define SCI_ERR_CHILD_BROKEN         (-5001)
-#define SCI_ERR_RECOVERED            (-5002)
-#define SCI_ERR_RECOVER_FAILED       (-5003)
-#define SCI_ERR_DATA                 (-5004)
-#define SCI_ERR_THREAD               (-5005)
-
-/*
-** SCI Structures and typedefs
-*/
-typedef int sci_group_t;
-
-/*
-** SCI Bcast & Upload message handler
-*/
-typedef int (SCI_msg_hndlr)(void *user_param, sci_group_t group, void *buf, int size);
-typedef int (SCI_connect_hndlr)(const char *hostname);  // hostname can be a name or an IP address
-
-/*
-** SCI Error message handler
-*/
-typedef int (SCI_err_hndlr)(int err_code, int node_id, int num_bes);
-
-/*
-** SCI Filter message handler
-*/
-typedef int (filter_init_hndlr)(void **user_param);
-typedef int (filter_input_hndlr)(void *user_param, sci_group_t group, void *buf, int size);
-typedef int (filter_term_hndlr)(void *user_param);
-
-/*
-** SCI Predefined groups
-*/
-#define SCI_GROUP_ALL -1
-
-/*
-** SCI Predefined filter IDs
-*/
-#define SCI_FILTER_NULL -1
-
-#pragma enum (int)
-typedef enum {
-    SCI_FRONT_END,
-    SCI_BACK_END
-} sci_end_type_t;
-
-typedef enum {
-    SCI_INTERRUPT,
-    SCI_POLLING
-} sci_mode_t;
-#pragma enum (pop)
-
-typedef struct {
-    int              filter_id;
-    char             *so_file;
-} sci_filter_info_t;
-
-typedef struct {
-    int                 num;
-    sci_filter_info_t   *filters;
-} sci_filter_list_t;
-
-typedef struct {
-    sci_mode_t           mode;
-    SCI_msg_hndlr        *hndlr;
-    void                 *param;
-    SCI_err_hndlr        *err_hndlr;
-    char                 *hostfile;
-    char                 *bepath;
-    char                 **beenvp;
-    sci_filter_list_t    filter_list;    
-    char                 **host_list;
-    char                 reserve[64];
-} sci_fe_info_t;
-
-typedef struct {
-    sci_mode_t       mode;
-    SCI_msg_hndlr    *hndlr;
-    void             *param;
-    SCI_err_hndlr    *err_hndlr;
-    char             reserve[64];
-} sci_be_info_t;
-
-typedef struct {
-    sci_end_type_t          type;
-    SCI_connect_hndlr       *connect_hndlr;             
-    union {
-        sci_fe_info_t           fe_info;
-        sci_be_info_t           be_info;
-    } _u;
-#define fe_info _u.fe_info
-#define be_info _u.be_info
-    int              sci_version;
-    int              disable_sshauth;
-    int              enable_recover;
-} sci_info_t;
-
-typedef struct {
-    int              id;
-    char             *hostname;  /* hostname can be a name or an IP address */
-    int              level;
-} sci_be_t;
-
-typedef enum {
-    SCI_JOB_KEY,
-    SCI_NUM_BACKENDS,
-    SCI_BACKEND_ID,
-    SCI_POLLING_FD,
-    SCI_NUM_FILTERS,
-    SCI_FILTER_IDLIST,
-    SCI_AGENT_ID,
-    SCI_NUM_SUCCESSORS,
-    SCI_SUCCESSOR_IDLIST,
-    SCI_HEALTH_STATUS,
-    SCI_AGENT_LEVEL,
-    SCI_LISTENER_PORT,
-    SCI_PARENT_SOCKFD,
-    SCI_NUM_CHILDREN_FDS,
-    SCI_CURRENT_VERSION,
-    SCI_PIPEWRITE_FD,
-    SCI_CHILDREN_FDLIST,
-    SCI_NUM_LISTENER_FDS,
-    SCI_LISTENER_FDLIST,
-    SCI_RECOVER_STATUS
-#define JOB_KEY              SCI_JOB_KEY
-#define NUM_BACKENDS         SCI_NUM_BACKENDS
-#define BACKEND_ID           SCI_BACKEND_ID
-#define POLLING_FD           SCI_POLLING_FD
-#define NUM_FILTERS          SCI_NUM_FILTERS
-#define FILTER_IDLIST        SCI_FILTER_IDLIST
-#define AGENT_ID             SCI_AGENT_ID
-#define NUM_SUCCESSORS       SCI_NUM_SUCCESSORS
-#define SUCCESSOR_IDLIST     SCI_SUCCESSOR_IDLIST
-#define HEALTH_STATUS        SCI_HEALTH_STATUS
-#define AGENT_LEVEL          SCI_AGENT_LEVEL
-#define LISTENER_PORT        SCI_LISTENER_PORT
-#define PARENT_SOCKFD        SCI_PARENT_SOCKFD
-#define NUM_CHILDREN_FDS     SCI_NUM_CHILDREN_FDS
-#define CURRENT_VERSION      SCI_CURRENT_VERSION
-#define PIPEWRITE_FD         SCI_PIPEWRITE_FD
-#define CHILDREN_FDLIST      SCI_CHILDREN_FDLIST
-#define NUM_LISTENER_FDS     SCI_NUM_LISTENER_FDS
-#define LISTENER_FDLIST      SCI_LISTENER_FDLIST
-#define RECOVER_STATUS       SCI_RECOVER_STATUS
-} sci_query_t;
-
-typedef enum {
-    GROUP_MEMBER_NUM,
-    GROUP_MEMBER,
-    GROUP_SUCCESSOR_NUM,
-    GROUP_SUCCESSOR
-} sci_group_query_t;
-
-typedef enum {
-    SCI_UNION,
-    SCI_INTERSECTION,
-    SCI_DIFFERENCE
-} sci_op_t;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
-***************************************************************
-****************** SCI C Externalized API's ******************
-***************************************************************
-*/
-/*
-** SCI Environment setup/terminate/query functions.
-*/
-int SCI_Initialize(sci_info_t *info);
-int SCI_Terminate();
-int SCI_Release();
-int SCI_Parentinfo_update(char * parentAddr, int port);
-int SCI_Parentinfo_wait();
-int SCI_Recover_setmode(int mode);
-
-int SCI_Query(sci_query_t query, void *ret_val);
-int SCI_Query_errchildren(int *num, int **id_list);
-int SCI_Error(int err_code, char *err_msg, int msg_size);
-
-/*
-** SCI Communication functions.
-*/
-int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-int SCI_Poll(int timeout);
-
-/*
-** SCI Group manipulation functions.
-*/
-int SCI_Group_create(int num_bes, int *be_list, sci_group_t *group);
-int SCI_Group_free(sci_group_t group);
-int SCI_Group_operate(sci_group_t group1, sci_group_t group2,
-        sci_op_t op, sci_group_t *newgroup);
-int SCI_Group_operate_ext(sci_group_t group, int num_bes, int *be_list, 
-        sci_op_t op, sci_group_t *newgroup);
-int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val);
-
-/*
-** SCI Filter related functions.
-*/
-int SCI_Filter_load(sci_filter_info_t *filter_info); 
-int SCI_Filter_unload(int filter_id);
-int SCI_Filter_bcast(int filter_id, int num_successors, int *successor_list, int num_bufs,
-        void *bufs[], int sizes[]);
-int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-
-/*
-** SCI Dynamic add/remove back end.
-*/
-int SCI_BE_add(sci_be_t *be);
-int SCI_BE_remove(int be_id);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/install-sh b/tools/sci/org.eclipse.ptp.sci/install-sh
deleted file mode 100755
index 4d4a951..0000000
--- a/tools/sci/org.eclipse.ptp.sci/install-sh
+++ /dev/null
@@ -1,323 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2005-05-14.22
-
-# 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.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-chmodcmd="$chmodprog 0755"
-chowncmd=
-chgrpcmd=
-stripcmd=
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=
-dst=
-dir_arg=
-dstarg=
-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:
--c         (ignored)
--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.
---help     display this help and exit.
---version  display version info and exit.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
-"
-
-while test -n "$1"; do
-  case $1 in
-    -c) shift
-        continue;;
-
-    -d) dir_arg=true
-        shift
-        continue;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) chmodcmd="$chmodprog $2"
-        shift
-        shift
-        continue;;
-
-    -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
-
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
-
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
-
-    -T) no_target_directory=true
-	shift
-	continue;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    *)  # When -d is used, all remaining arguments are directories to create.
-	# When -t is used, the destination is already specified.
-	test -n "$dir_arg$dstarg" && break
-        # Otherwise, the last argument is the destination.  Remove it from $@.
-	for arg
-	do
-          if test -n "$dstarg"; then
-	    # $@ is not empty: it contains at least $arg.
-	    set fnord "$@" "$dstarg"
-	    shift # fnord
-	  fi
-	  shift # arg
-	  dstarg=$arg
-	done
-	break;;
-  esac
-done
-
-if test -z "$1"; 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
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src ;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    src=
-
-    if test -d "$dst"; then
-      mkdircmd=:
-      chmodcmd=
-    else
-      mkdircmd=$mkdirprog
-    fi
-  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 "$dstarg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dstarg
-    # 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: $dstarg: Is a directory" >&2
-	exit 1
-      fi
-      dst=$dst/`basename "$src"`
-    fi
-  fi
-
-  # This sed command emulates the dirname command.
-  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
-
-  # Make sure that the destination directory exists.
-
-  # Skip lots of stat calls in the usual case.
-  if test ! -d "$dstdir"; then
-    defaultIFS='
-	 '
-    IFS="${IFS-$defaultIFS}"
-
-    oIFS=$IFS
-    # Some sh's can't handle IFS=/ for some reason.
-    IFS='%'
-    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-    shift
-    IFS=$oIFS
-
-    pathcomp=
-
-    while test $# -ne 0 ; do
-      pathcomp=$pathcomp$1
-      shift
-      if test ! -d "$pathcomp"; then
-        $mkdirprog "$pathcomp"
-	# mkdir can fail with a `File exist' error in case several
-	# install-sh are creating the directory concurrently.  This
-	# is OK.
-	test -d "$pathcomp" || exit
-      fi
-      pathcomp=$pathcomp/
-    done
-  fi
-
-  if test -n "$dir_arg"; then
-    $doit $mkdircmd "$dst" \
-      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
-  else
-    dstfile=`basename "$dst"`
-
-    # 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
-    trap '(exit $?); exit' 1 2 13 15
-
-    # Copy the file name to the temp name.
-    $doit $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 "$dsttmp"; } &&
-
-    # Now rename the file to the real destination.
-    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 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.
-	   {
-	     if test -f "$dstdir/$dstfile"; then
-	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
-	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
-	       || {
-		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-		 (exit 1); exit 1
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-	 }
-    }
-  fi || { (exit 1); exit 1; }
-done
-
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
-  (exit 0); 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-end: "$"
-# End:
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/.cvsignore b/tools/sci/org.eclipse.ptp.sci/libsci/.cvsignore
deleted file mode 100644
index 6829bc3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-Makefile
-.libs
-*.lo
-*.loT
-libsci.la
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.am b/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.am
deleted file mode 100644
index 9b3fe08..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.am
+++ /dev/null
@@ -1,52 +0,0 @@
-AUTOMAKE_OPTIONS=foreign
-SOURCES = \
-    allocator.cpp    filterproc.cpp   message.cpp    purifierproc.cpp  routinglist.cpp \
-    api.cpp          eventntf.cpp    handlerproc.cpp  observer.cpp   queue.cpp         \
-    ctrlblock.cpp    filter.cpp      initializer.cpp  readerproc.cpp    topology.cpp launcher.cpp \
-    dgroup.cpp       filterlist.cpp  listener.cpp     processor.cpp  routerproc.cpp    writerproc.cpp \
-    embedagent.cpp   privatedata.cpp bemap.cpp
-
-noinst_HEADERS = \
-    allocator.hpp  filterproc.hpp listener.hpp processor.hpp routerproc.hpp writerproc.hpp \
-    atomic.hpp      eventntf.hpp    general.hpp      message.hpp   purifierproc.hpp  routinglist.hpp \
-    ctrlblock.hpp   filter.hpp      handlerproc.hpp  observer.hpp  queue.hpp   embedagent.hpp       \
-    dgroup.hpp      filterlist.hpp  initializer.hpp  readerproc.hpp    topology.hpp privatedata.hpp bemap.hpp
-
-include_HEADERS = ../include/sci.h
-
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-OBJECTS64 = $(addsuffix .64o, $(basename $(SOURCES)))
-
-if SYSTEM_AIX
-lib_LIBRARIES = libsci_r.a
-
-SCI_CPPFLAGS = -g -O0 -DREENTRANT -D_SCI_DEBUG -I../include -I../common -I../libsci -I../ -I../secmod -qmkshrobj 
-libsci_r.a : libsci_r.o libsci64_r.o
-	$(AR) -X32_64 -rv $@ $^
-libsci_r.o : $(OBJECTS)
-	$(CXX) -q32 $(SCI_CPPFLAGS) -o $@ $^ -L../common -lcmn
-libsci64_r.o : $(OBJECTS64)
-	$(CXX) -q64 $(SCI_CPPFLAGS) -o $@ $^ -L../common -lcmn64
-
-%.o: %.cpp
-	$(CXX) -q32 -c $(SCI_CPPFLAGS) -o $@ $< 
-
-%.64o: %.cpp
-	$(CXX) -q64 -c $(SCI_CPPFLAGS) -o $@ $< -D__64BIT__
-
-endif
-if SYSTEM_LINUX
-lib_LTLIBRARIES=libsci.la
-libsci_la_SOURCES = $(SOURCES)
-libsci_la_CPPFLAGS = -g -O0 -I../include -I../common -I../secmod
-if BIT64
-libsci_la_CPPFLAGS += -D__64BIT__
-endif
-libsci_la_LDFLAGS= -L../common -lcmn -lrt -ldl
-endif
-if SYSTEM_DARWIN
-lib_LTLIBRARIES=libsci.la
-libsci_la_SOURCES = $(SOURCES)
-libsci_la_CPPFLAGS = -I../include -I../common -I../secmod
-libsci_la_LDFLAGS= -L../common -lcmn
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.in b/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.in
deleted file mode 100644
index d65217f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile.in
+++ /dev/null
@@ -1,881 +0,0 @@
-# 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@
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am__append_1 = -D__64BIT__
-subdir = libsci
-DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-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'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libdir)" \
-	"$(DESTDIR)$(includedir)"
-LIBRARIES = $(lib_LIBRARIES)
-ARFLAGS = cru
-libsci_r_a_AR = $(AR) $(ARFLAGS)
-libsci_r_a_LIBADD =
-libsci_r_a_SOURCES = libsci_r.c
-libsci_r_a_OBJECTS = libsci_r.$(OBJEXT)
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libsci_la_LIBADD =
-am__libsci_la_SOURCES_DIST = allocator.cpp filterproc.cpp message.cpp \
-	purifierproc.cpp routinglist.cpp api.cpp eventntf.cpp \
-	handlerproc.cpp observer.cpp queue.cpp ctrlblock.cpp \
-	filter.cpp initializer.cpp readerproc.cpp topology.cpp \
-	launcher.cpp dgroup.cpp filterlist.cpp listener.cpp \
-	processor.cpp routerproc.cpp writerproc.cpp embedagent.cpp \
-	privatedata.cpp bemap.cpp
-am__objects_1 = libsci_la-allocator.lo libsci_la-filterproc.lo \
-	libsci_la-message.lo libsci_la-purifierproc.lo \
-	libsci_la-routinglist.lo libsci_la-api.lo \
-	libsci_la-eventntf.lo libsci_la-handlerproc.lo \
-	libsci_la-observer.lo libsci_la-queue.lo \
-	libsci_la-ctrlblock.lo libsci_la-filter.lo \
-	libsci_la-initializer.lo libsci_la-readerproc.lo \
-	libsci_la-topology.lo libsci_la-launcher.lo \
-	libsci_la-dgroup.lo libsci_la-filterlist.lo \
-	libsci_la-listener.lo libsci_la-processor.lo \
-	libsci_la-routerproc.lo libsci_la-writerproc.lo \
-	libsci_la-embedagent.lo libsci_la-privatedata.lo \
-	libsci_la-bemap.lo
-@SYSTEM_DARWIN_FALSE@@SYSTEM_LINUX_TRUE@am_libsci_la_OBJECTS =  \
-@SYSTEM_DARWIN_FALSE@@SYSTEM_LINUX_TRUE@	$(am__objects_1)
-@SYSTEM_DARWIN_TRUE@am_libsci_la_OBJECTS = $(am__objects_1)
-libsci_la_OBJECTS = $(am_libsci_la_OBJECTS)
-libsci_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(libsci_la_LDFLAGS) $(LDFLAGS) -o $@
-@SYSTEM_DARWIN_TRUE@am_libsci_la_rpath = -rpath $(libdir)
-@SYSTEM_LINUX_TRUE@am_libsci_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-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 $@
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-DIST_SOURCES = libsci_r.c $(am__libsci_la_SOURCES_DIST)
-HEADERS = $(include_HEADERS) $(noinst_HEADERS)
-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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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
-SOURCES = \
-    allocator.cpp    filterproc.cpp   message.cpp    purifierproc.cpp  routinglist.cpp \
-    api.cpp          eventntf.cpp    handlerproc.cpp  observer.cpp   queue.cpp         \
-    ctrlblock.cpp    filter.cpp      initializer.cpp  readerproc.cpp    topology.cpp launcher.cpp \
-    dgroup.cpp       filterlist.cpp  listener.cpp     processor.cpp  routerproc.cpp    writerproc.cpp \
-    embedagent.cpp   privatedata.cpp bemap.cpp
-
-noinst_HEADERS = \
-    allocator.hpp  filterproc.hpp listener.hpp processor.hpp routerproc.hpp writerproc.hpp \
-    atomic.hpp      eventntf.hpp    general.hpp      message.hpp   purifierproc.hpp  routinglist.hpp \
-    ctrlblock.hpp   filter.hpp      handlerproc.hpp  observer.hpp  queue.hpp   embedagent.hpp       \
-    dgroup.hpp      filterlist.hpp  initializer.hpp  readerproc.hpp    topology.hpp privatedata.hpp bemap.hpp
-
-include_HEADERS = ../include/sci.h
-OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
-OBJECTS64 = $(addsuffix .64o, $(basename $(SOURCES)))
-@SYSTEM_AIX_TRUE@lib_LIBRARIES = libsci_r.a
-@SYSTEM_AIX_TRUE@SCI_CPPFLAGS = -g -O0 -DREENTRANT -D_SCI_DEBUG -I../include -I../common -I../libsci -I../ -I../secmod -qmkshrobj 
-@SYSTEM_DARWIN_TRUE@lib_LTLIBRARIES = libsci.la
-@SYSTEM_LINUX_TRUE@lib_LTLIBRARIES = libsci.la
-@SYSTEM_DARWIN_TRUE@libsci_la_SOURCES = $(SOURCES)
-@SYSTEM_LINUX_TRUE@libsci_la_SOURCES = $(SOURCES)
-@SYSTEM_DARWIN_TRUE@libsci_la_CPPFLAGS = -I../include -I../common -I../secmod
-@SYSTEM_LINUX_TRUE@libsci_la_CPPFLAGS = -g -O0 -I../include \
-@SYSTEM_LINUX_TRUE@	-I../common -I../secmod $(am__append_1)
-@SYSTEM_DARWIN_TRUE@libsci_la_LDFLAGS = -L../common -lcmn
-@SYSTEM_LINUX_TRUE@libsci_la_LDFLAGS = -L../common -lcmn -lrt -ldl
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .cpp .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 libsci/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign libsci/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):
-install-libLIBRARIES: $(lib_LIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
-	@$(POST_INSTALL)
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  if test -f $$p; then \
-	    $(am__strip_dir) \
-	    echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \
-	    ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \
-	  else :; fi; \
-	done
-
-uninstall-libLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \
-	cd "$(DESTDIR)$(libdir)" && rm -f $$files
-
-clean-libLIBRARIES:
-	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-@SYSTEM_AIX_FALSE@libsci_r.a: $(libsci_r_a_OBJECTS) $(libsci_r_a_DEPENDENCIES) 
-@SYSTEM_AIX_FALSE@	-rm -f libsci_r.a
-@SYSTEM_AIX_FALSE@	$(libsci_r_a_AR) libsci_r.a $(libsci_r_a_OBJECTS) $(libsci_r_a_LIBADD)
-@SYSTEM_AIX_FALSE@	$(RANLIB) libsci_r.a
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_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
-libsci.la: $(libsci_la_OBJECTS) $(libsci_la_DEPENDENCIES) 
-	$(libsci_la_LINK) $(am_libsci_la_rpath) $(libsci_la_OBJECTS) $(libsci_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-allocator.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-api.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-bemap.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-ctrlblock.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-dgroup.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-embedagent.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-eventntf.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-filter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-filterlist.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-filterproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-handlerproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-initializer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-launcher.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-listener.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-message.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-observer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-privatedata.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-processor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-purifierproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-queue.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-readerproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-routerproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-routinglist.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-topology.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_la-writerproc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsci_r.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-libsci_la-allocator.lo: allocator.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-allocator.lo -MD -MP -MF $(DEPDIR)/libsci_la-allocator.Tpo -c -o libsci_la-allocator.lo `test -f 'allocator.cpp' || echo '$(srcdir)/'`allocator.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-allocator.Tpo $(DEPDIR)/libsci_la-allocator.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='allocator.cpp' object='libsci_la-allocator.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-allocator.lo `test -f 'allocator.cpp' || echo '$(srcdir)/'`allocator.cpp
-
-libsci_la-filterproc.lo: filterproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-filterproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-filterproc.Tpo -c -o libsci_la-filterproc.lo `test -f 'filterproc.cpp' || echo '$(srcdir)/'`filterproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-filterproc.Tpo $(DEPDIR)/libsci_la-filterproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='filterproc.cpp' object='libsci_la-filterproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-filterproc.lo `test -f 'filterproc.cpp' || echo '$(srcdir)/'`filterproc.cpp
-
-libsci_la-message.lo: message.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-message.lo -MD -MP -MF $(DEPDIR)/libsci_la-message.Tpo -c -o libsci_la-message.lo `test -f 'message.cpp' || echo '$(srcdir)/'`message.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-message.Tpo $(DEPDIR)/libsci_la-message.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='message.cpp' object='libsci_la-message.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-message.lo `test -f 'message.cpp' || echo '$(srcdir)/'`message.cpp
-
-libsci_la-purifierproc.lo: purifierproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-purifierproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-purifierproc.Tpo -c -o libsci_la-purifierproc.lo `test -f 'purifierproc.cpp' || echo '$(srcdir)/'`purifierproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-purifierproc.Tpo $(DEPDIR)/libsci_la-purifierproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='purifierproc.cpp' object='libsci_la-purifierproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-purifierproc.lo `test -f 'purifierproc.cpp' || echo '$(srcdir)/'`purifierproc.cpp
-
-libsci_la-routinglist.lo: routinglist.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-routinglist.lo -MD -MP -MF $(DEPDIR)/libsci_la-routinglist.Tpo -c -o libsci_la-routinglist.lo `test -f 'routinglist.cpp' || echo '$(srcdir)/'`routinglist.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-routinglist.Tpo $(DEPDIR)/libsci_la-routinglist.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='routinglist.cpp' object='libsci_la-routinglist.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-routinglist.lo `test -f 'routinglist.cpp' || echo '$(srcdir)/'`routinglist.cpp
-
-libsci_la-api.lo: api.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-api.lo -MD -MP -MF $(DEPDIR)/libsci_la-api.Tpo -c -o libsci_la-api.lo `test -f 'api.cpp' || echo '$(srcdir)/'`api.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-api.Tpo $(DEPDIR)/libsci_la-api.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='api.cpp' object='libsci_la-api.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-api.lo `test -f 'api.cpp' || echo '$(srcdir)/'`api.cpp
-
-libsci_la-eventntf.lo: eventntf.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-eventntf.lo -MD -MP -MF $(DEPDIR)/libsci_la-eventntf.Tpo -c -o libsci_la-eventntf.lo `test -f 'eventntf.cpp' || echo '$(srcdir)/'`eventntf.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-eventntf.Tpo $(DEPDIR)/libsci_la-eventntf.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='eventntf.cpp' object='libsci_la-eventntf.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-eventntf.lo `test -f 'eventntf.cpp' || echo '$(srcdir)/'`eventntf.cpp
-
-libsci_la-handlerproc.lo: handlerproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-handlerproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-handlerproc.Tpo -c -o libsci_la-handlerproc.lo `test -f 'handlerproc.cpp' || echo '$(srcdir)/'`handlerproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-handlerproc.Tpo $(DEPDIR)/libsci_la-handlerproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='handlerproc.cpp' object='libsci_la-handlerproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-handlerproc.lo `test -f 'handlerproc.cpp' || echo '$(srcdir)/'`handlerproc.cpp
-
-libsci_la-observer.lo: observer.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-observer.lo -MD -MP -MF $(DEPDIR)/libsci_la-observer.Tpo -c -o libsci_la-observer.lo `test -f 'observer.cpp' || echo '$(srcdir)/'`observer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-observer.Tpo $(DEPDIR)/libsci_la-observer.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='observer.cpp' object='libsci_la-observer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-observer.lo `test -f 'observer.cpp' || echo '$(srcdir)/'`observer.cpp
-
-libsci_la-queue.lo: queue.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-queue.lo -MD -MP -MF $(DEPDIR)/libsci_la-queue.Tpo -c -o libsci_la-queue.lo `test -f 'queue.cpp' || echo '$(srcdir)/'`queue.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-queue.Tpo $(DEPDIR)/libsci_la-queue.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='queue.cpp' object='libsci_la-queue.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-queue.lo `test -f 'queue.cpp' || echo '$(srcdir)/'`queue.cpp
-
-libsci_la-ctrlblock.lo: ctrlblock.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-ctrlblock.lo -MD -MP -MF $(DEPDIR)/libsci_la-ctrlblock.Tpo -c -o libsci_la-ctrlblock.lo `test -f 'ctrlblock.cpp' || echo '$(srcdir)/'`ctrlblock.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-ctrlblock.Tpo $(DEPDIR)/libsci_la-ctrlblock.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ctrlblock.cpp' object='libsci_la-ctrlblock.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-ctrlblock.lo `test -f 'ctrlblock.cpp' || echo '$(srcdir)/'`ctrlblock.cpp
-
-libsci_la-filter.lo: filter.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-filter.lo -MD -MP -MF $(DEPDIR)/libsci_la-filter.Tpo -c -o libsci_la-filter.lo `test -f 'filter.cpp' || echo '$(srcdir)/'`filter.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-filter.Tpo $(DEPDIR)/libsci_la-filter.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='filter.cpp' object='libsci_la-filter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-filter.lo `test -f 'filter.cpp' || echo '$(srcdir)/'`filter.cpp
-
-libsci_la-initializer.lo: initializer.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-initializer.lo -MD -MP -MF $(DEPDIR)/libsci_la-initializer.Tpo -c -o libsci_la-initializer.lo `test -f 'initializer.cpp' || echo '$(srcdir)/'`initializer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-initializer.Tpo $(DEPDIR)/libsci_la-initializer.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='initializer.cpp' object='libsci_la-initializer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-initializer.lo `test -f 'initializer.cpp' || echo '$(srcdir)/'`initializer.cpp
-
-libsci_la-readerproc.lo: readerproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-readerproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-readerproc.Tpo -c -o libsci_la-readerproc.lo `test -f 'readerproc.cpp' || echo '$(srcdir)/'`readerproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-readerproc.Tpo $(DEPDIR)/libsci_la-readerproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='readerproc.cpp' object='libsci_la-readerproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-readerproc.lo `test -f 'readerproc.cpp' || echo '$(srcdir)/'`readerproc.cpp
-
-libsci_la-topology.lo: topology.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-topology.lo -MD -MP -MF $(DEPDIR)/libsci_la-topology.Tpo -c -o libsci_la-topology.lo `test -f 'topology.cpp' || echo '$(srcdir)/'`topology.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-topology.Tpo $(DEPDIR)/libsci_la-topology.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='topology.cpp' object='libsci_la-topology.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-topology.lo `test -f 'topology.cpp' || echo '$(srcdir)/'`topology.cpp
-
-libsci_la-launcher.lo: launcher.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-launcher.lo -MD -MP -MF $(DEPDIR)/libsci_la-launcher.Tpo -c -o libsci_la-launcher.lo `test -f 'launcher.cpp' || echo '$(srcdir)/'`launcher.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-launcher.Tpo $(DEPDIR)/libsci_la-launcher.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='launcher.cpp' object='libsci_la-launcher.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-launcher.lo `test -f 'launcher.cpp' || echo '$(srcdir)/'`launcher.cpp
-
-libsci_la-dgroup.lo: dgroup.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-dgroup.lo -MD -MP -MF $(DEPDIR)/libsci_la-dgroup.Tpo -c -o libsci_la-dgroup.lo `test -f 'dgroup.cpp' || echo '$(srcdir)/'`dgroup.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-dgroup.Tpo $(DEPDIR)/libsci_la-dgroup.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dgroup.cpp' object='libsci_la-dgroup.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-dgroup.lo `test -f 'dgroup.cpp' || echo '$(srcdir)/'`dgroup.cpp
-
-libsci_la-filterlist.lo: filterlist.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-filterlist.lo -MD -MP -MF $(DEPDIR)/libsci_la-filterlist.Tpo -c -o libsci_la-filterlist.lo `test -f 'filterlist.cpp' || echo '$(srcdir)/'`filterlist.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-filterlist.Tpo $(DEPDIR)/libsci_la-filterlist.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='filterlist.cpp' object='libsci_la-filterlist.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-filterlist.lo `test -f 'filterlist.cpp' || echo '$(srcdir)/'`filterlist.cpp
-
-libsci_la-listener.lo: listener.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-listener.lo -MD -MP -MF $(DEPDIR)/libsci_la-listener.Tpo -c -o libsci_la-listener.lo `test -f 'listener.cpp' || echo '$(srcdir)/'`listener.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-listener.Tpo $(DEPDIR)/libsci_la-listener.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='listener.cpp' object='libsci_la-listener.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-listener.lo `test -f 'listener.cpp' || echo '$(srcdir)/'`listener.cpp
-
-libsci_la-processor.lo: processor.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-processor.lo -MD -MP -MF $(DEPDIR)/libsci_la-processor.Tpo -c -o libsci_la-processor.lo `test -f 'processor.cpp' || echo '$(srcdir)/'`processor.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-processor.Tpo $(DEPDIR)/libsci_la-processor.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='processor.cpp' object='libsci_la-processor.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-processor.lo `test -f 'processor.cpp' || echo '$(srcdir)/'`processor.cpp
-
-libsci_la-routerproc.lo: routerproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-routerproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-routerproc.Tpo -c -o libsci_la-routerproc.lo `test -f 'routerproc.cpp' || echo '$(srcdir)/'`routerproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-routerproc.Tpo $(DEPDIR)/libsci_la-routerproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='routerproc.cpp' object='libsci_la-routerproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-routerproc.lo `test -f 'routerproc.cpp' || echo '$(srcdir)/'`routerproc.cpp
-
-libsci_la-writerproc.lo: writerproc.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-writerproc.lo -MD -MP -MF $(DEPDIR)/libsci_la-writerproc.Tpo -c -o libsci_la-writerproc.lo `test -f 'writerproc.cpp' || echo '$(srcdir)/'`writerproc.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-writerproc.Tpo $(DEPDIR)/libsci_la-writerproc.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='writerproc.cpp' object='libsci_la-writerproc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-writerproc.lo `test -f 'writerproc.cpp' || echo '$(srcdir)/'`writerproc.cpp
-
-libsci_la-embedagent.lo: embedagent.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-embedagent.lo -MD -MP -MF $(DEPDIR)/libsci_la-embedagent.Tpo -c -o libsci_la-embedagent.lo `test -f 'embedagent.cpp' || echo '$(srcdir)/'`embedagent.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-embedagent.Tpo $(DEPDIR)/libsci_la-embedagent.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='embedagent.cpp' object='libsci_la-embedagent.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-embedagent.lo `test -f 'embedagent.cpp' || echo '$(srcdir)/'`embedagent.cpp
-
-libsci_la-privatedata.lo: privatedata.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-privatedata.lo -MD -MP -MF $(DEPDIR)/libsci_la-privatedata.Tpo -c -o libsci_la-privatedata.lo `test -f 'privatedata.cpp' || echo '$(srcdir)/'`privatedata.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-privatedata.Tpo $(DEPDIR)/libsci_la-privatedata.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='privatedata.cpp' object='libsci_la-privatedata.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-privatedata.lo `test -f 'privatedata.cpp' || echo '$(srcdir)/'`privatedata.cpp
-
-libsci_la-bemap.lo: bemap.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsci_la-bemap.lo -MD -MP -MF $(DEPDIR)/libsci_la-bemap.Tpo -c -o libsci_la-bemap.lo `test -f 'bemap.cpp' || echo '$(srcdir)/'`bemap.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/libsci_la-bemap.Tpo $(DEPDIR)/libsci_la-bemap.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='bemap.cpp' object='libsci_la-bemap.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsci_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsci_la-bemap.lo `test -f 'bemap.cpp' || echo '$(srcdir)/'`bemap.cpp
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-includeHEADERS: $(include_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
-	done
-
-uninstall-includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(includedir)" && rm -f $$files
-
-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 $(LIBRARIES) $(LTLIBRARIES) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-libLIBRARIES clean-libLTLIBRARIES \
-	clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-includeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLIBRARIES install-libLTLIBRARIES
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-includeHEADERS uninstall-libLIBRARIES \
-	uninstall-libLTLIBRARIES
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLIBRARIES clean-libLTLIBRARIES clean-libtool ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool 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-includeHEADERS install-info install-info-am \
-	install-libLIBRARIES install-libLTLIBRARIES 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 \
-	uninstall-includeHEADERS uninstall-libLIBRARIES \
-	uninstall-libLTLIBRARIES
-
-@SYSTEM_AIX_TRUE@libsci_r.a : libsci_r.o libsci64_r.o
-@SYSTEM_AIX_TRUE@	$(AR) -X32_64 -rv $@ $^
-@SYSTEM_AIX_TRUE@libsci_r.o : $(OBJECTS)
-@SYSTEM_AIX_TRUE@	$(CXX) -q32 $(SCI_CPPFLAGS) -o $@ $^ -L../common -lcmn
-@SYSTEM_AIX_TRUE@libsci64_r.o : $(OBJECTS64)
-@SYSTEM_AIX_TRUE@	$(CXX) -q64 $(SCI_CPPFLAGS) -o $@ $^ -L../common -lcmn64
-
-@SYSTEM_AIX_TRUE@%.o: %.cpp
-@SYSTEM_AIX_TRUE@	$(CXX) -q32 -c $(SCI_CPPFLAGS) -o $@ $< 
-
-@SYSTEM_AIX_TRUE@%.64o: %.cpp
-@SYSTEM_AIX_TRUE@	$(CXX) -q64 -c $(SCI_CPPFLAGS) -o $@ $< -D__64BIT__
-
-# 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/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp
deleted file mode 100644
index ed34b05..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Allocator
-
- Description: Allocate global resources.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/03/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#include "allocator.hpp"
-#include <assert.h>
-
-#include "atomic.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-
-Allocator * Allocator::instance = NULL;
-
-Allocator::Allocator()
-{
-}
-
-Allocator::~Allocator()
-{
-}
-
-void Allocator::reset()
-{
-    nextGroupID = SCI_GROUP_ALL - 1;
-    nextBEID = gCtrlBlock->getTopology()->getBENum();
-}
-
-Allocator * Allocator::getInstance()
-{
-    if (instance == NULL)
-        instance = new Allocator();
-    return instance;
-}
-
-void Allocator::allocateGroup(sci_group_t * group)
-{
-    assert(group);
-    *group = fetch_and_add(&nextGroupID, -1);
-}
-
-void Allocator::allocateBE(int * be_id)
-{
-    assert(be_id);
-    *be_id = fetch_and_add(&nextBEID, 1);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp
deleted file mode 100644
index 36bc1b0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Allocator
-
- Description: Allocate global resources.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/03/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ALLOCATOR_HPP
-#define _ALLOCATOR_HPP
-
-#include "sci.h"
-
-class Allocator 
-{
-    private:
-        int             nextGroupID;
-        int             nextBEID;
-        
-        Allocator();
-        static Allocator *instance;
-        
-    public:
-        ~Allocator();
-        static Allocator *getInstance();
-
-        void reset();
-
-        void allocateGroup(sci_group_t *group);
-        void allocateBE(int *be_id);
-};
-
-#define gAllocator Allocator::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp
deleted file mode 100644
index 6c68008..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp
+++ /dev/null
@@ -1,910 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: SCI APIs.
-   
- Author: Liu Wei, Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-   01/16/12 ronglli      Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include <vector>
-#include <sys/socket.h>
-
-#include "sci.h"
-
-#include "tools.hpp"
-#include "log.hpp"
-#include "envvar.hpp"
-#include "packer.hpp"
-
-#include "general.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "eventntf.hpp"
-#include "initializer.hpp"
-#include "observer.hpp"
-#include "filter.hpp"
-#include "listener.hpp"
-#include "filterlist.hpp"
-#include "filterproc.hpp"
-#include "routerproc.hpp"
-#include "allocator.hpp"
-#include "sshfunc.hpp"
-#include "exception.hpp"
-
-const char * ErrRetMsg[] = {
-    "Succeeded.",
-    "Invalid host file.",
-    "Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END.",
-    "Error occurred when doing the initialization.",
-    "The API is called by invalid end type.",
-    "Error occurred when searching the group.",
-    "Error occurred when searching the filter.",
-    "Invalid filter.",
-    "Error occurred when searching the backend.",
-    "Unknown information.",
-    "Uninitialized SCI execution environment.",
-    "Can't free predefined group.",
-    "The group is an empty group.",
-    "Invalid group operator specified.",
-    "Can't unload predefined filter.",
-    "A polling timeout occurred after timeout milliseconds elapsed",
-    "Invalid job key specified by SCI_JOB_KEY.",
-    "Can only be used in polling mode.",
-    "Invalid filter id",
-    "The successor id list contains non-existed successor id.",
-    "The back id already existed.",
-    "Out of memory.",
-    "Failed to launch client(s).",
-    "Invalid polling calls.",
-    "Invalid user.",
-    "Invalid mode.",
-    "Error occurred when searching the agent.",
-    "Invalid version number.",              
-    "Error occurred when doing the SSH-based authentication.",
-    "Exception occurred",    
-    "Invalid error message number.",                  
-
-    "The parent is broken.",
-    "The child is broken.",
-    "Error occurred when doing the recovery.",
-    "Recover failed.",
-    "Received incorrect data.",
-    "Error occurred in the threads.",
-};
-
-SCI_msg_hndlr *gHndlr = NULL;
-void *gParam = NULL;
-// Initialization & Termination
-
-int SCI_Initialize(sci_info_t *info)
-{
-    int rc;
-    if (gCtrlBlock->getMyRole() != CtrlBlock::INVALID) {
-        log_warn("Has already been initialized");
-        return SCI_SUCCESS;
-    }
-
-    rc = gCtrlBlock->init(info);
-    if (rc != SCI_SUCCESS)
-        return rc;
-
-    return gInitializer->init();
-}
-
-int SCI_Terminate()
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-
-    try {
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            Message *msg = new Message();
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::QUIT);
-            gCtrlBlock->getRouterInQueue()->produce(msg);
-        }
-        gCtrlBlock->term();
-
-        delete gNotifier;
-        delete gInitializer;
-        delete gCtrlBlock;
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Release()
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID) {
-        return SCI_ERR_UNINTIALIZED;
-    }
-    try {
-        int role = gCtrlBlock->getMyRole();
-        
-        int num_fds = gCtrlBlock->numOfChildrenFds();
-        log_debug("there are total %d children", num_fds);
-        if (num_fds > 0) {
-            int * fd_list = (int *)malloc(num_fds * sizeof(int));
-            gCtrlBlock->getChildrenSockfds(fd_list);
-            for(int i=0; i < num_fds; i++) {
-                log_debug("close child fd %d", fd_list[i]);
-                ::shutdown(fd_list[i], SHUT_RDWR);
-                ::close(fd_list[i]);
-            }
-            free(fd_list);
-        }
-        if (role != CtrlBlock::FRONT_END) {
-            if (gInitializer->getInStream() != NULL) {
-                int p_fd = gInitializer->getInStream()->getSocket();
-                log_debug("close parent fd %d", p_fd);
-                ::shutdown(p_fd, SHUT_RDWR);
-                ::close(p_fd);
-            }
-        }
-        if (role == CtrlBlock::FRONT_END) { 
-            Message *msg = new Message();
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::RELEASE); 
-            gCtrlBlock->getRouterInQueue()->produce(msg); 
-        }
-        gCtrlBlock->term();
-
-        delete gNotifier;
-        delete gInitializer;
-        delete gCtrlBlock;
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Parentinfo_update(char * parentAddr, int port)
-{
-    int rc = -1;
-    if ((NULL == parentAddr) || (port <= 0))
-        return SCI_ERR_UNKNOWN_INFO;
-
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode()) 
-            || (!gCtrlBlock->getParentInfoWaitState()))
-        return SCI_ERR_INVALID_CALLER;
-
-    log_debug("Parentinfo_update: addr = %s, port = %d", parentAddr, port);
-    rc = gInitializer->updateParentInfo(parentAddr, port);
-    if (rc != SCI_SUCCESS) {
-        log_debug("Parentinfo_update: failed to update info, rc = %d", rc);
-        return rc;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Parentinfo_wait()
-{
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode()))
-        return SCI_ERR_INVALID_CALLER;
-
-    gCtrlBlock->setParentInfoWaitState(true);
-    log_debug("Parentinfo_wait: set the parentInfoWait state to true");
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Recover_setmode(int mode)
-{
-    gCtrlBlock->setRecoverMode(mode);
-    log_debug("Recover_setmode: set the recover mode to %d", mode);
-    return SCI_SUCCESS;
-}
-
-// Information Query
-
-
-int SCI_Query(sci_query_t query, void *ret_val)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if(NULL == ret_val) 
-        return SCI_ERR_UNKNOWN_INFO;
-
-    int *p = (int *) ret_val;
-    switch (query) 
-    {
-        case CURRENT_VERSION:
-            *p = gCtrlBlock->getVersion();
-            break;
-        case JOB_KEY:
-            *p = gCtrlBlock->getJobKey();
-            break;
-        case NUM_BACKENDS:
-            if(gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getTopology()->getBENum();
-            break;
-        case BACKEND_ID:
-            if((gCtrlBlock->getMyRole() != CtrlBlock::BACK_END)
-                    && (gCtrlBlock->getMyRole() != CtrlBlock::BACK_AGENT)) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getMyHandle();
-            break;
-        case POLLING_FD:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT)
-                return SCI_ERR_INVALID_CALLER;
-            if (!gCtrlBlock->getObserver())
-                return SCI_ERR_MODE;
-            else
-                *p = gCtrlBlock->getObserver()->getPollFd();
-            break;
-        case PIPEWRITE_FD:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT)
-                return SCI_ERR_INVALID_CALLER;
-            if (!gCtrlBlock->getObserver())
-                return SCI_ERR_MODE;
-            else
-                *p = gCtrlBlock->getObserver()->getPipeWriteFd();
-            break;
-        case NUM_FILTERS:
-            *p = gCtrlBlock->getFilterList()->numOfFilters();
-            break;
-        case FILTER_IDLIST:
-            gCtrlBlock->getFilterList()->retrieveFilterList(p);
-            break;
-        case AGENT_ID:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getMyHandle();
-            break;
-        case NUM_SUCCESSORS:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getRoutingList()->numOfSuccessor(SCI_GROUP_ALL);
-            break;
-        case SUCCESSOR_IDLIST:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            gCtrlBlock->getRoutingList()->retrieveSuccessorList(SCI_GROUP_ALL, p);
-            break;
-        case HEALTH_STATUS:
-            if (gCtrlBlock->isEnabled()) {
-                *p = 0; // 0 - normal
-            } else {
-                *p = 1; // 1 - exited
-            }
-            break;
-        case AGENT_LEVEL:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getTopology()->getLevel();
-            break;
-        case LISTENER_PORT:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            if (gInitializer->getListener() == NULL)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gInitializer->getListener()->getBindPort();
-            break;
-        case NUM_LISTENER_FDS:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            if (gInitializer->getListener() == NULL)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gInitializer->getListener()->numOfSockFds();
-            break;
-        case LISTENER_FDLIST:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            if (gInitializer->getListener() == NULL)
-                return SCI_ERR_INVALID_CALLER;
-            gInitializer->getListener()->getSockFds(p);
-            break;
-        case PARENT_SOCKFD:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gInitializer->getInStream()->getSocket();
-            break;
-        case NUM_CHILDREN_FDS:
-            *p = gCtrlBlock->numOfChildrenFds();
-            break;
-        case CHILDREN_FDLIST:
-            gCtrlBlock->getChildrenSockfds(p);
-            break;
-        case RECOVER_STATUS:
-            if (gCtrlBlock->allActive()) {
-                *p = 1; 
-            } else {
-                *p = 0; 
-            }
-            break;
-        default:
-            return SCI_ERR_UNKNOWN_INFO;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Error(int err_code, char *err_msg, int msg_size)
-{
-    if ((err_msg == NULL) || (msg_size <= 0)) {
-        return SCI_ERR_NO_MEM;
-    }
-    memset(err_msg, 0, msg_size);
-
-    if (err_code == 0) {
-        strncpy(err_msg, ErrRetMsg[err_code], msg_size);
-        return SCI_SUCCESS;
-    }
-
-    if ((err_code <= -2001) && (err_code >= -2030)){
-        int index = err_code * (-1) % 2000;
-        strncpy(err_msg, ErrRetMsg[index], msg_size);
-        return SCI_SUCCESS;
-    }
-
-    if ((err_code <= -5000) && (err_code >= -5005)){
-        int index = err_code * (-1) % 5000;
-        strncpy(err_msg, ErrRetMsg[index + 31], msg_size);
-        return SCI_SUCCESS;
-    }
-
-    return SCI_ERR_MSG;
-
-}
-
-int SCI_Query_errchildren(int *num, int **id_list)
-{
-    return gCtrlBlock->getErrChildren(num, id_list);
-}
-
-// Communication
-
-int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (group > SCI_GROUP_ALL) {
-        if (!gCtrlBlock->getTopology()->hasBE((int)group))
-            return SCI_ERR_GROUP_NOTFOUND;
-    } else {
-        if (!gCtrlBlock->getRoutingList()->isGroupExist(group))
-            return SCI_ERR_GROUP_NOTFOUND;
-    }
-
-    int rc = SCI_SUCCESS;
-    rc = gCtrlBlock->checkChildHealthState();
-    if (rc != SCI_SUCCESS)
-        return rc;
-
-    try {
-        Message *msg = new Message();
-        msg->build(filter_id, group, num_bufs, (char **)bufs, sizes, Message::COMMAND);
-        log_debug("Produced a message bcast command, message group=%d, message size=%d",
-            (int) group, msg->getContentLen());
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        rc = SCI_ERR_NO_MEM;
-    }
-  
-    return rc;
-}
-
-int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if ((gCtrlBlock->getMyRole() != CtrlBlock::BACK_END)
-            && (gCtrlBlock->getMyRole() != CtrlBlock::BACK_AGENT))
-        return SCI_ERR_INVALID_CALLER;
-
-    try {
-        Message *msg = new Message();
-        msg->build(filter_id, group, num_bufs, (char **)bufs, sizes, Message::DATA);
-        gCtrlBlock->getUpQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Poll(int timeout)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT)
-        return SCI_ERR_INVALID_CALLER;
-
-    sci_mode_t mode;
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END)
-        mode = gCtrlBlock->getEndInfo()->fe_info.mode;
-    else
-        mode = gCtrlBlock->getEndInfo()->be_info.mode;
-    if (mode != SCI_POLLING)
-        return SCI_ERR_MODE;
-/*
-    if (gCtrlBlock->getPollQueue()->getSize() == 0) {
-        // no messages in the polling queue
-        // TODO
-        return SCI_ERR_POLL_INVALID;
-    }
-*/
-    int rc = SCI_SUCCESS;
-    rc = gCtrlBlock->checkChildHealthState();
-    if (rc != SCI_SUCCESS)
-        return rc;
-
-    Message *msg = gCtrlBlock->getPollQueue()->consume(timeout);
-    if (msg) {
-        switch(msg->getType()) {
-            case Message::COMMAND:
-            case Message::DATA:
-                try {
-                    gHndlr(gParam, msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-                } catch (...) {
-                    // TODO
-                }
-
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            case Message::INVALID_POLL:
-                rc = SCI_ERR_POLL_INVALID;
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            case Message::SOCKET_BROKEN:
-                rc = SCI_ERR_CHILD_BROKEN;
-                log_debug("SCI_Poll: received msg SOCKET_BROKEN");
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            case Message::ERROR_DATA:
-                rc = SCI_ERR_DATA;
-                log_debug("SCI_Poll: received msg ERROR_DATA");
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            case Message::ERROR_THREAD:
-                rc = SCI_ERR_THREAD;
-                log_debug("SCI_Poll: received msg ERROR_THREAD");
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            default:
-                rc = SCI_ERR_UNKNOWN_INFO;
-                log_error("SCI_Poll: received unknown command");
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-        }
-
-        gCtrlBlock->getPollQueue()->remove();
-    } else {
-        rc = SCI_ERR_POLL_TIMEOUT;
-    }
-
-    return rc;
-}
-
-// Group
-
-int SCI_Group_create(int num_bes, int * be_list, sci_group_t * group)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    assert(be_list);
-    for (int i=0; i<num_bes; i++) {
-        if (!gCtrlBlock->getTopology()->hasBE(be_list[i]))
-            return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt(num_bes);
-        for (int i=0; i<num_bes; i++) {
-            packer.packInt(be_list[i]);
-        }
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(group);
-        msg->build(SCI_FILTER_NULL, *group, 1, bufs, sizes, Message::GROUP_CREATE, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_free(sci_group_t group)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (group>=SCI_GROUP_ALL)
-        return SCI_ERR_GROUP_PREDEFINED;
-
-    if (!gCtrlBlock->getRoutingList()->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, group, 0, NULL, NULL, Message::GROUP_FREE, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_operate(sci_group_t group1, sci_group_t group2,
-        sci_op_t op, sci_group_t *newgroup)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gCtrlBlock->getRoutingList()->isGroupExist(group1))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    if (!gCtrlBlock->getRoutingList()->isGroupExist(group2))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    if ((op!=SCI_UNION) && (op!=SCI_INTERSECTION) && (op!=SCI_DIFFERENCE))
-        return SCI_ERR_INVALID_OPERATOR;
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt((int) op);
-        packer.packInt((int) group1);
-        packer.packInt((int) group2);
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(newgroup);
-        msg->build(SCI_FILTER_NULL, *newgroup, 1, bufs, sizes, Message::GROUP_OPERATE, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_operate_ext(sci_group_t group, int num_bes, int *be_list, 
-        sci_op_t op, sci_group_t *newgroup)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gCtrlBlock->getRoutingList()->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    assert(be_list);
-    for (int i=0; i<num_bes; i++) {
-        if (!gCtrlBlock->getTopology()->hasBE(be_list[i]))
-            return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt((int) op);
-        packer.packInt((int) group);
-        packer.packInt(num_bes);
-        for (int i=0; i<num_bes; i++) {
-            packer.packInt(be_list[i]);
-        }
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(newgroup);
-        msg->build(SCI_FILTER_NULL, *newgroup, 1, bufs, sizes, Message::GROUP_OPERATE_EXT, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gCtrlBlock->getRoutingList()->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    switch(query) 
-    {
-        case GROUP_MEMBER_NUM:
-            *((int *) ret_val) = gCtrlBlock->getRoutingList()->numOfBE(group);
-            break;
-        case GROUP_MEMBER:
-            gCtrlBlock->getRoutingList()->retrieveBEList(group, (int *) ret_val);
-            break;
-        case GROUP_SUCCESSOR_NUM:
-            *((int *) ret_val) = gCtrlBlock->getRoutingList()->numOfSuccessor(group);
-            break;
-        case GROUP_SUCCESSOR:
-            gCtrlBlock->getRoutingList()->retrieveSuccessorList(group, (int *) ret_val);
-            break;
-        default:
-            return SCI_ERR_UNKNOWN_INFO;
-    }
-    
-    return SCI_SUCCESS;
-}
-
-
-// Filter
-
-int SCI_Filter_load(sci_filter_info_t *filter_info) 
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    assert(filter_info);
-    if (filter_info->filter_id == SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_PREDEFINED;
-
-    if (filter_info->filter_id < SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_ID;
-
-    int msgID;
-    try {
-        Filter *filter = new Filter(*filter_info);
-        Message *msg = filter->packMsg();
-        msgID = gNotifier->allocate();
-        msg->setID(msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Filter_unload(int filter_id)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-    
-    if (filter_id == SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_PREDEFINED;
-
-    if (filter_id < SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_ID;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(filter_id, SCI_GROUP_ALL, 0, NULL, NULL, Message::FILTER_UNLOAD, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Filter_bcast(int filter_id, int num_successors, int * successor_list, int num_bufs, 
-        void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        return SCI_ERR_INVALID_CALLER;
-    }
-
-    for (int i=0; i<num_successors; i++) {
-        if (!gCtrlBlock->getRoutingList()->isSuccessorExist(successor_list[i]))
-            return SCI_ERR_INVALID_SUCCESSOR;
-    }
-
-    try {
-        Message *msg = new Message();
-        int nextFilterID = filter_id;
-        if (filter_id == SCI_FILTER_NULL) {
-            nextFilterID = gCtrlBlock->getRouterProcessor()->getCurFilterID();
-        }
-        sci_group_t curGroup = gCtrlBlock->getRouterProcessor()->getCurGroup();
-        msg->build(nextFilterID, curGroup, num_bufs, (char **)bufs, sizes, Message::COMMAND);
-        msg->setRefCount(num_successors);
-        gCtrlBlock->getRoutingList()->mcast(msg, successor_list, num_successors);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        return SCI_ERR_INVALID_CALLER;
-    }
-
-    try {
-        Filter *filter = NULL;
-        if (filter_id != SCI_FILTER_NULL) {
-            filter = gCtrlBlock->getFilterList()->getFilter(filter_id);
-        }
-        int curFilterID = gCtrlBlock->getFilterProcessor()->getCurFilterID();
-        Message *msg = new Message();
-        msg->build(curFilterID, group, num_bufs, (char **)bufs, sizes, Message::DATA);
-        if (filter) {
-            filter->input(group, msg->getContentBuf(), msg->getContentLen());
-            delete msg;
-        } else {    
-            gCtrlBlock->getFilterProcessor()->deliever(msg);
-        }
-    } catch (Exception &e) {
-        return SCI_ERR_EXCEPTION;
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-// Dynamic Back End
-
-int SCI_BE_add(sci_be_t *be)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (be->id >= 0) { // user-assigned back end id
-        if (gCtrlBlock->getTopology()->hasBE(be->id)) 
-            return SCI_ERR_BACKEND_EXISTED;
-    } else { // SCI allocated back end id
-        gAllocator->allocateBE(&(be->id));
-    }
-
-    int msgID;
-    try {
-        Packer packer; 
-        packer.packStr(be->hostname);
-        packer.packInt(be->level);
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, (sci_group_t) (be->id), 1, bufs, sizes, Message::BE_ADD, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_BE_remove(int be_id)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-    
-    if (!gCtrlBlock->getTopology()->hasBE(be_id)) 
-        return SCI_ERR_BACKEND_NOTFOUND;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, (sci_group_t) be_id, 0, NULL, NULL, Message::BE_REMOVE, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp
deleted file mode 100644
index 5f551a7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp
+++ /dev/null
@@ -1,141 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Atomic operations
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/01/09 nieyy        Initial code (From LAPI)
-
-****************************************************************************/
-
-#ifndef _ATOMIC_HPP
-#define _ATOMIC_HPP
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <assert.h>
-#include <pthread.h>
-
-#if defined(_SCI_LINUX) // Linux
-
-/**********************************************************************
- *
- *  Atomic operations
- *
- **********************************************************************/
-typedef int          *atomic_p;
-typedef long long   *atomic_l;
-typedef int          boolean_t;
-typedef unsigned int uint;
-
-#ifdef POWER_ARCH
-
-/*
-  For Power architecture, isync is only necessary when entering a 
-  critical section to discard any instruction prefetch and possible
-  execution on stale data. 
-
-  It's handy to put it in _check_lock but not other routines.
-*/
-
-static __inline__ 
-int fetch_and_add(atomic_p dest, int val)
-{
-    int old, sum;
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]      \n\t"
-            "   add     %[sum], %[old], %[val]  \n\t"
-            "   stwcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-#endif /* POWER_ARCH */
-
-#ifdef INTEL_ARCH
-/*
- Note: Inlining cmpxchg2 doesn't generate
-       correct code!
- */
-static //__inline__ 
-boolean_t cmpxchg2(atomic_p dest, int comp, int exch)
-{
-    unsigned int old;
-    __asm__ __volatile__(
-        "lock; cmpxchgl %[exch], %[dest]"
-        : [dest] "=m" (*dest), "=a" (old)
-        : [exch] "r" (exch), "m"  (*dest), "a"  (comp)
-        : "memory" );
-    return (old == comp);
-}
-
-static __inline__ 
-int fetch_and_add(atomic_p ptr, int val)
-{
-    int prev;
-    do prev = *ptr;
-    while (!cmpxchg2(ptr, prev, (prev+val)));
-    return prev;
-}
-
-#endif /* INTEL_ARCH */
-
-#elif defined(__APPLE__)
-#include <libkern/OSAtomic.h>
-typedef int *atomic_p;
-
-/*
- * We need to implement fetch_and_add using a
- * splinlock as the OSAtomicAdd functions return
- * the new value, not the old value.
- */
-static __inline__
-int fetch_and_add(atomic_p ptr, int val) {
-    int old_val;
-    OSSpinLock lock = 0;
-    OSSpinLockLock(&lock);
-    old_val = *ptr;
-    *ptr += val;
-    OSSpinLockUnlock(&lock);
-    return old_val;
-}
-
-#else // AIX
-
-#include <sys/atomic_op.h>
-
-#endif
-
-static int decRefCount(int &refCount)
-{
-    int count = fetch_and_add(&refCount, -1);
-    return (count - 1);
-}
-
-static int incRefCount(int &refCount)
-{
-    int count = fetch_and_add(&refCount, 1);
-    return (count + 1);
-}
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/bemap.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/bemap.cpp
deleted file mode 100644
index 34be9b5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/bemap.cpp
+++ /dev/null
@@ -1,504 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
- * Copyright (c) 2008, 2010 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0s
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
-
-Classes: BEMap
-
-Description: Runtime BEMap. 
-
-Author: ronglli 
-
-History:
-Date     Who ID    Description
--------- --- ---   -----------
-08/24/12 ronglli        Initial code
-
- ****************************************************************************/
-
-#include <stdlib.h>
-#include <regex.h>
-#include <fstream>
-
-#include "sci.h"
-#include "bemap.hpp"
-#include "log.hpp"
-
-#define BEMAP_SUCCESS 0
-#define BEMAP_ERROR -1
-#define BEMAP_FULL   (-999999)
-
-#define VALID_REGEX "^[^][%*]*(\\[[0-9]+-[0-9]+(:[0-9]+)?\\]){0,}[^][%*]*([*][0-9]+)?(%\\[(([0-9]+,){0,}[0-9]+|[0-9]+-[0-9]+(:[0-9]+)?)\\])?$"
-
-int BEMap::input(const char *hostlist[], int num)
-{
-    int i = 0;
-
-    while (hostlist[i] != NULL) {
-        if ((num > 0) && (i >= num)) {
-            break;
-        }
-        (*this)[i] = hostlist[i];
-        i++;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int BEMap::input(const char * filename, int num)
-{
-    int rc = -1;
-    ifstream fs;
-    string line;
-    size_t pos = -1;
-    int max_id, size;
-
-    fs.open(filename);
-    if (!fs) {
-        return SCI_ERR_INVALID_HOSTFILE;;
-    }
-
-    clear_lineinfo();
-    (*this).first_empty = 0;
-
-    log_debug("Hostlist is: ");
-    while(fs) {
-        if ((num > 0) && ((*this).size() >= num)) {
-            break;
-        }
-        getline(fs, line);
-        trim_whitespace(line);
-        if (line.length() == 0) {
-            continue;
-        }
-        if ((line.find_first_of('!') == 0) || (line.find_first_of('*') == 0)) {
-            continue;
-        }
-
-        rc = isValidForm(line, VALID_REGEX);
-        if (rc) {
-            return SCI_ERR_INVALID_HOSTFILE;
-        }
-
-        rc = expand_line(line, num);
-        if (rc == BEMAP_FULL) { 
-            break;
-        } else if (rc != BEMAP_SUCCESS){
-            return SCI_ERR_INVALID_HOSTFILE;
-        }
-
-        clear_lineinfo();
-    }
-    fs.close();
-  
-    size = (*this).size(); 
-    if (size == 0) {
-        log_error("BEMap error: empty host file.");
-        return SCI_ERR_INVALID_HOSTFILE;
-    } 
-
-    max_id = ((*this).rbegin())->first;
-    if (max_id >= size) {
-        log_error("BEMap error: max_id(%d) needs to be smaller than the totalsize(%d)", 
-                max_id, size);
-        return SCI_ERR_INVALID_HOSTFILE;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int BEMap::trim_whitespace(string & line)
-{
-    string::iterator it;
-    for (it = line.begin(); it != line.end();) {
-        if (isspace(*it))
-            it = line.erase(it);
-        else
-            it++;
-    }
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::isValidForm(string line, const char * regex)
-{
-    int rc = BEMAP_SUCCESS;
-    regex_t preg;
-
-    if((line.find_first_of('[') == string::npos) && (line.find_first_of('*') == string::npos)) {
-        if((line.find_first_of('%') == string::npos) && (line.find_first_of(':') == string::npos))
-            return rc;
-    }
-
-    rc = regcomp(&preg, regex, REG_EXTENDED|REG_NOSUB|REG_NEWLINE);
-    if(rc != 0) {
-        log_error("regcomp error, line:%s, rc = %d", line.c_str(), rc);
-        return BEMAP_ERROR;
-    }
-
-    rc = regexec(&preg, line.c_str(), 0, 0, 0);
-    if(rc != 0) {
-        log_error("regex NOT match, line:%s, rc = %d", line.c_str(), rc);
-        return BEMAP_ERROR;
-    }
-    return rc;
-}
-
-int BEMap::generate_host_range()
-{
-    if (hostinfo.range_begin == -1) {
-        hostinfo.host_cnt = hostinfo.repetition;
-    } else {
-        int begin;
-        begin = hostinfo.range_begin;
-        while (begin <= hostinfo.range_end) {
-            hostinfo.expanded_range.push_back(begin);
-            hostinfo.host_cnt++;
-            begin += hostinfo.stride;
-        }
-        hostinfo.host_cnt *= hostinfo.repetition;
-    }
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::generate_host_entries()
-{
-    int i;
-    if (hostinfo.expanded_range.empty()) {
-        for (i = 0; i < hostinfo.repetition; i++) {
-            hostinfo.host_entries.push_back(hostinfo.front + hostinfo.end);
-        }
-    } else {
-        INT_VEC::iterator iter;
-        char buf[128], format[32];
-        sprintf(format, "%%0%dd%", hostinfo.range_digits);
-        for (iter = hostinfo.expanded_range.begin(); iter != hostinfo.expanded_range.end(); iter++) {
-            for (i = 0; i < hostinfo.repetition; i++) {
-                sprintf(buf, format, *iter);
-                hostinfo.host_entries.push_back(hostinfo.front + buf + hostinfo.end);
-            }
-        }
-    }
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::expand_host_range(string range)
-{
-    int pos = -1;
-    int pos1 = -1;
-    string tmps;
-
-    pos = range.find_first_of('-');
-    tmps = range.substr(0, pos);
-    hostinfo.range_begin = atoi(tmps.c_str());
-    hostinfo.range_digits = tmps.size();
-
-    pos1 = range.find_first_of(':', pos+1);
-    if (pos1 == string::npos) {
-        tmps = range.substr(pos+1);
-        hostinfo.range_end = atoi(tmps.c_str());
-        hostinfo.stride = 1;
-    } else {
-        tmps = range.substr(pos+1, pos1-pos-1);
-        hostinfo.range_end = atoi(tmps.c_str());
-        tmps = range.substr(pos1+1);
-        hostinfo.stride = atoi(tmps.c_str());
-        if (hostinfo.stride <= 0) {
-            log_error("stride is %d, it must >= 1", hostinfo.stride);
-            return BEMAP_ERROR;
-        }
-    }
-
-    if ((hostinfo.range_begin < 0) || hostinfo.range_end < 0) {
-        log_error("host part: both left side(%d) & right side(%d) of a range must >= 0", 
-                hostinfo.range_begin, hostinfo.range_end);
-        return BEMAP_ERROR;
-    }
-    if (hostinfo.range_end < hostinfo.range_begin) {
-        log_error("host part: right side(%d) of a range must >= left side (%d) of a range",
-                hostinfo.range_end, hostinfo.range_begin);
-        return BEMAP_ERROR;
-    }
-
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::expand_host_region(string hregion)
-{
-    int rc = BEMAP_SUCCESS;
-    int pos = -1;
-    int left = -1;
-    int right = -1;
-
-    pos = hregion.find_first_of('*');
-    if (pos == string::npos) {
-        hostinfo.repetition = 1;
-    } else {
-        string tmps = hregion.substr(pos+1);
-        hostinfo.repetition = atoi(tmps.c_str());
-    }
-
-    if (hostinfo.repetition <= 0) {
-        log_error("repetition(%d) of hosts must >= 1", hostinfo.repetition);
-        return BEMAP_ERROR;
-    }
-
-    left = hregion.find_first_of('[');
-    right = hregion.find_first_of(']');
-
-    if ((left == string::npos) && (right == string::npos)) {
-        hostinfo.front = hregion.substr(0, pos);
-        hostinfo.end = "";
-        hostinfo.stride = 1;
-        hostinfo.range_begin = -1;
-        hostinfo.range_end = -1;
-    } else {
-        if ((left == string::npos) || (right == string::npos)) {
-            return BEMAP_ERROR;
-        }
-        hostinfo.front = hregion.substr(0, left);
-        if (pos == string::npos) {
-            hostinfo.end = hregion.substr(right+1);
-        } else {
-            hostinfo.end = hregion.substr(right+1, pos-right-1);
-        }
-        string range = hregion.substr(left+1, right-left-1);
-        rc = expand_host_range(range);
-        if (rc != 0) {
-            return BEMAP_ERROR;
-        }
-    }
-
-    generate_host_range();
-    generate_host_entries();
-
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::generate_task_range()
-{
-    if (taskinfo.range_begin == -1) {
-        taskinfo.task_cnt = taskinfo.free_form.size();
-    } else {
-        int begin;
-        begin = taskinfo.range_begin;
-        while(begin <= taskinfo.range_end) {
-            taskinfo.free_form.push_back(begin);
-            taskinfo.task_cnt++;
-            begin += taskinfo.stride;
-        }
-    }
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::expand_task_region(string tregion)
-{
-    int left = -1;
-    int right = -1;
-    int pos = -1;
-    int pos1 = -1;
-    string tmps;
-
-    left = tregion.find_first_of('[');
-    right = tregion.find_first_of(']');
-    if ((left == string::npos) || (right == string::npos)) {
-        log_error("task region: it must start with '[' and end with ']'");
-        return BEMAP_ERROR;
-    }
-
-    pos = tregion.find_first_of('-');
-    if (pos != string::npos) {
-        if ((pos < left) || (pos > right)) {
-            log_error("task region: the '-' must be between the '[' and ']'");
-            return BEMAP_ERROR;
-        }
-        tmps = tregion.substr(left+1, pos-left-1);
-        taskinfo.range_begin = atoi(tmps.c_str());
-        pos1 = tregion.find_first_of(':', pos+1);
-        if (pos1 == string::npos) {
-            tmps = tregion.substr(pos+1, right-pos-1);
-            taskinfo.range_end = atoi(tmps.c_str());
-            taskinfo.stride = 1;
-        } else {
-            tmps = tregion.substr(pos+1, pos1-pos-1);
-            taskinfo.range_end = atoi(tmps.c_str());
-            tmps = tregion.substr(pos1+1, right-pos1-1);
-            taskinfo.stride = atoi(tmps.c_str());
-
-            if (taskinfo.stride <= 0) {
-                log_error("task part: stride = %d, it must >= 1", taskinfo.stride);
-                return BEMAP_ERROR;
-            }
-
-            if ((taskinfo.range_begin < 0) || (taskinfo.range_end < 0)) {
-                log_error("task part: both sides of the range(%d, %d) must >=0", 
-                        taskinfo.range_begin, taskinfo.range_end);
-                return BEMAP_ERROR;
-            }
-
-            if (taskinfo.range_end < taskinfo.range_begin) {
-                log_error("task part: right side(%d) of a range must >= left side(%d) of a range",
-                        taskinfo.range_end, taskinfo.range_begin);
-                return BEMAP_ERROR;
-            }
-        }
-    } else {
-        int tid;
-        int start = left;
-
-        pos1 = tregion.find_first_of(',');
-        if (pos1 != string::npos) {
-            do {
-                tmps = tregion.substr(start+1, pos1-start-1);
-                tid = atoi(tmps.c_str());
-                taskinfo.free_form.push_back(tid);
-                start = pos1;
-                pos1 = tregion.find_first_of(',', pos1+1);
-            } while (pos1 != string::npos);
-        }
-        tmps = tregion.substr(start+1, right-left-1);
-        tid = atoi(tmps.c_str());
-        taskinfo.free_form.push_back(tid);
-    }
-
-    if (generate_task_range() != 0) {
-        return BEMAP_ERROR;
-    }
-
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::update_mapping(int num)
-{
-    INT_VEC::iterator t_iter;
-    STRING_VEC::iterator h_iter;
-
-    if (taskinfo.task_cnt > 0) {
-        t_iter = taskinfo.free_form.begin();
-        h_iter = hostinfo.host_entries.begin();
-        for (; t_iter != taskinfo.free_form.end(); t_iter++, h_iter++) {
-            if (*t_iter < 0) {
-                log_error("task id(%d) must >= 0", *t_iter);
-                return BEMAP_ERROR;
-            }
-
-            if ((*this).find(*t_iter) != (*this).end()) {
-                log_error("error: duplicated task id(%d) for one job", *t_iter);
-                return BEMAP_ERROR;
-            }
-            if ((num > 0) && ((*this).size() >= num)) {
-                return BEMAP_FULL;
-            }
-            (*this)[*t_iter] = *h_iter;
-            log_debug("[%d]: %s", *t_iter, (*h_iter).c_str());
-        }
-    } else {
-        for (h_iter = hostinfo.host_entries.begin(); h_iter != hostinfo.host_entries.end(); h_iter++) {
-            int index; 
-            bool found = false;
-            int max_id;
-            int size = (*this).size();
-            
-            if ((num > 0) && (size >= num)) {
-                return BEMAP_FULL;
-            }
-            if (size > 0) {
-                max_id = ((*this).rbegin())->first;
-                for (index = (*this).first_empty; index < max_id; index++) {
-                    if ((*this).find(index) == (*this).end()) {
-                        found = true;
-                        (*this).first_empty = index + 1;
-                        break;
-                    }
-                }
-                if (!found) {
-                    index = max_id + 1;
-                }
-            } else {
-                index = 0;
-                (*this).first_empty = index + 1;
-            }
-            (*this)[index] = *h_iter;
-            log_debug("[%d]: %s", index, (*h_iter).c_str());
-        }
-    }
-
-    return BEMAP_SUCCESS;
-}
-
-int BEMap::expand_line(string line, int num)
-{
-    int rc = BEMAP_SUCCESS;
-    int pos = -1;
-    string host_region;
-    string task_region;
-
-    pos = line.find_first_of('%');
-    if (pos != string::npos) {
-        host_region = line.substr(0, pos);
-        task_region = line.substr(pos+1);
-    } else {
-        host_region = line;
-    }
-
-    rc = expand_host_region(host_region);
-    if (rc != 0) {
-        return BEMAP_ERROR;
-    }
-    if (pos != string::npos) {
-        rc = expand_task_region(task_region);
-        if (rc != 0) {
-            return BEMAP_ERROR;
-        }
-    }
-
-    if (taskinfo.task_cnt > 0) {
-        if (hostinfo.host_cnt != taskinfo.task_cnt) {
-            log_error("host count(%d) and task count(%d) not match, current line:%s", 
-                    hostinfo.host_cnt, taskinfo.task_cnt, line.c_str());
-            return BEMAP_ERROR;
-        }
-    }
-    rc = update_mapping(num);
-
-    return rc;
-}
-
-int BEMap::clear_lineinfo()
-{
-    hostinfo.front.clear();
-    hostinfo.end.clear();
-    hostinfo.host_cnt = 0;
-    hostinfo.repetition = 1;
-    hostinfo.stride = 1;
-    hostinfo.range_begin = -1;
-    hostinfo.range_end = -1;
-    hostinfo.range_digits = -1;
-    hostinfo.expanded_range.clear();
-    hostinfo.host_entries.clear();
-
-    taskinfo.task_cnt = 0;
-    taskinfo.free_form.clear();
-    taskinfo.range_begin = -1;
-    taskinfo.range_end = -1;
-    taskinfo.stride = 1;
-
-    return BEMAP_SUCCESS;
-}
-
-void BEMap::dump_mappings()
-{
-    BEMap::iterator iter = (*this).begin();
-
-    log_debug("Hostlist is: ");
-    for (; iter != (*this).end(); iter++) {
-        log_debug("[%d]: %s", iter->first, iter->second.c_str());
-    }
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/bemap.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/bemap.hpp
deleted file mode 100644
index 3b01ce6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/bemap.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: BEMap
-
- Description: Runtime BEMap 
-   
- Author: ronglli 
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   08/24/12 ronglli   Initial code 
-
-****************************************************************************/
-
-#ifndef _BEMAP_HPP
-#define _BEMAP_HPP
-
-#include <map>
-#include <string>
-#include <vector>
-
-using namespace std;
-
-typedef vector<int> INT_VEC;
-typedef vector<string> STRING_VEC;
-
-typedef struct _host_info
-{
-    int host_cnt;           /* # of host entries in current line */
-    string front;      /* string before [..] */
-    string end;        // string after [..]
-    INT_VEC expanded_range;  //expanded range of inside [..]
-    int repetition;         // repetition count after '*'
-    int stride;             //stride after a range
-    int range_begin, range_end, range_digits;
-    STRING_VEC host_entries;
-} host_info;
-
-typedef struct _task_info
-{
-    int task_cnt;
-    INT_VEC free_form;
-    int range_begin, range_end;
-    int stride;
-} task_info;
-
-class BEMap : public map<int, string>
-{
-    private:
-        host_info hostinfo; // hostinfo for the current line
-        task_info taskinfo; // taskinfo for the current line
-        int first_empty;
-
-    public:
-        int input(const char * filename, int num);
-        int input(const char *hostlist[], int num);
-
-        int trim_whitespace(string & line);
-        int isValidForm(string line, const char * regex);
-   
-        int generate_host_range();
-        int generate_host_entries();
-        int expand_host_range(string range);
-        int expand_host_region(string hregion);
-    
-        int generate_task_range();
-        int expand_task_region(string tregion);
-        int update_mapping(int num);
-        void dump_mappings();
-        int clear_lineinfo();
-        int expand_line(string line, int num);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp
deleted file mode 100644
index 9bc89d1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp
+++ /dev/null
@@ -1,958 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: CtrlBlock
-
- Description: Internal running information management (Note: STL does not 
-              guarantee the safety of several readers & one writer cowork 
-              together, and user threads can query group information at 
-              runtime, so it's necessary to add a lock to protect these 
-              read & write operations).
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-   11/27/10 ronglli      Add SCI Version
-   01/16/12 ronglli      Add codes to detect SOCKET_BROKEN
-   07/19/12 ronglli      Optimize the user query 
-
-****************************************************************************/
-
-#include "ctrlblock.hpp"
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <errno.h>
-
-#include "stream.hpp"
-#include "exception.hpp"
-#include "group.hpp"
-#include "log.hpp"
-#include "tools.hpp"
-#include "packer.hpp"
-
-#include "eventntf.hpp"
-#include "handlerproc.hpp"
-#include "embedagent.hpp"
-#include "purifierproc.hpp"
-#include "topology.hpp"
-#include "routinglist.hpp"
-#include "privatedata.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "listener.hpp"
-#include "processor.hpp"
-#include "routerproc.hpp"
-#include "filterproc.hpp"
-#include "observer.hpp"
-#include "initializer.hpp"
-
-const long long FLOWCTL_THRESHOLD = 1024 * 1024 * 128LL;
-
-CtrlBlock * CtrlBlock::instance = NULL;
-extern SCI_msg_hndlr *gHndlr;
-extern void *gParam;
-
-CtrlBlock::CtrlBlock()
-    : role(INVALID)
-{
-    char *envp = NULL;
-    version = SCI_VERSION;
-    userName = "";
-    flowctlState = true;
-    childHealthState = HEALTH;
-    errChildren.clear();
-    cnt_disable = 0;
-
-    endInfo = NULL;
-    
-    routerProc = NULL;
-    filterProc = NULL;
-    purifierProc = NULL;
-    handlerProc = NULL;
-    observer = NULL;
-
-    routerInQueue = NULL;
-    filterInQueue = NULL;
-    filterOutQueue = NULL;
-    purifierOutQueue = NULL;
-    upQueue = NULL;
-    pollQueue = NULL;
-    monitorInQueue = NULL;
-    errorQueue = NULL;
-    termState = false; // enter into term state
-    recoverMode = 0; 
-    waitParentInfo = false; //whether to wait for parent info updating
-
-    parentStream = NULL;
-    embedAgents.clear();
-    enableID = gNotifier->allocate();
-
-    // flow control threshold
-    thresHold = FLOWCTL_THRESHOLD;
-    envp = getenv("SCI_FLOWCTL_THRESHOLD");
-    if(envp != NULL) {
-        thresHold = ::atoll(envp);
-    } 
-
-    envp = ::getenv("SCI_DISABLE_IPV6");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        Socket::setDisableIPv6(1);
-    }
-    envp = ::getenv("SCI_CONNECT_TIMES");
-    if (envp != NULL) {
-        int cnt = ::atoi(envp);
-        if (cnt > 0) {
-            Socket::setConnTimes(cnt);
-        }
-    }
-
-    ::pthread_mutex_init(&mtx, NULL); 
-}
-
-CtrlBlock::~CtrlBlock()
-{
-    instance = NULL;
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void CtrlBlock::setRecoverMode(int mo)
-{
-    recoverMode = mo;
-}
-
-int CtrlBlock::getRecoverMode()
-{
-    return recoverMode;
-}
-
-void CtrlBlock::setTermState(bool mo)
-{
-    termState = mo;
-}
-
-bool CtrlBlock::getTermState()
-{
-    return termState;
-}
-
-void CtrlBlock::setParentInfoWaitState(bool mo)
-{
-    waitParentInfo = mo;
-}
-
-bool CtrlBlock::getParentInfoWaitState()
-{
-    return waitParentInfo;
-}
-
-CtrlBlock::ROLE CtrlBlock::getMyRole() 
-{
-    return role; 
-}
-
-void CtrlBlock::setMyRole(CtrlBlock::ROLE ro) 
-{
-    role = ro; 
-}
-
-int CtrlBlock::getMyHandle() 
-{ 
-    return handle; 
-}
-
-void CtrlBlock::setMyHandle(int hndl) 
-{ 
-    handle = hndl;
-}
-
-int CtrlBlock::getMyEmbedHandle() 
-{ 
-    return embed_handle; 
-}
-
-void CtrlBlock::setMyEmbedHandle(int hndl) 
-{ 
-    embed_handle = hndl;
-}
-
-sci_info_t * CtrlBlock::getEndInfo() 
-{ 
-    return endInfo; 
-}
-
-int CtrlBlock::getJobKey() 
-{ 
-    return jobKey; 
-}
-
-void CtrlBlock::setJobKey(int key) 
-{ 
-    jobKey = key;
-}
-
-int CtrlBlock::initClient(ROLE ro)
-{
-	char *envp = ::getenv("SCI_JOB_KEY");
-	if (envp != NULL)
-		jobKey = ::atoi(envp);
-	envp = ::getenv("SCI_CLIENT_ID");
-	if (envp != NULL)
-		handle = ::atoi(envp);
-	role = ro;
-
-	return 0;
-}
-
-int CtrlBlock::init(sci_info_t * info)
-{
-    char *envp = NULL;
-
-    if (info == NULL) {
-        initClient(AGENT);
-        return SCI_SUCCESS;
-    } 
-    if ((info->sci_version != 0) && (info->sci_version != version)) {
-        return SCI_ERR_VERSION;
-    }
-
-    if (info->disable_sshauth == 1) { 
-        ::setenv("SCI_ENABLE_SSHAUTH", "no", 1);
-    }
-
-    if (info->enable_recover == 1) { 
-        recoverMode = 1; 
-    }
-
-    endInfo = (sci_info_t *) ::malloc(sizeof(sci_info_t));
-    if (NULL == endInfo) {
-        return SCI_ERR_NO_MEM;
-    }
-    ::memset(endInfo, 0, sizeof(sci_info_t));
-    ::memcpy(endInfo, info, sizeof(sci_info_t));
-    gHndlr = info->be_info.hndlr;
-    gParam = info->be_info.param;
-
-    switch (info->type) {
-        case SCI_FRONT_END:
-            handle = -1;
-            role = FRONT_END;
-            envp = ::getenv("SCI_JOB_KEY");
-            if (envp) {
-                // use user's job key
-                jobKey = ::atoi(envp);
-            } else {
-                // generate a random job key
-                ::srand((unsigned int) ::time(NULL));
-                jobKey = ::rand();
-            }
-            break;
-        case SCI_BACK_END:
-			initClient(BACK_END);
-            break;
-        default:
-            return SCI_ERR_INVALID_ENDTYPE;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int CtrlBlock::numOfChildrenFds()
-{
-    int num = 0;
-    RoutingList *rtList = NULL;
-/*
-    if (purifierProc) {
-        while (!purifierProc->isLaunched()) {
-            // before join, this thread should have been launched
-            SysUtil::sleep(WAIT_INTERVAL);
-        } 
-    } */
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        num += rtList->numOfStreams();
-    }
-    unlock();
-
-    return num;
-}
-
-int CtrlBlock::getChildrenSockfds(int *fds)
-{
-    int pos = 0;
-    RoutingList *rtList = NULL;
-/*
-    if (purifierProc) {
-        while (!purifierProc->isLaunched()) {
-            // before join, this thread should have been launched
-            SysUtil::sleep(WAIT_INTERVAL);
-        } 
-    } */
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        pos += rtList->getStreamsSockfds(&fds[pos]);
-    }
-    unlock();
-
-    return pos;
-}
-
-bool CtrlBlock::allRouted()
-{
-    bool flag = false;
-    int streams = 0;
-    int queues = 0;
-
-    RoutingList *rtList = NULL;
-
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        streams += rtList->numOfStreams();
-        queues += rtList->numOfQueues();
-    }
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT) {
-        flag = (queues == (streams + embedAgents.size())); // queueInfo contains the embed agent itself
-    } else {
-        flag = (queues == streams);
-    }
-    unlock();
-
-    return flag;
-}
-
-int CtrlBlock::isActiveSockfd(int fd)
-{
-    int isSocket = 0;
-    RoutingList *rtList = NULL;
-    
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        isSocket = rtList->isActiveSockfd(fd);
-        if (isSocket)
-            break;
-    }
-    Stream * s = gInitializer->getInStream();
-    if ((s != NULL) && (s->getSocket() == fd)) {
-        if ((s->isReadActive()) || (s->isWriteActive())) {
-            isSocket = 1;
-        }
-    }
-    unlock();
-
-    return isSocket;
-}
-
-bool CtrlBlock::allActive()
-{
-    bool active = true;
-    RoutingList *rtList = NULL;
-    
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        active = rtList->allActive();
-        if (!active)
-            break;
-    }
-    unlock();
-
-    return active;
-}
-
-void CtrlBlock::term()
-{
-    gNotifier->freeze(enableID, NULL);
-    termState = true;
-    if (purifierProc) {
-        purifierProc->release();
-        delete purifierProc;
-    }
-    lock();
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        delete it->second;
-    }
-    embedAgents.clear();
-    errChildren.clear();
-    unlock();
-    if (handlerProc) {
-        handlerProc->release();
-        delete handlerProc;
-    }
-    clean();
-}
-
-EmbedAgent * CtrlBlock::getAgent(int hndl)
-{
-    EmbedAgent *agent;
-    lock();
-    assert(embedAgents.find(hndl) != embedAgents.end());
-    agent = embedAgents[hndl];
-    unlock();
-
-    return agent;
-}
-
-void CtrlBlock::clean()
-{
-    routerProc = NULL;
-    filterProc = NULL;
-    purifierProc = NULL;
-
-    routerInQueue = NULL;
-    filterInQueue = NULL;
-    filterOutQueue = NULL;
-    purifierOutQueue = NULL;
-    upQueue = NULL;
-    pollQueue = NULL;
-    monitorInQueue = NULL;
-    errorQueue = NULL;
-
-    parentStream = NULL;
-
-    if (observer != NULL) {
-        delete observer;
-        observer = NULL;
-    }
-
-    role = INVALID;
-    if (endInfo) {
-        ::free(endInfo);
-        endInfo = NULL;
-    }
-}
-
-void CtrlBlock::enable()
-{
-}
-
-void CtrlBlock::disable()
-{
-    if (!isEnabled())
-        return;
-
-    lock();
-    if (getMyRole() == BACK_AGENT) {
-        cnt_disable++;
-        if (cnt_disable < (embedAgents.size() + 1)) {
-            unlock();
-            return;
-        }
-    }
-    unlock();
-    gNotifier->notify(enableID);
-}
-
-bool CtrlBlock::isEnabled() 
-{ 
-    return gNotifier->getState(enableID);
-}
-
-void CtrlBlock::releasePollQueue()
-{
-    // so far, valid for polling mode only
-    assert(role != AGENT);
-    try {
-        if(observer != NULL) {
-            observer->notify();
-        } else {
-            log_error("CtrlBlock: releasePollQueue: observer is NULL");
-        }
-        if(pollQueue != NULL) {
-            Message *msg = new Message(Message::INVALID_POLL);
-            pollQueue->produce(msg);
-        } else {
-            log_error("CtrlBlock: releasePollQueue: pollQueue is NULL");
-        }
-    } catch (Exception &e) {
-        log_error("releasePollQueue: exception %s", e.getErrMsg());
-    } catch (std::bad_alloc) {
-        log_error("releasePollQueue: out of memory");
-    } catch (...) {
-        log_error("releasePollQueue: unknown exception");
-    }
-}
-
-void CtrlBlock::notifyChildHealthState(int hndl, int hState)
-{
-    int num = 0;
-    int *cList = NULL;
-    bool found = false;
-    Message::Type typ = getErrMsgType(hState);
-    if (typ == Message::UNKNOWN)
-        return;
-
-    lock();
-    RoutingList *rtList = NULL;
-    AGENT_MAP::iterator it;
-    for (it = embedAgents.begin(); it != embedAgents.end(); it++) {
-        rtList = it->second->getRoutingList();
-        if (rtList->isSuccessorExist(hndl)) {
-            if (hndl < 0) {
-                num = rtList->numOfBEOfSuccessor(hndl);
-                assert(num);
-                cList = (int *) malloc(num * sizeof(int));
-                rtList->retrieveBEListOfSuccessor(hndl, cList);
-            } else {
-                num = 1;
-                cList = (int *) malloc(sizeof(int));
-                cList[0] = hndl;
-            }
-            found = true;
-            break;
-        }
-    }
-    if (!found) {
-        unlock();
-        return;
-    }
-    assert(cList != NULL);
-
-    try {
-        for (int i = 0; i < num; i++) {
-            errChildren.insert(cList[i]);
-        }
-
-        // if not fe, it should forward the broken msg to its parent
-        if (getMyRole() != FRONT_END) { 
-            Message *msg = new Message();
-            Packer packer;
-            packer.packInt(num);
-            for (int i = 0; i < num; i++) {
-                packer.packInt(cList[i]);
-            }
-
-            char *bufs[1];
-            int sizes[1];
-            bufs[0] = packer.getPackedMsg();
-            sizes[0] = packer.getPackedMsgLen();
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, typ);
-            delete [] bufs[0];
-            getUpQueue()->produce(msg);
-        }
-
-        // so far, valid for polling mode only
-        if (getMyRole() != AGENT) {
-            sci_mode_t mode;
-            if (getMyRole() == FRONT_END)
-                mode = getEndInfo()->fe_info.mode;
-            else
-                mode = getEndInfo()->be_info.mode;
-            if (mode == SCI_POLLING) {
-                observer->notify();
-                Message *msg = new Message(typ);
-                pollQueue->produce(msg);
-            }
-        }
-    } catch (Exception &e) {
-        log_error("notifyChildHealthState: exception %s", e.getErrMsg());
-    } catch (std::bad_alloc) {
-        log_error("notifyChildHealthState: out of memory");
-    } catch (...) {
-        log_error("notifyChildHealthState: unknown exception");
-    }
-    unlock();
-    setChildHealthState(hState);
-    free(cList);
-}
-
-void CtrlBlock::notifyChildHealthState(Message * msg)
-{
-    int num = 0;
-    int *cList = NULL;
-    Message::Type typ = msg->getType();
-    int hState = getErrState(typ);
-    if (hState == UNKNOWN) {
-        delete msg;
-        return;
-    }
-
-    lock();
-    // upqueue can be deleted when it is terminating
-    if (getTermState()) {
-        delete msg;
-        unlock();
-        return;
-    }
-
-    Packer packer(msg->getContentBuf());
-    num = packer.unpackInt();
-    cList = (int *) malloc(num * sizeof(int));
-    assert(cList != NULL);
-
-    try {
-        for (int i = 0; i < num; i++) {
-            cList[i] = packer.unpackInt();
-            errChildren.insert(cList[i]);
-        }
-
-        // if not fe, it should forward the broken msg to its parent
-        if (getMyRole() != FRONT_END) { 
-            getUpQueue()->produce(msg);
-        } else {
-            delete msg;
-        }
-
-        // so far, valid for polling mode only
-        if (getMyRole() != AGENT) {
-            sci_mode_t mode;
-            if (getMyRole() == FRONT_END)
-                mode = getEndInfo()->fe_info.mode;
-            else
-                mode = getEndInfo()->be_info.mode;
-            if (mode == SCI_POLLING) {
-                observer->notify();
-                Message *tmpmsg = new Message(typ);
-                pollQueue->produce(tmpmsg);
-            }
-        }
-    } catch (Exception &e) {
-        log_error("notifyChildHealthState: exception %s", e.getErrMsg());
-    } catch (std::bad_alloc) {
-        log_error("notifyChildHealthState: out of memory");
-    } catch (...) {
-        log_error("notifyChildHealthState: unknown exception");
-    }
-    unlock();
-    setChildHealthState(hState);
-    free(cList);
-}
-
-int CtrlBlock::getErrChildren(int * num, int **list)
-{
-    lock();
-    ERRORCHILDREN_LIST tmpErrChildren = errChildren;
-    unlock();
-
-    *num = tmpErrChildren.size();
-    *list = (int *) malloc(sizeof(int) * (*num));
-    ::memset(*list, 0, sizeof(int) * (*num));
-    log_debug("getErrChildren: err Children: size = %d", *num);
-
-    ERRORCHILDREN_LIST::iterator it;
-    int i = 0;
-    for (it = tmpErrChildren.begin(); it != tmpErrChildren.end(); it++) {
-        (*list)[i] = *it;
-        log_debug("getErrChildren: err Children: list[%d] = %d", i, (*list)[i]);
-        i++;
-    }
-    return 0;
-}
-
-void CtrlBlock::setObserver(Observer *ob) 
-{
-    observer = ob;
-}
-
-extern void makeKey();
-PrivateData * CtrlBlock::getPrivateData()
-{
-    PrivateData *pData = (PrivateData *)pthread_getspecific(Thread::key);
-    if (!pData)
-    {
-        if (!purifierProc) {
-            EmbedAgent* agent = getAgent(handle);
-            if (!agent)
-                return NULL;
-            agent->registPrivateData();
-        } else {
-            pData = new PrivateData(purifierProc->getRoutingList(), purifierProc->getFilterList(), NULL);
-            int rc = pthread_once(&(Thread::once), makeKey);
-            rc = pthread_setspecific(Thread::key, pData);
-        }
-        pData = (PrivateData *)pthread_getspecific(Thread::key);
-    }
-    return pData;
-}
-
-Topology * CtrlBlock::getTopology() 
-{ 
-    PrivateData *pData = getPrivateData();
-    return pData->getRoutingList()->getTopology();
-}
-
-Observer * CtrlBlock::getObserver() {
-    return observer;
-}
-
-void CtrlBlock::setRouterInQueue(MessageQueue * queue)
-{
-    routerInQueue = queue;
-}
-
-void CtrlBlock::setFilterInQueue(MessageQueue *queue) 
-{
-    filterInQueue = queue;
-}
-
-void CtrlBlock::setPollQueue(MessageQueue *queue) 
-{
-    pollQueue = queue;
-}
-
-void CtrlBlock::setMonitorInQueue(MessageQueue *queue) 
-{
-    monitorInQueue = queue;
-}
-
-void CtrlBlock::setErrorQueue(MessageQueue *queue) 
-{
-    errorQueue = queue;
-}
-
-MessageQueue * CtrlBlock::getRouterInQueue()
-{
-    return routerInQueue;
-}
-
-MessageQueue * CtrlBlock::getFilterInQueue() 
-{
-    return filterInQueue;
-}
-
-MessageQueue * CtrlBlock::getPollQueue() 
-{
-    return pollQueue;
-}
-
-MessageQueue * CtrlBlock::getErrorQueue() 
-{
-    return errorQueue;
-}
-
-MessageQueue * CtrlBlock::getMonitorInQueue() 
-{
-    return monitorInQueue;
-}
-
-void CtrlBlock::setRouterProcessor(RouterProcessor *proc) 
-{
-    routerProc = proc;
-}
-
-void CtrlBlock::setFilterProcessor(FilterProcessor *proc) 
-{
-    filterProc = proc;
-}
-        
-void CtrlBlock::setHandlerProcessor(HandlerProcessor *proc) 
-{
-    handlerProc = proc;
-}
-        
-void CtrlBlock::setPurifierProcessor(PurifierProcessor *proc) 
-{
-    purifierProc = proc;
-}
-        
-void CtrlBlock::setUpQueue(MessageQueue * queue)
-{
-    upQueue = queue;
-}
-
-MessageQueue * CtrlBlock::getUpQueue()
-{
-        return upQueue;
-}
-
-RouterProcessor * CtrlBlock::getRouterProcessor() 
-{
-    PrivateData *pData = getPrivateData();
-    return pData->getRouterProcessor();
-}
-        
-FilterProcessor * CtrlBlock::getFilterProcessor() 
-{
-    PrivateData *pData = getPrivateData();
-    return pData->getFilterProcessor();
-}
-
-FilterList * CtrlBlock::getFilterList() 
-{
-    PrivateData *pData = getPrivateData();
-    return pData->getFilterList();
-}
-
-PurifierProcessor * CtrlBlock::getPurifierProcessor() 
-{
-    return purifierProc;
-}
-
-void CtrlBlock::setFlowctlThreshold(long long th)
-{
-    thresHold = th;
-}
-
-long long CtrlBlock::getFlowctlThreshold()
-{
-    return thresHold;
-}
-
-int CtrlBlock::getVersion()
-{
-    return version;
-}
-
-int CtrlBlock::setUsername()
-{
-    if (userName == "") {
-        int rc = 0;
-        long size = sysconf(_SC_GETPW_R_SIZE_MAX);
-        struct passwd pwd;
-        struct passwd *result = NULL;
-        char *pwdBuf = new char[size];
-        while(1) {
-            rc = getpwuid_r(::getuid(), &pwd, pwdBuf, size, &result);
-            if ((rc == EINTR) || (rc == EMFILE) || (rc == ENFILE)) {
-                SysUtil::sleep(WAIT_INTERVAL);
-                continue;
-            }
-            if (NULL == result) {
-                delete []pwdBuf;
-                log_error("CtrlBlock: fail to get the user info! errno = %d.", errno);
-                return SCI_ERR_INVALID_USER;
-            } else {
-                break;
-            }
-        }
-        userName = pwd.pw_name; 
-        delete []pwdBuf;
-    }
-    return SCI_SUCCESS;
-}
-
-string & CtrlBlock::getUsername()
-{
-    return userName;
-}
-
-RoutingList * CtrlBlock::getRoutingList()
-{
-    PrivateData *pData = getPrivateData();
-    return pData->getRoutingList();
-}
-
-void CtrlBlock::addEmbedAgent(int hndl, EmbedAgent *agent)
-{
-    lock();
-    embedAgents[hndl] = agent;
-    unlock();
-}
-
-void CtrlBlock::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void CtrlBlock::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
-void CtrlBlock::setFlowctlState(bool state)
-{
-    flowctlState = state;
-}
-
-bool CtrlBlock::getFlowctlState()
-{
-    return flowctlState;
-}
-
-void CtrlBlock::setChildHealthState(int state)
-{
-    childHealthState = state;
-}
-
-int CtrlBlock::checkChildHealthState()
-{
-    int rc = SCI_SUCCESS;
-    switch (childHealthState) {
-        case HEALTH:
-            rc = SCI_SUCCESS;
-            break;
-        case ERROR_CHILD_BROKEN:
-            rc = SCI_ERR_CHILD_BROKEN; 
-            break;
-        case ERROR_DATA:
-            rc = SCI_ERR_DATA; 
-            break;
-        case ERROR_THREAD:
-            rc = SCI_ERR_THREAD; 
-            break;
-        default:
-            rc = SCI_ERR_THREAD; 
-            break;
-    }
-    return rc;
-}
-
-Message::Type CtrlBlock::getErrMsgType(int hState)
-{
-    Message::Type typ;
-    switch (hState) {
-        case HEALTH:
-        case UNKNOWN:
-            // If it is in health/unknown state, should not produce notify msg
-            typ = Message::UNKNOWN;
-            break;
-        case ERROR_CHILD_BROKEN:
-            typ = Message::SOCKET_BROKEN;
-            break;
-        case ERROR_DATA:
-            typ = Message::ERROR_DATA;
-            break;
-        case ERROR_THREAD:
-            typ = Message::ERROR_THREAD;
-            break;
-        default:
-            typ = Message::ERROR_THREAD;
-            break;
-    }
-    return typ;
-}
-
-int CtrlBlock::getErrState(Message::Type typ)
-{
-    int hState;
-    switch (typ) {
-        case Message::SOCKET_BROKEN:
-            hState = ERROR_CHILD_BROKEN;
-            break;
-        case Message::ERROR_DATA:
-            hState = ERROR_DATA;
-            break;
-        case Message::ERROR_THREAD:
-            hState = ERROR_THREAD;
-            break;
-        default:
-            // If it is incorrect msg type
-            hState = UNKNOWN;
-            break;
-    }
-    return hState;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp
deleted file mode 100644
index 13e804b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp
+++ /dev/null
@@ -1,234 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: CtrlBlock
-
- Description: Internal running information management (Note: STL does not 
-              guarantee the safety of several readers & one writer cowork 
-              together, and user threads can query group information at 
-              runtime, so it's necessary to add a lock to protect these 
-              read & write operations).
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-   11/27/10 ronglli      Add SCI version
-   01/16/12 ronglli      Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#ifndef _CTRLBLOCK_HPP
-#define _CTRLBLOCK_HPP
-
-#include <pthread.h>
-#include <map>
-#include <set>
-
-#include "sci.h"
-#include "general.hpp"
-#include "message.hpp" 
-
-#define WAIT_INTERVAL 1000  // 1000 usec
-
-using namespace std;
-
-class MessageQueue;
-class Processor;
-class Stream;
-class FilterProcessor;
-class RouterProcessor;
-class PurifierProcessor;
-class Topology;
-class Observer;
-class RoutingList;
-class EmbedAgent;
-class FilterList;
-class HandlerProcessor;
-class PrivateData;
-
-class CtrlBlock
-{
-    public:
-        enum ROLE {
-            INVALID,
-            FRONT_END,
-            AGENT,
-            BACK_END,
-            BACK_AGENT
-        };
-
-        enum HEALTH_STATE{
-            HEALTH,
-            ERROR_CHILD_BROKEN,
-            ERROR_DATA,
-            ERROR_THREAD,
-            UNKNOWN
-        };
-        
-        typedef map<int, EmbedAgent *> AGENT_MAP;
-        typedef set<int> ERRORCHILDREN_LIST;
-
-    private:
-        // SCI Version
-        int                  version;
-
-        // basic information
-        ROLE                 role;
-        int                  handle;
-        int                  embed_handle;
-        int                  jobKey;
-        int                  enableID;
-        string               userName;
-
-        bool                 flowctlState;
-        bool                 childHealthState;
-        pthread_mutex_t      mtx;
-
-        sci_info_t           *endInfo;
-
-        Observer             *observer;
-        AGENT_MAP            embedAgents;
-        ERRORCHILDREN_LIST   errChildren;
-        int                  cnt_disable;
-
-        // flow control threshold
-        long long            thresHold;
-
-        // additional information for convenient purpose
-        MessageQueue         *routerInQueue;
-        MessageQueue         *filterInQueue;
-        MessageQueue         *filterOutQueue;
-        MessageQueue         *purifierOutQueue;
-        MessageQueue         *pollQueue;
-        MessageQueue         *upQueue;
-        
-        MessageQueue         *errorQueue;
-        MessageQueue         *monitorInQueue;
-
-        RouterProcessor      *routerProc;
-        FilterProcessor      *filterProc;
-        PurifierProcessor    *purifierProc;
-        HandlerProcessor     *handlerProc;
-
-        Stream               *parentStream;
-        int                  recoverMode;
-        bool                 waitParentInfo;
-        bool                 termState;
-
-        CtrlBlock();
-        static CtrlBlock *instance;
-        
-    public:
-        ~CtrlBlock();
-        static CtrlBlock* getInstance() {
-            if (instance == NULL)
-                instance = new CtrlBlock();
-            return instance;
-        }
-
-        void setRecoverMode(int mo);
-        int getRecoverMode();
-        void setParentInfoWaitState(bool mo);
-        bool getParentInfoWaitState();
-        void setTermState(bool mo);
-        bool getTermState();
-
-        ROLE getMyRole();
-        void setMyRole(CtrlBlock::ROLE ro); 
-        int getMyHandle();
-        void setMyHandle(int hndl);
-        // embeded agent
-        int getMyEmbedHandle();
-        void setMyEmbedHandle(int hndl);
-        sci_info_t * getEndInfo();
-        int getJobKey();
-        void setJobKey(int key);
-        void addEmbedAgent(int hndl, EmbedAgent *agent);
-        EmbedAgent *getAgent(int hndl);
-        
-        int init(sci_info_t *info);
-        int initClient(ROLE ro);
-        void term();
-
-        void enable();
-        void disable();
-        bool isEnabled();
-        void releasePollQueue();
-
-        void setObserver(Observer *ob);
-        Topology * getTopology();
-        Observer * getObserver();
-
-        // main components in SCI
-        void setRouterInQueue(MessageQueue *queue);
-        void setFilterInQueue(MessageQueue *queue);
-        void setPollQueue(MessageQueue *queue);
-        void setUpQueue(MessageQueue *queue);
-        void setMonitorInQueue(MessageQueue *queue);
-        void setErrorQueue(MessageQueue *queue);
-        MessageQueue * getRouterInQueue();
-        MessageQueue * getFilterInQueue();
-        MessageQueue * getPollQueue();
-        MessageQueue * getUpQueue();
-        MessageQueue * getErrorQueue();
-        MessageQueue * getMonitorInQueue();
-        
-        void setRouterProcessor(RouterProcessor *proc);
-        void setFilterProcessor(FilterProcessor *proc);
-        void setHandlerProcessor(HandlerProcessor *proc);
-        void setPurifierProcessor(PurifierProcessor *proc);
-        RouterProcessor * getRouterProcessor();
-        FilterProcessor * getFilterProcessor();
-        PurifierProcessor * getPurifierProcessor();
-        RoutingList * getRoutingList();
-        FilterList * getFilterList();
-        int getChildrenSockfds(int *fds);
-        int numOfChildrenFds();
-
-        bool allRouted();
-        int isActiveSockfd(int fd);
-        bool allActive();
-
-        void setFlowctlThreshold(long long th);
-        long long getFlowctlThreshold();
-        
-        int getVersion();
-        int setUsername();
-        string & getUsername();
-
-        void setFlowctlState(bool state);
-        bool getFlowctlState();
-        void setChildHealthState(int state);
-        int checkChildHealthState();
-        int getErrState(Message::Type typ);
-        Message::Type getErrMsgType(int hState);
-        void notifyChildHealthState(int hndl, int hState);
-        void notifyChildHealthState(Message * msg);
-        int getErrChildren(int * num, int **list);
-
-        void genSelfInfo(MessageQueue *queue, bool isUncle);
-        void clean();
-
-    private:
-        PrivateData* getPrivateData();
-
-        void lock();
-        void unlock();
-};
-
-#define gCtrlBlock CtrlBlock::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp
deleted file mode 100644
index e8253d3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp
+++ /dev/null
@@ -1,825 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Distributed Group
-
- Description: Distributed group manipulation (Note: STL does not guarantee 
-              the safety of several readers & one writer cowork together, 
-              and user threads can query group information at runtime, 
-              so it's necessary to add a lock to protect these read & write 
-              operations).
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (F156654)
-   01/16/12 ronglli      Add codes to retrieve BE list
-
-****************************************************************************/
-
-#include "dgroup.hpp"
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "packer.hpp"
-#include "group.hpp"
-
-#include "message.hpp"
-
-DistributedGroup::DistributedGroup(int pid)
-    : parentId(pid)
-{
-    generalInfo.clear();
-
-    beInfo.clear();
-    successorInfo.clear();
-
-    beListInfo.clear();
-    successorListInfo.clear();
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-DistributedGroup::~DistributedGroup()
-{  
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            delete (*git).second;
-        }
-    }
-    generalInfo.clear();
-
-    beInfo.clear();
-    successorInfo.clear();
-
-    beListInfo.clear();
-    successorListInfo.clear();
-
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void DistributedGroup::setPID(int id)
-{
-    parentId = id;
-}
-
-int DistributedGroup::getPID()
-{
-    return parentId;
-}
-
-Message * DistributedGroup::packMsg()
-{
-    Packer packer;
-    
-    packer.packInt(parentId);
-    packer.packInt(generalInfo.size());
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        packer.packInt((int) (*it).first);
-        packer.packInt((*it).second.size());
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            packer.packInt((*git).first);
-            packer.packInt((*git).second->size());
-
-            Group::iterator ggit = (*git).second->begin();
-            for (; ggit != (*git).second->end(); ggit++) {
-                packer.packInt((*ggit));
-            }
-        }
-    }
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::GROUP_MERGE);
-    delete [] bufs[0];
-    return msg;
-}
-
-void DistributedGroup::unpackMsg(Message & msg)
-{
-    Packer packer(msg.getContentBuf());
-    
-    parentId = packer.unpackInt();
-    int size1 = packer.unpackInt();
-    for (int i=0; i<size1; i++) {
-        sci_group_t groupId = (sci_group_t) packer.unpackInt();
-
-        int size2 = packer.unpackInt();
-        for (int j=0; j<size2; j++) {
-            int childId = packer.unpackInt();
-
-            Group *group = new Group();
-            int size3 = packer.unpackInt();
-            for (int k=0; k<size3; k++) {
-                group->Add(packer.unpackInt());
-            }
-
-            generalInfo[groupId][childId] = group;
-        }
-    }
-}
-
-void DistributedGroup::create(int num_bes, int * be_list, sci_group_t group)
-{
-    Group total;
-    for (int i=0; i<num_bes; i++) {
-        total.Add(be_list[i]);
-    }
-
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    
-    GRP_MAP::iterator git = (*it).second.begin();
-    for (; git!=(*it).second.end(); ++git) {
-        int childHndl = (*git).first;
-        Group *grp = (*git).second;
-
-        Group diff(*grp);
-        diff.Delete(total);
-
-        Group *intersect = new Group(*grp);
-        intersect->Delete(diff);
-        if (!intersect->empty()) { // if not empty
-            generalInfo[group][childHndl] = intersect;
-        } else {
-            delete intersect;
-        }
-    }
-
-    reset(group);
-
-    unlock();
-}
-
-void DistributedGroup::remove(sci_group_t group)
-{
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(group);
-    
-    GRP_MAP::iterator git = (*it).second.begin();
-    for (; git!=(*it).second.end(); ++git) {
-        delete (*git).second;
-    }
-    generalInfo.erase(group);
-
-    beInfo.erase(group);
-    successorInfo.erase(group);
-
-    beListInfo.erase(group);
-    successorListInfo.erase(group);
-
-    unlock();
-}
-
-int DistributedGroup::operate(sci_group_t group1, sci_group_t group2, sci_op_t op,
-    sci_group_t newgroup)
-{
-    bool hasMember = false;
-
-    lock();
-    
-    if (op == SCI_UNION) {     
-        // Add all members in group_info[group1]
-        GRP_MAP::iterator git = generalInfo[group1].begin();
-        for (; git!=generalInfo[group1].end(); ++git) {            
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            Group *uni = new Group(*grp);
-            if (generalInfo[group2].find(childHndl) != generalInfo[group2].end()) {
-                // if found
-                uni->Add(*generalInfo[group2][childHndl]);
-            }
-            generalInfo[newgroup][childHndl] = uni;
-        }
-
-        // Add members of group_info[group2] missing in the previous step
-        git = generalInfo[group2].begin();
-        for (; git!=generalInfo[group2].end(); ++git) {            
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            if (generalInfo[group1].find(childHndl) == generalInfo[group1].end()) {
-                // if not found
-                Group *uni = new Group(*grp);
-                generalInfo[newgroup][childHndl] = uni;
-            }
-        }
-
-        // should always be true
-        hasMember = true;
-    } else if (op == SCI_INTERSECTION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group1);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            if (generalInfo[group2].find(childHndl) == generalInfo[group2].end()) {
-                // if not found
-                continue;
-            }
-            Group diff(*grp);
-            diff.Delete(*generalInfo[group2][childHndl]);
-
-            Group *intersect = new Group(*grp);
-            intersect->Delete(diff);
-            if (!intersect->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = intersect;
-                hasMember = true;
-            } else {
-                delete intersect;
-            }
-        }
-    } else if (op == SCI_DIFFERENCE) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group1);
-        int childHndl;
-        Group *grp, *diff;
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            childHndl = (*git).first;
-            grp = (*git).second;
-            diff = new Group(*grp);
-
-            if (generalInfo[group2].find(childHndl) != generalInfo[group2].end()) {
-                diff->Delete(*generalInfo[group2][childHndl]);
-            }
-            if (!diff->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = diff;
-                hasMember = true;
-            } else {
-                delete diff;
-            }
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if (hasMember) {
-        reset(newgroup);
-    } else {
-        rc = SCI_ERR_GROUP_EMPTY;
-    }
-
-    unlock();
-
-    return rc;
-}
-
-int DistributedGroup::operateExt(sci_group_t group, int num_bes, int * be_list, 
-    sci_op_t op, sci_group_t newgroup)
-{
-    Group total;
-    for (int i=0; i<num_bes; i++) {
-        total.Add(be_list[i]);
-    }
-
-    lock();
-    
-    bool hasMember = false;
-    if (op == SCI_UNION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group diff(*grp);
-            diff.Delete(total);
-
-            Group intersect(*grp);
-            intersect.Delete(diff);
-
-            if (generalInfo[group].find(childHndl) == generalInfo[group].end()) {
-                // if not found
-                if (!intersect.empty()) { // if not empty
-                    Group *uni = new Group();
-                    uni->Add(intersect);
-                    generalInfo[newgroup][childHndl] = uni;
-                }
-            } else {
-                if (!intersect.empty()) { // if not empty
-                    Group *uni = new Group(*grp);
-                    uni->Add(intersect);
-                    generalInfo[newgroup][childHndl] = uni;
-                } else {
-                    Group *uni = new Group(*grp);
-                    generalInfo[newgroup][childHndl] = uni;
-                }
-            }
-        }
-
-        // should always be true
-        hasMember = true;
-    } else if (op == SCI_INTERSECTION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group diff(*grp);
-            diff.Delete(total);
-
-            Group *intersect = new Group(*grp);
-            intersect->Delete(diff);
-            if (!intersect->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = intersect;
-                hasMember = true;
-            } else {
-                delete intersect;
-            }
-        }
-    } else if (op == SCI_DIFFERENCE) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group);
-
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group *diff = new Group(*grp);
-            diff->Delete(total);
-            if (!diff->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = diff;
-                hasMember = true;
-            } else {
-                delete diff;
-            }
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if (hasMember) {
-        reset(newgroup);
-    } else {
-        rc = SCI_ERR_GROUP_EMPTY;
-    }
-
-    unlock();
-
-    return rc;
-}
-
-void DistributedGroup::initSubGroup(int successor_id, int start_be_id, int end_be_id)
-{
-    lock();
-
-    // init generalInfo
-    Group *grp = new Group();
-    grp->Add(Range(start_be_id, end_be_id+1));
-    generalInfo[SCI_GROUP_ALL][successor_id] = grp;
-
-    // init beListInfo & beInfo
-    for (int id=start_be_id; id<=end_be_id; id++) {
-        beListInfo[SCI_GROUP_ALL].push_back(id);
-    }
-    if (beInfo.find(SCI_GROUP_ALL) == beInfo.end()) {
-        beInfo[SCI_GROUP_ALL] = (end_be_id - start_be_id + 1);
-    } else {
-        beInfo[SCI_GROUP_ALL] += (end_be_id - start_be_id + 1);
-    }
-
-    // init successorListInfo & successorInfo
-    if (successorInfo.find(SCI_GROUP_ALL) == successorInfo.end()) {
-        successorInfo[SCI_GROUP_ALL] = 0;
-    }
-    
-    if (successor_id != VALIDBACKENDIDS) {
-        successorListInfo[SCI_GROUP_ALL].push_back(successor_id);
-        successorInfo[SCI_GROUP_ALL] += 1;
-    } else {
-        for (int id=start_be_id; id<=end_be_id; id++) {
-            successorListInfo[SCI_GROUP_ALL].push_back(id);
-        }
-        successorInfo[SCI_GROUP_ALL] += (end_be_id - start_be_id + 1);
-    }
-
-    unlock();
-}
-
-void DistributedGroup::addBE(sci_group_t group, int successor_id, int be_id)
-{
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(group);
-    if (generalInfo.find(group) == generalInfo.end()) {
-        Group *grp = new Group();
-        grp->Add(be_id);
-        generalInfo[group][successor_id] = grp;
-    } else {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git == (*it).second.end()) {
-            Group *grp = new Group();
-            grp->Add(be_id);
-            ((*it).second)[successor_id] = grp;
-        } else {
-            (*git).second->Add(be_id);
-        }
-    }
-    reset(group);
-
-    unlock();
-}
-
-void DistributedGroup::removeBE(int be_id)
-{
-    lock();
-    
-    // this function will remove all empty groups after 'be_id' is removed
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    vector<sci_group_t> junkGrps;
-    for(; it != generalInfo.end(); ++it) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        vector<int> junkSubGrps;
-        for (; git != (*it).second.end(); ++git) {
-            Group *grp = (*git).second;
-            grp->Delete(be_id);
-            if (grp->size() == 0) {
-                junkSubGrps.push_back((*git).first);
-            }
-        }
-        
-        for (int j=0; j<(int) junkSubGrps.size(); j++) {
-            if ((*it).first == SCI_GROUP_ALL) {
-                if (junkSubGrps[j] >= 0) { // back end id
-                    delete ((*it).second)[junkSubGrps[j]];
-                    (*it).second.erase(junkSubGrps[j]);
-                }
-            } else {
-                delete ((*it).second)[junkSubGrps[j]];
-                (*it).second.erase(junkSubGrps[j]);
-            }
-        }
-
-        if ((*it).second.size() == 0) {
-            junkGrps.push_back((*it).first);
-        }
-    }
-    for (int i=0; i<(int) junkGrps.size(); i++) {
-        generalInfo.erase(junkGrps[i]);
-        beInfo.erase(junkGrps[i]);
-        successorInfo.erase(junkGrps[i]);
-        beListInfo.erase(junkGrps[i]);
-        successorListInfo.erase(junkGrps[i]);
-    }
-
-    resetAll();
-
-    unlock();
-}
-
-void DistributedGroup::dropSuccessor(int successor_id)
-{
-    lock();
-    
-    // delete all group inforamtion related to 'successor_id'
-    if (successor_id >= 0) {
-        GRP_MAP_MAP::iterator it = generalInfo.begin();
-        for (; it!=generalInfo.end(); ++it) {
-            GRP_MAP::iterator git = (*it).second.find(VALIDBACKENDIDS);
-            if (git != (*it).second.end()) {
-                (*git).second->Delete(successor_id);
-                reset((*it).first);
-            }
-        }
-    } else {
-        GRP_MAP_MAP::iterator it = generalInfo.begin();
-        for (; it!=generalInfo.end(); ++it) {
-            GRP_MAP::iterator git = (*it).second.find(successor_id);
-            if (git != (*it).second.end()) {
-                delete (*git).second;
-                (*it).second.erase(successor_id);
-                reset((*it).first);
-            }
-        }
-    }
-
-    unlock();
-}
-
-void DistributedGroup::merge(int successor_id, DistributedGroup & dgroup, bool overwrite)
-{
-    lock();
-    
-    // overwrite - whether or not use the information from 'group' if group id does not exist
-    GRP_MAP_MAP::iterator dit = dgroup.generalInfo.begin();
-    for(; dit != dgroup.generalInfo.end(); ++dit) {
-        GRP_MAP_MAP::iterator it = generalInfo.find((*dit).first);
-        if (it == generalInfo.end()) {
-            // if this group id does not exist here
-            if (overwrite) {
-                if (successor_id >= 0) {
-                    Group *group = new Group();
-                    group->Add(successor_id);
-                    
-                    generalInfo[(*dit).first][VALIDBACKENDIDS] = group;
-                } else {
-                    Group *group = new Group();
-                    GRP_MAP::iterator git = (*dit).second.begin();
-                    for (; git != (*dit).second.end(); ++git) {
-                        group->Add(*((*git).second));
-                    }
-                
-                    generalInfo[(*dit).first][successor_id] = group;
-                }
-                reset((*dit).first);
-            } else {
-                continue;
-            }
-        } else {
-            // or this group does exist here
-            if (successor_id >= 0) {
-                if ((*it).second.find(VALIDBACKENDIDS) == (*it).second.end()) {
-                    ((*it).second)[VALIDBACKENDIDS] = new Group();
-                }
-                ((*it).second)[VALIDBACKENDIDS]->Add(successor_id);
-
-                GRP_MAP::iterator git = (*it).second.begin();
-                for (; git != (*it).second.end(); ++git) {
-                    if ((*git).first != VALIDBACKENDIDS) {
-                        (*git).second->Delete(successor_id);
-                    }
-                }
-            } else {
-                if ((*it).second.find(successor_id) == (*it).second.end()) {
-                    ((*it).second)[successor_id] = new Group();
-                }
-                GRP_MAP::iterator git = (*dit).second.begin();
-                for (; git != (*dit).second.end(); ++git) {
-                    ((*it).second)[successor_id]->Add(*((*git).second));
-                }
-                
-                git = (*it).second.begin();
-                for (; git != (*it).second.end(); ++git) {
-                    if ((*git).first != successor_id) {
-                        Group *grp = ((*it).second)[successor_id];
-                        (*git).second->Delete(*grp);
-                    }
-                }
-            }
-            reset((*dit).first);
-        }
-    }
-
-    unlock();
-}
-
-bool DistributedGroup::isGroupExist(sci_group_t group)
-{
-    bool rc = false;
-
-    lock();
-    if (generalInfo.find(group) != generalInfo.end()) {
-        rc = true;
-    }
-    unlock();
-
-    return rc;
-}
-
-bool DistributedGroup::isSuccessorExist(int successor_id)
-{
-    bool rc = false;
-
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git != (*it).second.end()) {
-            rc = true;
-        } else {
-            git = (*it).second.find(VALIDBACKENDIDS);
-            if (git != (*it).second.end()) {
-                Group *grp = (*git).second;
-                if (grp->HasMember(successor_id)) {
-                    rc = true;
-                }
-            }
-        }
-    }
-    unlock();
-
-    return rc;
-}
-
-int DistributedGroup::numOfBE(sci_group_t group)
-{
-    int num = 0;
-
-    lock();
-    INT_MAP::iterator it = beInfo.find(group);
-    if (it != beInfo.end()) {
-        num = (*it).second;
-    }
-    unlock();
-
-    return num;
-}
-
-int DistributedGroup::numOfSuccessor(sci_group_t group)
-{
-    int num = 0;
-
-    lock();
-    INT_MAP::iterator it = successorInfo.find(group);
-    if (it != successorInfo.end()) {
-        num = (*it).second;
-    }
-    unlock();
-
-    return num;
-}
-
-int DistributedGroup::numOfBEOfSuccessor(int successor_id)
-{
-    int num = 0;
-    
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git != (*it).second.end()) {
-            num = (*git).second->size();
-        }
-    }
-    unlock();
-
-    return num;
-}
-
-void DistributedGroup::retrieveBEList(sci_group_t group, int * ret_val)
-{
-    lock();
-    INTLIST_MAP::iterator it = beListInfo.find(group);
-    if (it != beListInfo.end()) {
-        for (int i=0; i<(int) (*it).second.size(); i++) {
-            ret_val[i] = ((*it).second)[i];
-        }
-    }
-    unlock();
-}
-
-void DistributedGroup::retrieveSuccessorList(sci_group_t group, int * ret_val)
-{
-    lock();
-    INTLIST_MAP::iterator it = successorListInfo.find(group);
-    if (it != successorListInfo.end()) {
-        for (int i=0; i<(int) (*it).second.size(); i++) {
-            ret_val[i] = ((*it).second)[i];
-        }
-    }
-    unlock();
-}
-
-void DistributedGroup::retrieveBEListOfSuccessor(int successor_id, int * ret_val)
-{
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git != (*it).second.end()) {
-            int i = 0;
-            Group::iterator ggit = (*git).second->begin();
-            for (; ggit != (*git).second->end(); ggit++) {
-                ret_val[i++] = (*ggit);
-            }
-        }
-    }
-    unlock();
-}
-
-int DistributedGroup::querySuccessorId(int be_id)
-{
-    int id = INVLIDSUCCESSORID;
-
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            Group *grp = (*git).second;
-            if (grp->HasMember(be_id)) {
-                id = (*git).first;
-                break;
-            }
-        }
-    }
-    unlock();
-
-    return id;
-}
-
-void DistributedGroup::dump()
-{
-    printf("Here below is the distributed group information (pid %d):\n\n", parentId);
-
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        printf("[group id %d]:\n", (*it).first);
-        printf("\tnum of back ends: %d\n", beInfo[(*it).first]);
-        printf("\tnum of successors: %d\n", successorInfo[(*it).first]);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            printf("\tchild id %d: ", (*git).first);
-
-            Group::iterator ggit = (*git).second->begin();
-            for (; ggit != (*git).second->end(); ggit++) {
-                printf("%d ", (*ggit));
-            }
-
-            printf("\n");
-        }
-    }
-
-    printf("\nEnd\n\n");
-}
-
-void DistributedGroup::reset(sci_group_t group)
-{  
-    int num;
-    
-    // reset beListInfo & beInfo
-    beListInfo.erase(group);
-    num = 0;
-    
-    GRP_MAP::iterator it = generalInfo[group].begin();
-    for (; it!=generalInfo[group].end(); ++it) {
-        Group *grp = (*it).second;
-        Group::iterator git = grp->begin();
-        for (; git!=grp->end(); git++) {
-            beListInfo[group].push_back((*git));
-            num++;
-        }
-    }
-
-    beInfo[group] = num;
-
-    // reset successorListInfo & successorInfo
-    successorListInfo.erase(group);
-    num = 0;
-    
-    it = generalInfo[group].begin();
-    for (; it!=generalInfo[group].end(); ++it) {
-        int hndl = (*it).first;
-        if (hndl != VALIDBACKENDIDS) {
-            successorListInfo[group].push_back(hndl);
-            num++;
-        } else {
-            Group *grp = (*it).second;
-            Group::iterator git = grp->begin();
-            for (; git!=grp->end(); git++) {
-                successorListInfo[group].push_back((*git));
-                num++;
-            }
-        }
-    }
-
-    successorInfo[group] = num;
-}
-
-void DistributedGroup::resetAll()
-{
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for(; it != generalInfo.end(); ++it) {
-        reset((*it).first);
-    }
-}
-
-void DistributedGroup::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void DistributedGroup::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp
deleted file mode 100644
index e4a3e01..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Distributed Group
-
- Description: Distributed group manipulation (Note: STL does not guarantee 
-              the safety of several readers & one writer cowork together, 
-              and user threads can query group information at runtime, 
-              so it's necessary to add a lock to protect these read & write 
-              operations).
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (F156654)
-   01/16/12 ronglli      Add codes to retrieve BE list
-
-****************************************************************************/
-
-#ifndef _DGROUP_HPP
-#define _DGROUP_HPP
-
-#include <pthread.h>
-
-#include <map>
-#include <vector>
-
-#include "sci.h"
-#include "general.hpp"
-
-using namespace std;
-
-class Group;
-class Message;
-
-class DistributedGroup
-{
-    public:
-        typedef map<int, Group*> GRP_MAP;
-        typedef map<sci_group_t, GRP_MAP> GRP_MAP_MAP;
-        typedef map<sci_group_t, int> INT_MAP;
-        typedef map<sci_group_t, vector<int> > INTLIST_MAP;
-        
-    private:
-        int                   parentId;
-        GRP_MAP_MAP           generalInfo;
-        
-        INT_MAP               beInfo;
-        INT_MAP               successorInfo;
-
-        INTLIST_MAP           beListInfo;
-        INTLIST_MAP           successorListInfo;
-
-        pthread_mutex_t       mtx;
-
-    public:
-        DistributedGroup(int pid);
-        ~DistributedGroup();
-        
-        void setPID(int id);
-        int getPID();
-
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-
-        // write operations
-        void create(int num_bes, int *be_list, sci_group_t group);
-        void remove(sci_group_t group);
-        int operate(sci_group_t group1, sci_group_t group2, sci_op_t op, 
-            sci_group_t newgroup);
-        int operateExt(sci_group_t group, int num_bes, int *be_list, 
-            sci_op_t op, sci_group_t newgroup);
-
-        void initSubGroup(int successor_id, int start_be_id, int end_be_id);
-        void addBE(sci_group_t group, int successor_id, int be_id);
-        void removeBE(int be_id);
-        void dropSuccessor(int successor_id);
-
-        void merge(int successor_id, DistributedGroup &dgroup, bool overwrite);
-
-        // read operations
-        bool isGroupExist(sci_group_t group);
-        bool isSuccessorExist(int successor_id);
-        
-        int numOfBE(sci_group_t group);
-        int numOfSuccessor(sci_group_t group);
-        int numOfBEOfSuccessor(int successor_id);
-        
-        void retrieveBEList(sci_group_t group, int *ret_val);
-        void retrieveSuccessorList(sci_group_t, int *ret_val);
-        void retrieveBEListOfSuccessor(int successor_id, int * ret_val);
-
-        int querySuccessorId(int be_id);
-
-        // for debugging purpose
-        void dump();
-
-    private:
-        void reset(sci_group_t group);
-        void resetAll();
-
-        void lock();
-        void unlock();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.cpp
deleted file mode 100644
index 78637c9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EmbedAgent
-
- Description: embedded agent in front-end back-end
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code ()
-
-****************************************************************************/
-
-#include "tools.hpp"
-
-#include "embedagent.hpp"
-#include "ctrlblock.hpp"
-#include "writerproc.hpp"
-#include "filterproc.hpp"
-#include "handlerproc.hpp"
-#include "routerproc.hpp"
-#include "topology.hpp"
-#include "message.hpp"
-#include "eventntf.hpp"
-#include "queue.hpp"
-#include "stream.hpp"
-#include "routinglist.hpp"
-#include "privatedata.hpp"
-#include "filterlist.hpp"
-
-
-EmbedAgent::EmbedAgent()
-    : handle(-1), inStream(NULL), outStream(NULL), filterInQ(NULL), filterOutQ(NULL), routerInQ(NULL), filterProc(NULL), routerProc(NULL), writerProc(NULL), routingList(NULL), filterList(NULL)
-{}
-
-EmbedAgent::~EmbedAgent()
-{
-    if (routerProc) {
-        routerProc->release();
-        delete routerProc;
-    }
-    if (filterProc) {
-        filterProc->release();
-        delete filterProc;
-    }
-    if (writerProc) {
-        writerProc->release();
-        delete writerProc;
-    }
-    if (routingList)
-        delete routingList;
-    if (filterList)
-        delete filterList;
-}
-
-int EmbedAgent::init(int hndl, Stream *stream, MessageQueue *inQ, MessageQueue *outQ)
-{
-    handle = hndl;
-
-    filterList = new FilterList();
-    routingList = new RoutingList(hndl);
-    routerProc = new RouterProcessor(hndl, routingList, filterList);
-    filterInQ = new MessageQueue();
-    filterInQ->setName("filterInQ");
-    filterProc = new FilterProcessor(hndl, filterList);
-    filterProc->setInQueue(filterInQ);
-    if (outQ != NULL) {
-        filterProc->setOutQueue(outQ);
-    } else {
-        filterOutQ = new MessageQueue();
-        filterOutQ->setName("filterOutQ");
-        filterProc->setOutQueue(filterOutQ);
-    }
-    PrivateData *pDataFilter = new PrivateData(routingList, filterList, filterProc, routerProc);
-    filterProc->setSpecific(pDataFilter);
-    gCtrlBlock->setUpQueue(filterInQ);
-    PrivateData *pDataRouter = new PrivateData(routingList, filterList, filterProc, routerProc);
-    routerProc->setSpecific(pDataRouter);
-    routingList->setFilterProcessor(filterProc);
-
-    if (stream) {
-        inStream = stream;
-        routerProc->setInStream(stream);
-        writerProc = new WriterProcessor(hndl);
-        writerProc->setName("WriterP");
-        writerProc->setInQueue(filterOutQ);
-        writerProc->setOutStream(stream);
-
-        routerProc->setPeerProcessor(writerProc);
-    } else if (inQ) {
-        routerProc->setInQueue(inQ);
-    } else {
-        routerInQ = new MessageQueue();
-        routerInQ->setName("routerInQ");
-        routerProc->setInQueue(routerInQ);
-        gCtrlBlock->setRouterInQueue(routerInQ);
-        gCtrlBlock->setRouterProcessor(routerProc);
-    }
-    gCtrlBlock->addEmbedAgent(handle, this);
-
-    return 0;
-}
-
-RoutingList * EmbedAgent::getRoutingList()
-{
-    return routingList;
-}
-
-MessageQueue * EmbedAgent::getRouterInQ()
-{
-    return routerInQ;
-}
-
-MessageQueue * EmbedAgent::getUpQueue()
-{
-    return filterOutQ;
-}
-
-int EmbedAgent::work()
-{
-    int rc = 0;
-
-    routerProc->start();
-    filterProc->start();
-    if (writerProc)
-        writerProc->start();
-    if (gCtrlBlock->getMyRole() != CtrlBlock::BACK_AGENT) {
-        rc = registPrivateData();
-    }
-
-    return rc;
-}
-
-int EmbedAgent::syncWait()
-{
-    int rc = 0;
-    gNotifier->freeze(routingList->getTopology()->getInitID(), &rc);
-
-    return rc;
-}
-
-FilterProcessor * EmbedAgent::getFilterProcessor()
-{
-    return filterProc;
-}
-
-extern void makeKey();
-int EmbedAgent::registPrivateData()
-{
-    PrivateData *pDataMain = new PrivateData(routingList, filterList, filterProc, routerProc);
-    int rc = pthread_once(&(Thread::once), makeKey);
-    rc = pthread_setspecific(Thread::key, pDataMain);
-
-    return rc;
-}
-
-PrivateData * EmbedAgent::genPrivateData()
-{
-    PrivateData *pData = new PrivateData(routingList, filterList, filterProc, routerProc);
-
-    return pData;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.hpp
deleted file mode 100644
index 96d1c2b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/embedagent.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EmbedAgent
-
- Description: embedded agent in front-end and back-end
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code ()
-
-****************************************************************************/
-
-#ifndef _EMBEDAGENT_HPP
-#define _EMBEDAGENT_HPP
-
-#include <stdlib.h>
-
-class MessageQueue;
-class Stream;
-class FilterProcessor;
-class RouterProcessor;
-class WriterProcessor;
-class RoutingList;
-class FilterList;
-class Listener;
-class PrivateData;
-
-class EmbedAgent {
-    private:
-        int                 handle;
-        Stream              *inStream;
-        Stream              *outStream;
-        MessageQueue        *filterInQ;
-        MessageQueue        *filterOutQ;
-        MessageQueue        *routerInQ;
-        FilterProcessor     *filterProc;
-        RouterProcessor     *routerProc;
-        WriterProcessor     *writerProc;
-        RoutingList         *routingList;
-        FilterList          *filterList;
-
-    public:
-        EmbedAgent();
-        ~EmbedAgent();
-        int init(int hndl, Stream *stream, MessageQueue *inQ, MessageQueue *outQ = NULL);
-        int work();
-        int syncWait();
-        void setParent(EmbedAgent *agent);
-        void setChild(EmbedAgent *child);
-        MessageQueue *getRouterInQ();
-        MessageQueue *getUpQueue();
-        int registPrivateData();
-        FilterProcessor *getFilterProcessor();
-        RoutingList *getRoutingList();
-        PrivateData *genPrivateData();
-};
-
-#endif
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp
deleted file mode 100644
index 09b5618..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EventNotify
-
- Description: Synchronization between threads
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/05/08 tuhongj      Initial code (D154660)
-
-****************************************************************************/
-
-#include "eventntf.hpp"
-#include <unistd.h>
-#include <string.h>
-#include <assert.h>
-#include <sys/time.h>
-
-#include "tools.hpp"
-#include "ctrlblock.hpp"
-#include "log.hpp"
-
-const struct serialNtfTest INIT_VAL_NTF = {0, 0, 0, 0};
-
-EventNotify * EventNotify::notifier = NULL;
-
-EventNotify::EventNotify()
-    : serialNum(0), serialSize(0)
-{
-    ::pthread_mutex_init(&mtx, NULL);
-    ::pthread_cond_init(&cond, NULL);
-    serialTest.assign(MAX_SERIAL_NUM, INIT_VAL_NTF);
-}
-
-EventNotify::~EventNotify()
-{
-    ::pthread_cond_destroy(&cond);
-    ::pthread_mutex_destroy(&mtx);
-
-    notifier = NULL;
-}
-
-int EventNotify::allocate()
-{
-    int num;
-
-    lock();
-    do {
-        if (serialSize >= serialTest.size()) {
-            log_debug("EventNotify: resize the serialTest, from original size %d, to new size %d",
-                    serialTest.size(), serialTest.size()*2);
-            serialTest.resize(serialTest.size() * 2, INIT_VAL_NTF);
-        }
-        serialNum = (serialNum + 1) % serialTest.size();
-    } while (serialTest[serialNum].used == true);
-    num = serialNum;
-    serialTest[serialNum].used = true;
-    serialTest[serialNum].notified = false; 
-    serialTest[serialNum].freezed = false;
-    serialSize++;
-    unlock();
-
-    return num;
-}
-
-void EventNotify::freeze(int id, void *ret_val)
-{
-    lock();
-    serialTest[id].ret = ret_val;
-    serialTest[id].notified = false;
-    serialTest[id].freezed = true;
-    while (serialTest[id].notified == false) {
-        ::pthread_cond_wait(&cond, &mtx);
-    }
-    serialTest[id].freezed = false;
-    serialTest[id].used = false;
-    serialSize--;
-    unlock();
-}
-
-void EventNotify::notify(int id)
-{
-    test(id);
-    lock();
-    serialTest[id].used = false;
-    serialTest[id].notified = true;
-    ::pthread_cond_broadcast(&cond); 
-    unlock();
-}
-
-timespec SetTime(int usecs) {
-    struct timeval now;
-    struct timespec to;
-
-    gettimeofday(&now, NULL);
-    to.tv_sec = now.tv_sec + usecs / 1000000;
-    to.tv_nsec = now.tv_usec * 1000 + (usecs % 1000000) * 1000;
-
-    return to;
-}
-
-int EventNotify::freeze_i(int id, void *ret_val, int usecs)
-{
-    struct timespec to;
-    bool tmpNotified;
-    bool tmpFreezed;
-    int rc = -1;
-    int count = 0;
-
-    lock();
-    tmpNotified = serialTest[id].notified;
-    tmpFreezed = serialTest[id].freezed;
-
-    serialTest[id].ret = ret_val;
-    serialTest[id].notified = false;
-    serialTest[id].freezed = true;
-    while ((serialTest[id].notified == false) && (!gCtrlBlock->getTermState())) { 
-        to = SetTime(usecs);
-        ::pthread_cond_timedwait(&cond, &mtx, &to);
-        count++;
-    }
-    if (serialTest[id].notified == true) { // The notify is set to true correctly
-        serialTest[id].freezed = false;
-        serialTest[id].used = false;
-        serialSize--;
-        rc = 0;
-    } else { // The freeze is not set correctly. Restore the original value
-        serialTest[id].notified = tmpNotified;
-        serialTest[id].freezed = tmpFreezed;
-        rc = -1;
-    }
-    unlock();
-
-    return rc;
-}
-
-int EventNotify::notify_i(int id, int usecs)
-{
-    if (!test_i(id)) {
-        return -1;
-    }
-    lock();
-    serialTest[id].used = false;
-    serialTest[id].notified = true;
-    ::pthread_cond_broadcast(&cond); 
-    unlock();
-
-    return 0;
-}
-
-void * EventNotify::getRetVal(int id)
-{
-    test(id);
-    return serialTest[id].ret;
-}
-
-bool EventNotify::getState(int id)
-{
-    bool state;
-
-    assert((id >= 0) && (id < serialTest.size()));
-    lock();
-    state = serialTest[id].used;
-    unlock();
-
-    return state;
-}
-
-bool EventNotify::test(int id)
-{
-    assert((id >= 0) && (id < serialTest.size()));
-    while (serialTest[id].freezed == false) {
-        /* Almost impossible running into here */
-        SysUtil::sleep(WAIT_INTERVAL);
-    }
-    assert(serialTest[id].used = true);
-    
-    return true;
-}
-
-bool EventNotify::test_i(int id)
-{
-    assert((id >= 0) && (id < serialTest.size()));
-    while (serialTest[id].freezed == false) {
-        if (gCtrlBlock->getTermState())
-            return false;
-        /* Almost impossible running into here */
-        SysUtil::sleep(WAIT_INTERVAL);
-    }
-    assert(serialTest[id].used = true);
-    
-    return true;
-}
-
-void EventNotify::tryFreeze()
-{
-    lock();
-    while(serialTest[serialNum].freezed == true) {
-        ::pthread_cond_wait(&cond, &mtx);
-    }
-    unlock();
-}
-
-void EventNotify::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void EventNotify::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp
deleted file mode 100644
index 99a3070..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EventNotify
-
- Description: Synchronization between threads
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/05/08 tuhongj      Initial code (D154660)
-
-****************************************************************************/
-
-#ifndef _EVENTNTF_HPP
-#define _EVENTNTF_HPP
-
-#include <pthread.h>
-#include <vector>
-
-const int MAX_SERIAL_NUM = 1024;
-
-struct serialNtfTest 
-{
-    bool    freezed; // freeze() been called?
-    bool    notified; // notify() been called?
-    bool    used;    // allocate() been called?
-    void    *ret;
-};
-
-class EventNotify 
-{
-    private:
-        static EventNotify *notifier;
-        EventNotify();
-        pthread_mutex_t     mtx;
-        pthread_cond_t      cond;
-        int                 serialNum;
-        int                 serialSize;
-        std::vector<struct serialNtfTest> serialTest;
-
-    public:
-        ~EventNotify();
-        static EventNotify * getInstance() {
-            if (notifier == NULL)
-                notifier = new EventNotify();
-            return notifier;
-        }
-
-        int allocate();
-        void freeze(int id, void *ret_val = NULL);
-        int freeze_i(int id, void *ret_val = NULL, int usecs = 1000000);
-        void notify(int id);
-        int notify_i(int id, int usecs = 1000000);
-        void * getRetVal(int id);
-        bool getState(int id);
-
-    private:
-        bool test(int id);
-        bool test_i(int id);
-        void tryFreeze();
-
-        void lock();
-        void unlock();
-};
-
-#define gNotifier EventNotify::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp
deleted file mode 100644
index 0ebd644..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Filter
-
- Description: Filter manipulation.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdlib.h>
-#include <math.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-#include <dlfcn.h>
-
-#include "packer.hpp"
-#include "log.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-#include "filterproc.hpp"
-#include "filter.hpp"
-
-Filter::Filter()
-{
-    info.filter_id = 0;
-    info.so_file = NULL;
-    
-    handler.init_hndlr = NULL;
-    handler.input_hndlr = NULL;
-    handler.term_hndlr = NULL;
-
-    param = NULL;
-    file = NULL;
-}
-
-Filter::Filter(sci_filter_info_t & filter_info)
-{
-    info.filter_id = filter_info.filter_id;
-    info.so_file = filter_info.so_file;
-    
-    handler.init_hndlr = NULL;
-    handler.input_hndlr = NULL;
-    handler.term_hndlr = NULL;
-
-    param = NULL;
-    file = NULL;
-}
-
-Filter::~Filter()
-{
-    if (file) {
-        ::dlclose(file);
-        file = NULL;
-    }
-}
-
-Message * Filter::packMsg()
-{
-    Packer packer;
-    packer.packInt(info.filter_id);
-    packer.packStr(info.so_file);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(info.filter_id, SCI_GROUP_ALL, 1, bufs, sizes, Message::FILTER_LOAD);
-    delete [] bufs[0];
-    return msg;
-}
-
-void Filter::unpackMsg(Message &msg) 
-{
-    Packer packer(msg.getContentBuf());
-
-    info.filter_id = packer.unpackInt();
-    info.so_file = packer.unpackStr();
-}
-
-int Filter::load()
-{
-#if defined(_SCI_LINUX)
-    file = ::dlopen(info.so_file, RTLD_NOW | RTLD_LOCAL);
-#elif defined(__APPLE__)
-    file = ::dlopen(info.so_file, RTLD_NOW | RTLD_LOCAL);
-#else // aix
-    file = ::dlopen(info.so_file, RTLD_NOW | RTLD_LOCAL | RTLD_MEMBER);
-#endif
-    if (file == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    
-    handler.init_hndlr = (filter_init_hndlr *) ::dlsym(file, "filter_initialize");
-    if (handler.init_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    handler.input_hndlr = (filter_input_hndlr *) ::dlsym(file, "filter_input");
-    if (handler.input_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    handler.term_hndlr = (filter_term_hndlr *) ::dlsym(file, "filter_terminate");
-    if (handler.term_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-
-    return handler.init_hndlr(&param);
-}
-
-int Filter::input(sci_group_t group, void *buf, int size)
-{
-    return handler.input_hndlr(param, group, buf, size);
-}
-
-int Filter::unload()
-{
-    int rc = handler.term_hndlr(param);
-
-    // close library handle
-    ::dlclose(file);
-    file = NULL;
-
-    return rc;
-}
-
-int Filter::getId()
-{
-    return info.filter_id;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp
deleted file mode 100644
index d427425..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Filter
-
- Description: Filter manipulation.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _FILTER_HPP
-#define _FILTER_HPP
-
-#include "sci.h"
-#include "general.hpp"
-
-class Message;
-
-class Filter
-{
-    public:
-        struct Handler {
-            filter_init_hndlr    *init_hndlr;
-            filter_input_hndlr   *input_hndlr;
-            filter_term_hndlr    *term_hndlr;
-        };
-        
-    private:
-        sci_filter_info_t        info;
-        Handler                  handler;
-        void                     *param;
-        void                     *file;
-
-    public:
-        Filter();
-        Filter(sci_filter_info_t &filter_info);
-        ~Filter();
-
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-        
-        int load();
-        int input(sci_group_t group, void *buf, int size);
-        int unload();
-
-        int getId();
-        sci_filter_info_t & getInfo() { return info; }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp
deleted file mode 100644
index 518437f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterList
-
- Description: Filter management (Note: STL does not guarantee the safety of 
-              several readers & one writer cowork together, and user threads
-              can query filter information at runtime, so it's necessary 
-              to add a lock to protect these read & write operations).
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/24/08 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#include "filterlist.hpp"
-#include <assert.h>
-
-#include "filter.hpp"
-#include "packer.hpp"
-
-
-FilterList::FilterList()
-    : flistMsg(NULL)
-{
-    filterInfo.clear();
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-FilterList::~FilterList()
-{
-    // delete all loaded filters
-    FILTER_MAP::iterator fit = filterInfo.begin();
-    for (; fit != filterInfo.end(); fit++) {
-        delete (*fit).second;
-    }
-    filterInfo.clear();
-
-    ::pthread_mutex_destroy(&mtx);
-}
-
-int FilterList::loadFilter(int filter_id, Filter * filter, bool invoke)
-{
-    int rc = SCI_SUCCESS;
-    if (invoke) {
-        // call init func
-        rc = filter->load();
-    }
-    
-    if (rc == SCI_SUCCESS) {
-        lock();
-        filterInfo[filter_id] = filter;
-        unlock();
-    }
-
-    return rc;
-}
-
-Filter * FilterList::getFilter(int filter_id)
-{
-    Filter *filter = NULL;
-
-    lock();
-    FILTER_MAP::iterator fit = filterInfo.find(filter_id);
-    if (fit != filterInfo.end()) {
-        filter = (*fit).second;
-    }
-    unlock();
-
-    return filter;
-}
-
-Message * FilterList::packMsg(sci_filter_list_t &flist)
-{
-    int i = 0;
-    char *bufs[1];
-    int sizes[1];
-    Packer packer;
-
-    if (flist.num == 0)
-        return NULL;
-
-    packer.packInt(flist.num);
-    for (i = 0; i < flist.num; i++) {
-        packer.packInt(flist.filters[i].filter_id);
-        packer.packStr(flist.filters[i].so_file);
-    }
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::FILTER_LIST);
-    delete [] bufs[0];
-
-    return msg;
-}
-
-void FilterList::loadFilterList(Message &msg, bool invoke) 
-{
-    int i = 0;
-    Packer packer(msg.getContentBuf());
-    int num = packer.unpackInt();
-    sci_filter_info_t finfo;
-    Filter *filter = NULL;
-    char *bufs[1];
-    int sizes[1];
-
-    for (i = 0; i < num; i++) {
-        finfo.filter_id = packer.unpackInt();
-        finfo.so_file = packer.unpackStr();
-        filter = new Filter(finfo);
-        loadFilter(finfo.filter_id, filter, invoke);
-    }
-
-    bufs[0] = msg.getContentBuf();
-    sizes[0] = msg.getContentLen();
-    flistMsg = new Message();
-    flistMsg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, msg.getType());
-}
-
-int FilterList::unloadFilter(int filter_id, bool invoke)
-{
-    Filter *filter = NULL;
-
-    lock();
-    FILTER_MAP::iterator fit = filterInfo.find(filter_id);
-    if (fit != filterInfo.end()) {
-        filter = (*fit).second;
-    } else {
-        unlock();
-        return SCI_ERR_FILTER_NOTFOUND;
-    }
-
-    filterInfo.erase(filter_id);
-    unlock();
-    
-    int rc = SCI_SUCCESS;
-    if (invoke) {
-        // call term_func
-        rc = filter->unload();
-    }
-    delete filter;
-    
-    return rc;
-}
-
-int FilterList::numOfFilters()
-{
-    int size;
-
-    lock();
-    size = filterInfo.size();
-    unlock();
-
-    return size;
-}
-
-void FilterList::retrieveFilterList(int * ret_val)
-{
-    int i = 0;
-
-    lock();
-    FILTER_MAP::iterator it = filterInfo.begin();
-    for (; it!=filterInfo.end(); ++it) {
-        ret_val[i++] = (*it).first;
-    }
-    unlock();
-}
-
-void FilterList::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void FilterList::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp
deleted file mode 100644
index d55420d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterList
-
- Description: Filter management (Note: STL does not guarantee the safety of 
-              several readers & one writer cowork together, and user threads
-              can query filter information at runtime, so it's necessary 
-              to add a lock to protect these read & write operations).
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/24/08 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _FILTERLIST_HPP
-#define _FILTERLIST_HPP
-
-#include <pthread.h>
-#include <map>
-
-using namespace std;
-
-#include "general.hpp"
-#include "message.hpp"
-
-class Filter;
-
-class FilterList
-{
-    public:
-        typedef map<int, Filter*> FILTER_MAP;
-        
-    private:
-        FILTER_MAP           filterInfo;
-        pthread_mutex_t      mtx;
-        Message              *flistMsg;
-
-    public:
-        FilterList();
-        ~FilterList();
-
-        int loadFilter(int filter_id, Filter *filter, bool invoke = true);
-        int unloadFilter(int filter_id, bool invoke = true);
-        
-        Filter * getFilter(int filter_id);
-        int numOfFilters();
-        void retrieveFilterList(int *ret_val);
-        Message * packMsg(sci_filter_list_t &flist);
-        Message * getFlistMsg() { return flistMsg; }
-        void loadFilterList(Message &msg, bool invoke = true);
-
-    private:
-        void lock();
-        void unlock();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp
deleted file mode 100644
index 5946fdc..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterProcessor
-
- Description: Properties of class 'FilterProcessor':
-    input: a. a message queue
-    output: a. a stream
-            b. a message queue
-    action: use user-defined filter handlers to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "filterproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "atomic.hpp"
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "queue.hpp"
-#include "eventntf.hpp"
-#include "observer.hpp"
-
-FilterProcessor::FilterProcessor(int hndl, FilterList *flist)
-    : Processor(hndl), filterList(flist), filtered(false), curFilterID(SCI_FILTER_NULL)
-{
-    name = "UpstreamFilter";
-
-    inQueue = NULL;
-    outQueue = NULL;
-
-    observer = NULL;
-}
-
-FilterProcessor::~FilterProcessor()
-{
-    delete inQueue;
-}
-
-Message * FilterProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-
-    filtered = false;
-    msg = inQueue->consume();
-    
-    return msg;
-}
-
-void FilterProcessor::process(Message * msg)
-{
-    int id = msg->getFilterID();
-    if (id != SCI_FILTER_NULL) {
-        Filter *filter = filterList->getFilter(id);
-        // call user's filter handler
-        if (filter != NULL) {
-            curFilterID = id;
-            
-            filtered = true;
-            filter->input(msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-        }
-    }
-}
-
-void FilterProcessor::write(Message * msg)
-{
-    assert(outQueue);
-
-    if (filtered) {
-        inQueue->remove();
-        return;
-    }
-
-    if (observer) {
-        observer->notify();
-    }
-
-    incRefCount(msg->getRefCount());
-    outQueue->produce(msg);
-
-    inQueue->remove();
-}
-
-void FilterProcessor::seize()
-{
-    setState(false);
-}
-
-int FilterProcessor::recover()
-{
-    // TODO
-    return -1;
-}
-
-void FilterProcessor::clean()
-{
-}
-
-void FilterProcessor::deliever(Message * msg)
-{
-    if (observer) {
-        observer->notify();
-    }
-    outQueue->produce(msg);
-}
-
-int FilterProcessor::getCurFilterID()
-{
-    return curFilterID;
-}
-
-void FilterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-void FilterProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void FilterProcessor::setObserver(Observer * ob)
-{
-    observer = ob;
-}
-
-MessageQueue * FilterProcessor::getInQueue()
-{
-    return inQueue;
-}
-
-MessageQueue * FilterProcessor::getOutQueue()
-{
-    return outQueue;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp
deleted file mode 100644
index 69e722e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterProcessor
-
- Description: Properties of class 'FilterProcessor':
-    input: a. a message queue
-    output: a. a message queue
-    action: use user-defined filter handlers to process the messages
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _FILTERPROC_HPP
-#define _FILTERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class Observer;
-class FilterList;
-
-class FilterProcessor : public Processor 
-{
-    private:
-        FilterList          *filterList;
-
-        Observer            *observer;
-
-        bool                filtered;
-        int                 curFilterID;
-
-    public:
-        FilterProcessor(int hndl = -1, FilterList *flist = NULL);
-        ~FilterProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        void deliever(Message *msg);
-        int getCurFilterID();
-
-        void setInQueue(MessageQueue *queue);
-        void setOutQueue(MessageQueue *queue);
-
-        void setObserver(Observer *ob);
-        MessageQueue * getInQueue();
-        MessageQueue * getOutQueue();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp
deleted file mode 100644
index 8d04617..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: General definitions.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _GENERAL_HPP
-#define _GENERAL_HPP
-
-#include <assert.h>
-#include <pthread.h>
-
-#define VALIDBACKENDIDS (-1024*1024*1024)
-#define INVLIDSUCCESSORID (-999999999)
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp
deleted file mode 100644
index f9b7def..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: HandlerProcessor
-
- Description: Properties of class 'HandlerProcessor':
-    input: a. a message queue
-    output: none
-    action: use handler in sci_info_t to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "handlerproc.hpp"
-#include <stdlib.h>
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "eventntf.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-
-HandlerProcessor::HandlerProcessor(int hndl) 
-    : Processor(hndl)
-{
-    name = "Handler";
-
-    inQueue = NULL;
-
-    switch (gCtrlBlock->getMyRole()) {
-        case CtrlBlock::FRONT_END:
-            hndlr = gCtrlBlock->getEndInfo()->fe_info.hndlr;
-            param = gCtrlBlock->getEndInfo()->fe_info.param;
-            break;
-        case CtrlBlock::BACK_END:
-        case CtrlBlock::BACK_AGENT:
-            hndlr = gCtrlBlock->getEndInfo()->be_info.hndlr;
-            param = gCtrlBlock->getEndInfo()->be_info.param;
-            break;
-        default:
-            assert(!"Should never go here!");
-    }
-}
-
-HandlerProcessor::~HandlerProcessor()
-{
-    if (inQueue)
-        delete inQueue;
-}
-
-Message * HandlerProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-    msg = inQueue->consume();
-    
-    if (msg && (msg->getType() == Message::SEGMENT)) {
-        int segnum = msg->getID() - 1; // exclude the SEGMENT header
-        Message **segments = (Message **)::malloc(segnum * sizeof(Message *));
-        inQueue->remove();
-
-        msg = new Message();
-        inQueue->multiConsume(segments, segnum);
-        msg->joinSegments(segments, segnum);
-        ::free(segments);
-    }
-
-    return msg;
-}
-
-void HandlerProcessor::process(Message * msg)
-{
-    switch(msg->getType()) {
-        case Message::COMMAND:
-        case Message::DATA:
-            hndlr(param, msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void HandlerProcessor::write(Message * msg)
-{
-    // almost no action
-    inQueue->remove();
-}
-
-void HandlerProcessor::seize()
-{
-    setState(false); 
-}
-
-int HandlerProcessor::recover()
-{
-    // TODO
-    return -1;
-}
-
-void HandlerProcessor::clean()
-{
-    // no action
-}
-
-void HandlerProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp
deleted file mode 100644
index 2c5c012..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: HandlerProcessor
-
- Description: Properties of class 'HandlerProcessor':
-    input: a. a message queue
-    output: none
-    action: use handler in sci_info_t to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _HANDLERPROC_HPP
-#define _HANDLERPROC_HPP
-
-#include "sci.h"
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class HandlerProcessor : public Processor 
-{
-    private:
-        SCI_msg_hndlr       *hndlr;
-        void                *param;
-
-    public:
-        HandlerProcessor(int hndl = -1);
-        ~HandlerProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        void setInQueue(MessageQueue *queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp
deleted file mode 100644
index 95e447b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp
+++ /dev/null
@@ -1,618 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Initializer
-
- Description: Prepare the environment when startup, which includes:
-        1) Processor threads
-        2) Message queue
-        3) Others like environment variables
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-   07/19/12 ronglli    Optimize the user query
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <assert.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <pwd.h>
-
-#include "sci.h"
-
-#include "log.hpp"
-#include "socket.hpp"
-#include "stream.hpp"
-#include "exception.hpp"
-#include "sshfunc.hpp"
-
-#include "embedagent.hpp"
-#include "initializer.hpp"
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "topology.hpp"
-#include "launcher.hpp"
-#include "queue.hpp"
-#include "message.hpp"
-#include "readerproc.hpp"
-#include "writerproc.hpp"
-#include "filterproc.hpp"
-#include "handlerproc.hpp"
-#include "routerproc.hpp"
-#include "purifierproc.hpp"
-#include "observer.hpp"
-#include "listener.hpp"
-#include "eventntf.hpp"
-#include "allocator.hpp"
-#include "filterlist.hpp"
-
-#include "tools.hpp"
-
-Initializer* Initializer::instance = NULL;
-
-Initializer::Initializer()
-    : listener(NULL), inStream(NULL), handle(-1), parentAddr(""), parentPort(-1), parentID(-1), pInfoUpdated(false)
-{
-    notifyID = gNotifier->allocate();
-}
-
-Initializer::~Initializer()
-{
-    instance = NULL;
-    if (listener) {
-        listener->stop();
-        delete listener;
-    }
-    // inStream will be deleted in Writer
-}
-
-int Initializer::init()
-{
-    int rc = SCI_SUCCESS;
-    int level = Log::INFORMATION;
-    int mode = Log::DISABLE;
-    char dir[MAX_PATH_LEN] = "/tmp";
-    char *envp = NULL; 
-    int hndl = -1;
-
-    envp = ::getenv("SCI_LOG_DIRECTORY"); 
-    if (envp != NULL) {
-        ::strncpy(dir, envp, sizeof(dir));
-    }
-    envp = ::getenv("SCI_LOG_LEVEL"); 
-    if (envp != NULL)
-        level = ::atoi(envp);
-   
-    envp = ::getenv("SCI_LOG_ENABLE");
-    if ((envp != NULL) && (strcasecmp(envp, "yes") == 0)) {
-        mode = Log::ENABLE;
-    }
-
-    try {
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            Log::getInstance()->init(dir, "fe.log", level, mode);
-            log_debug("I am a front end, my handle is %d", gCtrlBlock->getMyHandle());
-        } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-            Log::getInstance()->init(dir, "scia.log", level, mode);
-            log_debug("I am an agent, my handle is %d", gCtrlBlock->getMyHandle());
-        } else {
-            Log::getInstance()->init(dir, "be.log", level, mode);
-            log_debug("I am a back end, my handle is %d", gCtrlBlock->getMyHandle());
-        }
-
-        if (SSHFUNC == NULL)
-            return SCI_ERR_SSHAUTH;
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            rc = initFE();
-        } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-            rc = initAgent();
-        } else {
-            rc = initBE();
-        }
-    } catch (Exception &e) {
-        log_error("Initializer: exception %s", e.getErrMsg());
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (ThreadException &e) {
-        log_error("Initializer: thread exception %d", e.getErrCode());
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (SocketException &e) {
-        log_error("Initializer: socket exception: %s", e.getErrMsg().c_str());
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (std::bad_alloc) {
-        log_error("Initializer: out of memory");
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (...) {
-        log_error("Initializer: unknown exception");
-        return SCI_ERR_INITIALIZE_FAILED;
-    }
-
-    return rc;
-}
-
-Listener * Initializer::getListener()
-{
-    return listener;
-}
-
-Stream * Initializer::getInStream()
-{
-    return inStream;
-}
-
-void Initializer::setInStream(Stream * s)
-{
-    inStream = s;
-}
-
-Listener * Initializer::initListener()
-{
-    if (listener)
-        return listener;
-
-    listener = new Listener(-1);
-    listener->init();
-    listener->start();
-
-    return listener;
-}
-
-int Initializer::initFE()
-{
-    char *envp = NULL;
-    handle = gCtrlBlock->getMyHandle();
-    EmbedAgent *feAgent = NULL;
-
-    Topology *topo = new Topology(handle);
-    int rc = topo->init();
-    if (rc != SCI_SUCCESS)
-        return rc;
-    gCtrlBlock->enable();
-
-    rc = gCtrlBlock->setUsername();
-    if (rc != SCI_SUCCESS)
-        return rc;
-
-    feAgent = new EmbedAgent();
-    feAgent->init(-1, NULL, NULL);
-    HandlerProcessor *handler = NULL;
-    if (gCtrlBlock->getEndInfo()->fe_info.mode == SCI_INTERRUPT) {
-        // interrupt mode
-        handler = new HandlerProcessor();
-        handler->setInQueue(feAgent->getUpQueue());
-        handler->setSpecific(feAgent->genPrivateData());
-        gCtrlBlock->setHandlerProcessor(handler);
-    } else {
-        // polling mode
-        Observer *ob = new Observer();
-        gCtrlBlock->setObserver(ob);
-        gCtrlBlock->setPollQueue(feAgent->getFilterProcessor()->getOutQueue());
-        feAgent->getFilterProcessor()->setObserver(ob);
-    }
-    if (handler) {
-        handler->start();
-    }
-    feAgent->getRoutingList()->getTopology()->setInitID();
-    rc = feAgent->work();
-    gAllocator->reset();
-
-    Message *flistMsg = gCtrlBlock->getFilterList()->packMsg(gCtrlBlock->getEndInfo()->fe_info.filter_list);
-    MessageQueue *routerInQ = feAgent->getRouterInQ();
-    routerInQ->produce(flistMsg);
-    Message *topoMsg = topo->packMsg();
-    routerInQ->produce(topoMsg);
-    rc = feAgent->syncWait();
-    delete topo;
-
-    return rc;
-}
-
-int Initializer::initAgent()
-{ 
-    int hndl = -1;
-    EmbedAgent *agent = NULL;
-    char *envp;
-    int rc;
-
-    rc = gCtrlBlock->setUsername();
-    if (rc != SCI_SUCCESS)
-        return rc;
-
-    envp = ::getenv("SCI_REMOTE_SHELL");
-    if (envp != NULL) {
-		rc = connectBack();
-        if (rc != 0)
-            return rc;
-    } else {
-        inStream = initStream();
-    }
-
-    // get hostname and port no from environment variable.
-    envp = ::getenv("SCI_WORK_DIRECTORY");
-    if (envp != NULL) {
-        ::chdir(envp);
-        log_debug("Change working directory to %s", envp);
-    }
-
-    envp = ::getenv("SCI_PARENT_HOSTNAME");
-    if (envp != NULL) {
-        parentAddr = envp;
-    }
-
-    envp = ::getenv("SCI_PARENT_PORT");
-    if (envp != NULL) {
-        parentPort = ::atoi(envp);
-    }
-    hndl = gCtrlBlock->getMyHandle();
-    log_debug("My parent host is %s, parent port is %d, my ID is %d", parentAddr.c_str(), parentPort, hndl);
-
-    agent = new EmbedAgent();
-    agent->init(hndl, inStream, NULL);
-    gCtrlBlock->enable();
-    agent->getRoutingList()->getTopology()->setInitID();
-    rc = agent->work();
-    rc = agent->syncWait();
-
-    return rc;
-}
-
-Stream * Initializer::initStream()
-{
-    int rc;
-    string envStr;
-    Stream *stream = new Stream();  
-    struct iovec token = {0};
-    struct iovec sign = {0};
-
-    stream->init(STDIN_FILENO);
-    *stream >> token >> envStr >> sign >> endl;
-    setEnvStr(envStr);
-    SSHFUNC->set_user_token(&token);
-    rc = psec_verify_data(&sign, "%s", envStr.c_str());
-    delete [] (char *)sign.iov_base;
-    if (rc != 0)
-        throw Exception(Exception::INVALID_SIGNATURE);
-
-    parseEnvStr(envStr);
-
-    return stream;
-}
-
-int Initializer::parseEnvStr(string &envStr)
-{  
-     char *envp;
-     char dir[MAX_PATH_LEN];
-     int level = -1;
-     int mode = Log::INVALID;
-     int hndl = -1;
-     int jobkey;
-     
-     char *st = strdup(envStr.c_str());
-     int st_size=envStr.size();
-     char *key = NULL;
-     char *value = NULL;
-     char *delim=";";
-     char *saveptr=NULL;
-     key=strtok_r(st,delim,&saveptr);
-     if( (key != NULL) && (key < st + st_size))
-     {
-        value = strchr(key,'=');
-        if(value != NULL)
-        {
-            (*value) = '\0';
-            if((value != key)&&((value + 1) != NULL) && ((value+1) < (st + st_size)))
-            {
-              if((*(value+1)) == '\0')
-                 ::setenv(key,"",1);
-              else
-                 ::setenv(key,value+1,1);
-            }
-        }
-        else{
-           ::setenv(key,"",1);
-        }
-
-        while(key = strtok_r(NULL,delim,&saveptr))
-        {
-            value = strchr(key,'=');
-            if(value != NULL)
-            {
-                (*value) = '\0';
-                if((value != key)&&((value + 1) != NULL) && ((value+1) < (st + st_size)))
-                {
-                  if((*(value+1)) == '\0')
-                     ::setenv(key,"",1);
-                  else
-                     ::setenv(key,value+1,1);
-                }
-            }
-            else{
-               ::setenv(key,"",1);
-            }
-        }
-     }
-   
-    free(st);
-
-    envp = getenv("SCI_CLIENT_ID");
-    assert(envp != NULL);
-    hndl = atoi(envp);
-    gCtrlBlock->setMyHandle(hndl);
-    envp = getenv("SCI_JOB_KEY");
-    assert(envp != NULL);
-    jobkey = atoi(envp);
-    gCtrlBlock->setJobKey(jobkey);
-    envp = ::getenv("SCI_EMBED_AGENT");
-    if ((envp != NULL) && (strcasecmp(envp, "yes") == 0) && (hndl < 0)) {
-        gCtrlBlock->setMyRole(CtrlBlock::BACK_AGENT);
-    }
-    envp = ::getenv("SCI_FLOWCTL_THRESHOLD");
-    if (envp != NULL) {
-        long long th = ::atoll(envp);
-        if (th > 0) {
-            gCtrlBlock->setFlowctlThreshold(th);
-        }
-    }
-    envp = ::getenv("SCI_LOG_LEVEL"); 
-    if (envp != NULL)
-        level = ::atoi(envp);
-    envp = ::getenv("SCI_LOG_ENABLE");
-    if (envp != NULL) {
-        if (strcasecmp(envp, "yes") == 0) {
-            mode = Log::ENABLE;
-        } else if (strcasecmp(envp, "no") == 0) {
-            mode = Log::DISABLE;
-        }
-    }
-    envp = ::getenv("SCI_LOG_DIRECTORY");
-    if (envp != NULL) {
-        ::strncpy(dir, envp, MAX_PATH_LEN-1);
-        dir[MAX_PATH_LEN-1] = '\0';
-        log_rename(dir, level, mode);
-    } else {
-        log_rename(NULL, level, mode);
-    }
-
-    return 0;
-}
-
-int Initializer::connectBack()
-{
-	struct iovec sign = {0};
-    int hndl = -1;
-	char *envp = NULL;
-
-    handle = gCtrlBlock->getMyHandle();
-    if ((!getenv("SCI_PARENT_HOSTNAME") || !getenv("SCI_PARENT_PORT") || !getenv("SCI_PARENT_ID"))
-            && (::getenv("SCI_REMOTE_SHELL") == NULL)) {
-        int rc = initExtBE(handle);
-        if (rc != 0)
-			return rc;
-    } 
-
-	envp = ::getenv("SCI_PARENT_HOSTNAME");
-	if (envp != NULL) {
-		parentAddr = envp;
-	}
-	envp = ::getenv("SCI_PARENT_PORT");
-	if (envp != NULL) {
-		parentPort = ::atoi(envp);
-	}
-	envp = ::getenv("SCI_PARENT_ID");
-	if (envp != NULL) {
-		parentID = ::atoi(envp);
-	}
-
-    hndl = gCtrlBlock->getMyHandle();       // hndl may change
-    handle = hndl; 
-	inStream = new Stream();
-	inStream->init(parentAddr.c_str(), parentPort);
-	psec_sign_data(&sign, "%d%d%d", gCtrlBlock->getJobKey(), hndl, parentID);
-	*inStream << gCtrlBlock->getJobKey() << hndl << parentID << sign << endl;
-    *inStream >> endl;
-	psec_free_signature(&sign);
-    log_debug("My parent host is %s, parent port is %d, parent id is %d", parentAddr.c_str(), parentPort, parentID);
-
-	return 0;
-}
-
-int Initializer::initBE()
-{
-    int hndl;
-    int rc = SCI_SUCCESS;
-    char *envp = ::getenv("SCI_USE_EXTLAUNCHER");
-    if (((envp != NULL) && (::strcasecmp(envp, "yes") == 0))
-			|| (::getenv("SCI_REMOTE_SHELL") != NULL)) {
-		rc = connectBack();
-        if (rc != 0)
-            return rc;
-		if (handle < 0) {
-			gCtrlBlock->setMyRole(CtrlBlock::BACK_AGENT);
-		}
-    } else {
-        inStream = initStream();
-    }
-    gCtrlBlock->enable();
-
-    // get hostname and port no from environment variable.
-    envp = ::getenv("SCI_WORK_DIRECTORY");
-    if (envp != NULL) {
-        chdir(envp);
-        log_debug("Change working directory to %s", envp);
-    }
-
-    hndl = gCtrlBlock->getMyHandle();
-    log_debug("My ID is %d", hndl);
-
-    PurifierProcessor *purifier = new PurifierProcessor(hndl);
-    gCtrlBlock->setPurifierProcessor(purifier);
-
-    if (gCtrlBlock->getEndInfo()->be_info.mode == SCI_POLLING) {
-        // polling mode
-        MessageQueue *sysQ = new MessageQueue();
-        sysQ->setName("sysQ");
-
-        Observer *ob = new Observer();
-        gCtrlBlock->setObserver(ob);
-        gCtrlBlock->setPollQueue(sysQ);
-        purifier->setObserver(ob);
-        purifier->setOutQueue(sysQ);
-    }
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT) {
-        rc = gCtrlBlock->setUsername();
-        if (rc != SCI_SUCCESS)
-            return rc;
-
-        EmbedAgent *beAgent = new EmbedAgent();
-        beAgent->init(hndl, inStream, NULL);
-        gCtrlBlock->setMyEmbedHandle(hndl);
-        beAgent->getRoutingList()->getTopology()->setInitID();
-        rc = beAgent->work();
-        rc = beAgent->syncWait();
-    } else {
-        MessageQueue *userQ = new MessageQueue();
-        userQ->setName("userQ");
-        gCtrlBlock->setUpQueue(userQ);
-
-        purifier->setInStream(inStream);
-        WriterProcessor *writer = new WriterProcessor(hndl);
-        // writer is a peer processor of purifier
-        purifier->setPeerProcessor(writer);
-
-        writer->setInQueue(userQ);
-        writer->setOutStream(inStream);
-        purifier->start();
-        writer->start();
-    }
-
-    return rc;
-}
-
-int Initializer::initExtBE(int hndl)
-{
-    string envStr;
-    char hostname[256];
-
-    Stream stream;
-    string username;
-    psec_idbuf_desc &usertok = SSHFUNC->get_token();
-    struct iovec sign = {0};
-    struct iovec token = {0};
-    int rc, tmp0, tmp1, tmp2;
-    int port = SCID_PORT;
-    Launcher::MODE mode = Launcher::REQUEST;
-    int jobKey = gCtrlBlock->getJobKey();
-    struct servent *serv = NULL;
-    char *envp = getenv("SCI_DAEMON_NAME");
-    char fmt[32] = {0};
-
-    rc = gCtrlBlock->setUsername();
-    if (rc != SCI_SUCCESS)
-        return rc;
-    username = gCtrlBlock->getUsername();
-
-    if (envp != NULL) {
-        serv = getservbyname(envp, "tcp");
-    } else {
-        serv = getservbyname(SCID_NAME, "tcp");
-    }
-    if (serv != NULL) {
-        port = ntohs(serv->s_port);
-    }
-    rc = psec_sign_data(&sign, "%d%d%d", mode, jobKey, hndl);
-    ::gethostname(hostname, sizeof(hostname));
-    stream.init(hostname, port);
-    stream << username.c_str() << usertok << sign << (int)mode << jobKey << hndl << endl;
-    psec_free_signature(&sign);
-    stream >> envStr >> token >> sign >> endl;
-    setEnvStr(envStr);
-    stream.stop();
-    sprintf(fmt, "%%s%%%ds", token.iov_len);
-    rc = psec_verify_data(&sign, fmt, envStr.c_str(), token.iov_base);
-    SSHFUNC->set_user_token(&token);
-    delete [] (char *)sign.iov_base;
-    if (rc != 0)
-        return -1; 
-    parseEnvStr(envStr);
-    return 0;
-}
-
-void Initializer::setParentAddr(char * addr)
-{
-    parentAddr = addr;
-}
-
-string & Initializer::getParentAddr()
-{
-    return parentAddr;
-}
-
-int Initializer::updateParentInfo(char * addr, int port)
-{
-    while (pInfoUpdated == true) {
-        if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode()) || (!gCtrlBlock->getParentInfoWaitState())) {
-            return SCI_ERR_INVALID_CALLER;
-        }
-        SysUtil::sleep(WAIT_INTERVAL);
-    }
-    parentAddr = addr;
-    parentPort = port;
-    pInfoUpdated = true;
-    gNotifier->freeze(notifyID);
-    notifyID = gNotifier->allocate();
-
-    return SCI_SUCCESS;
-}
-
-void Initializer::setParentPort(int port)
-{
-    parentPort = port;
-}
-
-int Initializer::getParentPort()
-{
-    return parentPort;
-}
-
-int Initializer::getParentID()
-{
-    return parentID;
-}
-
-int Initializer::getOrgHandle()
-{
-    return handle;
-}
-
-
-void Initializer::setEnvStr(string env)
-{
-    initEnv = env;
-    return;
-}
-
-string Initializer::getEnvStr()
-{
-   return initEnv;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp
deleted file mode 100644
index 4cda5a6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Initializer
-
- Description: Prepare the environment when startup, which includes:
-        1) Processor threads
-        2) Message queue
-        3) Others like environment variables
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _INITIALIZER_HPP
-#define _INITIALIZER_HPP
-
-#include <string>
-
-#include "ctrlblock.hpp" 
-
-using namespace std;
-
-class Stream;
-class Listener;
-
-#define SCID_PORT 6188
-#define SCID_NAME "sciv1" 
-
-class Initializer
-{
-    public:
-        bool        pInfoUpdated;
-        int         notifyID;
-    private:
-        Initializer();
-        static Initializer *instance;
-        Listener    *listener;
-        Stream      *inStream;
-    
-        int         handle;
-        string      parentAddr;
-        int         parentPort;
-        int         parentID;
-
-        string      initEnv;
-
-    public:
-        ~Initializer();
-        static Initializer* getInstance() {
-            if (instance == NULL)
-                instance = new Initializer();
-            return instance;
-        }
-
-        int init();
-        string getEnvStr();
-        Listener * initListener();
-        Listener * getListener();
-        Stream * getInStream();
-        void setInStream(Stream * s);
-
-        int updateParentInfo(char * addr, int port);
-        void setParentAddr(char * addr);
-        string & getParentAddr();
-        void setParentPort(int port);
-        int getParentPort();
-        int getParentID();
-        int getOrgHandle();
-		
-    private:
-        int initFE();
-        int initAgent();
-        Stream *initStream();
-        int initBE();
-        int initExtBE(int hndl);
-        int getIntToken();
-        int parseEnvStr(string &envStr);
-        int connectBack();
-        void setEnvStr(string env);
-};
-
-#define gInitializer Initializer::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/launcher.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/launcher.cpp
deleted file mode 100644
index a43abbd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/launcher.cpp
+++ /dev/null
@@ -1,962 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Launcher
-
- Description: Runtime Launch the clients.
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   06/21/10 tuhongj   Initial code (D153875)
-   07/19/12 ronglli   Fix tree4 external launching mode support
-   07/19/12 ronglli   Optimize tree launching   
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <math.h>
-#include <ctype.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <pwd.h>
-
-#include "log.hpp"
-#include "tools.hpp"
-#include "packer.hpp"
-#include "exception.hpp"
-#include "sshfunc.hpp"
-#include "ipconverter.hpp"
-
-#include "atomic.hpp"
-#include "launcher.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-#include "initializer.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "routinglist.hpp"
-#include "filterlist.hpp"
-#include "processor.hpp"
-#include "eventntf.hpp"
-#include "listener.hpp"
-#include "sshfunc.hpp"
-#include "purifierproc.hpp"
-#include "embedagent.hpp"
-
-#ifdef __APPLE__
-extern char **environ;
-#endif
-
-#define WAIT_TIMES 600 // 600s
-
-Launcher::Launcher(Topology &topo)
-	: topology(topo), shell(""), localName(""), scidPort(SCID_PORT), mode(INTERNAL), embedMode(false), waitTimes(WAIT_TIMES)
-{
-}
-
-Launcher::~Launcher()
-{
-    env.unsetAll();
-    childMap.clear();
-}
-
-int Launcher::initEnv()
-{
-    char *envp = NULL;
-    string envStr;
-    struct servent *serv = NULL;
-    childMap.clear();
-
-    envp = getenv("SCI_DAEMON_NAME");
-    if (envp != NULL) {
-        serv = getservbyname(envp, "tcp");
-    } else {
-        serv = getservbyname(SCID_NAME, "tcp");
-    }
-    if (serv != NULL) {
-        scidPort = ntohs(serv->s_port);
-    }
-    envp = ::getenv("SCI_DEVICE_NAME");
-    if (envp) {
-        IPConverter converter;
-        string ifname = envp;
-        if (converter.getIP(ifname, true, localName) != 0) {
-            localName = "";
-            log_error("Launcher: invalid device name(%s). Will use the localhost", ifname.c_str());
-        } else {
-            env.set("SCI_DEVICE_NAME", envp);
-        }
-    } 
-    if (localName == "") {
-        char tmp[256] = {0};
-        ::gethostname(tmp, sizeof(tmp));
-        localName = SysUtil::get_hostname(tmp);
-        if (localName == "") {
-            localName = tmp;
-        }
-    }
-    int jobKey = gCtrlBlock->getJobKey();
-
-    env.set("SCI_JOB_KEY", jobKey);
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        env.set("SCI_WORK_DIRECTORY", ::getenv("PWD"));
-    } else {
-        env.set("SCI_WORK_DIRECTORY", ::getenv("SCI_WORK_DIRECTORY"));
-    }
-    envp = ::getenv("SCI_EMBED_AGENT");
-    if ((envp != NULL) && (strcasecmp(envp, "yes") == 0)) {
-        embedMode = true;
-        env.set("SCI_EMBED_AGENT", envp);
-    }
-    env.set("SCI_AGENT_PATH", topology.agentPath);
-    envp = ::getenv("SCI_LIB_PATH");
-    if (envp) {
-        env.set("SCI_LIB_PATH", envp);
-        envStr = envp;
-    }
-#if defined(_SCI_LINUX)
-    char *library_path = "LD_LIBRARY_PATH";
-#elif defined(__APPLE__)
-    char *library_path = "DYLD_LIBRARY_PATH";
-#else
-    char *library_path = "LIBPATH";
-#endif
-    envp = ::getenv(library_path);
-    if (envp) {
-        if (envStr.length()) {
-            envStr += ":";
-            envStr += envp;
-        } else {
-            envStr = envp;
-        }
-    }
-    if (envStr.length()) {
-        env.set(library_path, envStr);
-    }
-    
-    env.set("SCI_LOG_DIRECTORY", ::getenv("SCI_LOG_DIRECTORY"));
-    env.set("SCI_LOG_LEVEL", ::getenv("SCI_LOG_LEVEL"));
-    env.set("SCI_LOG_ENABLE", ::getenv("SCI_LOG_ENABLE"));
-    envp = ::getenv("SCI_WAIT_TIMES");
-    if (envp) {
-        waitTimes = atoi(envp);
-		env.set("SCI_WAIT_TIMES", waitTimes);
-    }
-    envp = ::getenv("SCI_REMOTE_SHELL");
-    if (envp) {
-        shell = envp;
-		env.set("SCI_REMOTE_SHELL", shell);
-    }
-    env.set("SCI_USE_EXTLAUNCHER", "no");
-    envp = ::getenv("SCI_USE_EXTLAUNCHER");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        mode = REGISTER;
-        env.set("SCI_USE_EXTLAUNCHER", "yes");
-    }
-    env.set("SCI_ENABLE_FAILOVER", "no");
-    envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        env.set("SCI_ENABLE_FAILOVER", "yes");
-    }
-    envp = ::getenv("SCI_DEBUG_TREE");
-    if (envp) {
-        env.set("SCI_DEBUG_TREE", envp);
-    }
-    envp = ::getenv("SCI_SEGMENT_SIZE");
-    if (envp) {
-        env.set("SCI_SEGMENT_SIZE", envp);
-    }
-
-    // add any tool specific environment variables
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        char **tool_envp = NULL;
-        tool_envp = gCtrlBlock->getEndInfo()->fe_info.beenvp;
-        if (tool_envp) {
-            while (*tool_envp) {
-                // filter out SCI_ and library path.
-                if (::strncmp(*tool_envp, "SCI_", 4) && 
-                        ::strncmp(*tool_envp, library_path, ::strlen(library_path))) {
-                    char *envstr = strdup(*tool_envp);
-                    char *value = ::strchr(envstr, '=');
-                    if (value) {
-                        *value = '\0';
-                        env.set(envstr, value+1);
-                    }
-                    free(envstr);
-                }
-                tool_envp++;
-            }
-        }
-    } else { 
-        string savedEnv = gInitializer->getEnvStr();
-        int size = savedEnv.size();
-        char *st =  strdup(savedEnv.c_str());
-        char *key = NULL;
-        char *value = NULL;
-        const char *delim = ";";
-        char *savePtr1 = NULL;
-        key=strtok_r(st,delim,&savePtr1);
-        if((key!= NULL) && (key < (st + size))) {
-            if (::strncmp(key, "SCI_", 4) && 
-                    ::strncmp(key, library_path, ::strlen(library_path))) {
-                value = strchr(key,'=');
-                if(value != NULL) {
-                    (*value) = '\0';
-                    if((value!= key)&&((value + 1) != NULL) && ((value+1) < (st + size))) { 
-                        if((*(value+1)) == '\0')
-                            env.set(key,"");
-                        else
-                            env.set(key,value+1);
-                    }
-                } else {
-                    env.set(key,"");
-                }
-            }
-            while(key = strtok_r(NULL,delim,&savePtr1)) { 
-                if (::strncmp(key, "SCI_", 4) && 
-                        ::strncmp(key, library_path, ::strlen(library_path))) { 
-                    value = strchr(key,'=');
-                    if(value != NULL) {
-                        (*value) = '\0';
-                        if((value != key)&&((value + 1) != NULL) && ((value+1) < (st + size))) {
-                            if((*(value+1)) == '\0')
-                                env.set(key,"");
-                            else
-                                env.set(key,value+1);
-                        }
-                    } else {
-                        env.set(key,"");
-                    }
-                }
-            }
-        }
-        free(st);
-    }
-    env.set("SCI_PARENT_HOSTNAME", localName);
-    env.set("SCI_ENABLE_LISTENER", ::getenv("SCI_ENABLE_LISTENER"));
-    env.set("SCI_PARENT_ID", topology.agentID);
-    // flow control threshold
-    env.set("SCI_FLOWCTL_THRESHOLD", gCtrlBlock->getFlowctlThreshold());
-    
-    log_debug("Launcher: env(%s)", env.getEnvString().c_str());
-    return SCI_SUCCESS;
-}
-
-int Launcher::launch()
-{
-    int tree = 2;
-    int rc = 0;
-
-    char *envp = ::getenv("SCI_DEBUG_TREE");
-    if (envp) {
-        tree = ::atoi(envp);
-    }
-
-    try {
-        initEnv();
-        switch (tree) {
-            case 1:
-                rc = launch_tree1();
-                break;
-            case 2:
-                rc = launch_tree2();
-                break;
-            case 3:
-                rc = launch_tree3();
-                break;
-            case 4:
-                rc = launch_tree4();
-                break;
-            default:
-                return -1;
-        }
-        if (rc != SCI_SUCCESS) {
-            return rc;
-        }
-
-        if ((shell.empty()) && (childMap.size() > 0)) {
-            rc = startAll();
-            if (rc != SCI_SUCCESS) {
-                return rc;
-            }
-        }
-        envp = getenv("SCI_ENABLE_LISTENER");
-        if ((envp != NULL) && (strcasecmp(envp, "yes") == 0)) {
-            gInitializer->initListener();
-        }
-    } catch (std::bad_alloc) {
-        log_error("Launcher: out of memory");
-        return SCI_ERR_NO_MEM;
-    } catch (SocketException &e) {
-        log_error("Launcher: socket exception: %s", e.getErrMsg().c_str());
-        return SCI_ERR_LAUNCH_FAILED;
-    } catch (ThreadException &e) {
-        log_error("Launcher: thread exception %d", e.getErrCode());
-        return SCI_ERR_LAUNCH_FAILED;
-    } catch (...) {
-        log_error("Launcher: unknown exception");
-        return SCI_ERR_LAUNCH_FAILED;
-    }
-    if ((mode == REGISTER) || !shell.empty()) {
-        int times = 0;
-        while (!topology.routingList->allRouted()) {
-            if (times >= (waitTimes * 1000000  / WAIT_INTERVAL))
-                return SCI_ERR_LAUNCH_FAILED;
-            times++;
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-    }
-   
-    /*Moved the reader start into startRouting*/ 
-    /* if (rc == SCI_SUCCESS)
-       rc = topology.routingList->startReaders();
-    }*/
- 
-    return rc;
-}
-
-int Launcher::startAll()
-{
-    int rc = SCI_SUCCESS;
-    CHILD_MAP::iterator it;
-    int hndl;
-    Stream *stream;
-
-    try {
-        for (it = childMap.begin(); it != childMap.end(); ++it) {
-            struct iovec sign = {0};
-            psec_idbuf_desc &usertok = SSHFUNC->get_token();
-            hndl = it->first;
-            stream = it->second;
-
-            env.set("SCI_CLIENT_ID", hndl);
-            log_debug("Launcher: start client(%d)", hndl); 
-            psec_sign_data(&sign, "%s", env.getEnvString().c_str());
-            *stream << usertok << env.getEnvString() << sign << endl;
-            psec_free_signature(&sign);
-            rc = topology.routingList->startRouting(hndl, stream);
-            if (rc != SCI_SUCCESS) {
-                childMap.clear();
-                return rc;
-            }
-        }
-    } catch (SocketException &e) {
-        rc = SCI_ERR_LAUNCH_FAILED;
-        log_warn("Launcher: socket exception: %s", e.getErrMsg().c_str());
-    }
-    childMap.clear();
-
-    return rc;
-}
-
-int Launcher::launchBE(int beID, const char * hostname)
-{
-    int rc;
-    char queueName[32];
-    Message *flistMsg = topology.filterList->getFlistMsg();
-
-    initEnv();
-    topology.routingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, beID, true);
-    topology.routingList->queryQueue(beID)->produce(flistMsg);
-
-    rc = launchClient(beID, topology.bePath, hostname, mode);
-    if (rc != SCI_SUCCESS) {
-        topology.routingList->removeBE(beID);
-    } else {
-        if (mode == REGISTER) {
-            int times = 0;
-            while (!topology.routingList->allRouted()) {
-                if (times >= (waitTimes * 1000000  / WAIT_INTERVAL))
-                    return SCI_ERR_LAUNCH_FAILED;
-                times++;
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-        }
-        /*Moved the reader start into startRouting*/
-        //topology.routingList->startReading(beID);
-    }
-
-    return rc;
-}
-
-int Launcher::launchAgent(int beID, const char * hostname)
-{
-    int rc;
-    
-    initEnv();
-    Topology *childTopo = new Topology(topology.nextAgentID--);
-    childTopo->fanOut = topology.fanOut;
-    childTopo->level = topology.level + 1;
-    childTopo->height =  topology.height + 1;
-    childTopo->bePath = topology.bePath;
-    childTopo->agentPath = topology.agentPath;
-    childTopo->beMap[beID] = hostname;
-
-    topology.routingList->addBE(SCI_GROUP_ALL, childTopo->agentID, beID, true);
-    MessageQueue *queue = topology.routingList->queryQueue(childTopo->agentID);
-
-    rc = launchClient(childTopo->agentID, childTopo->agentPath, hostname);
-    if (rc == SCI_SUCCESS) {
-        Message *flistMsg = topology.filterList->getFlistMsg();
-        Message *topoMsg = childTopo->packMsg();
-        if (flistMsg != NULL) {
-            incRefCount(flistMsg->getRefCount());
-            queue->produce(flistMsg);
-        }
-        queue->produce(topoMsg);
-        topology.incWeight(childTopo->agentID);
-        /*Moved the reader start into startRouting*/
-        //topology.routingList->startReading(childTopo->agentID);
-    } else {
-        topology.routingList->removeBE(beID);
-    }
-    delete childTopo;
-
-    return rc;
-}
-
-int Launcher::launchClient(int ID, string &path, string host, Launcher::MODE m, bool batch, int beID)
-{
-    int rc = 0;
-    Listener *listener = NULL;
-    assert(!path.empty());
-    if ((m == REGISTER) || !shell.empty()) {
-        listener = gInitializer->initListener();
-    }
-    if (listener != NULL) {
-        int port = 0;
-        while (1) {
-            port = listener->getBindPort();
-            if (port > 0)
-                break;
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-
-        env.set("SCI_PARENT_PORT", port);
-    } 
-    env.set("SCI_CLIENT_ID", ID);
-    log_debug("Launch client: %s: %s", host.c_str(), path.c_str());
-    
-    if (shell.empty()) {
-        string username = gCtrlBlock->getUsername();
-        try {
-            int hndl = ID;
-            struct iovec sign = {0};
-            int jobKey = gCtrlBlock->getJobKey();
-            psec_idbuf_desc &usertok = SSHFUNC->get_token();
-            Stream *stream = new Stream();
-            SCI_connect_hndlr *conn = NULL;
-
-            if (gCtrlBlock->getMyRole() != CtrlBlock::AGENT)
-                conn = gCtrlBlock->getEndInfo()->connect_hndlr;
-            if (conn == NULL) {
-                int cID = ID;
-                if (embedMode && (beID >= 0)) {
-                    cID = beID;
-                }
-                rc = psec_sign_data(&sign, "%d%d%d%s%s", m, jobKey, cID, path.c_str(), env.getEnvString().c_str());
-                stream->init(host.c_str(), scidPort);
-                *stream << username << usertok << sign << (int)m << jobKey << cID << path << env.getEnvString() << endl;
-                psec_free_signature(&sign);
-            } else {
-                int sockfd = conn(host.c_str());
-                if (sockfd < 0) {
-                    log_error("Launcher: invalid return sockfd(%d) of the connection handler.", sockfd);
-                    return SCI_ERR_LAUNCH_FAILED;
-                }
-                stream->init(sockfd);
-            }
-            if (m == REGISTER) {
-                stream->stop();
-                delete stream;
-            } else {
-                if (batch) {
-                    childMap[hndl] = stream;
-                } else {
-                    psec_sign_data(&sign, "%s", env.getEnvString().c_str());
-                    *stream << usertok << env.getEnvString() << sign << endl;
-                    psec_free_signature(&sign);
-                    rc = topology.routingList->startRouting(hndl, stream);
-                }
-            }
-        } catch (SocketException &e) {
-            rc = SCI_ERR_LAUNCH_FAILED;
-            log_error("Launcher: socket exception: %s", e.getErrMsg().c_str());
-        }
-    } else {
-        if ((strcasecmp(shell.c_str(), "rsh") == 0) || (strcasecmp(shell.c_str(), "ssh") == 0)) {
-            string cmd = shell + " " + host + " -n '" + env.getExportcmd() + path + " >&- 2>&- <&- &'";
-            rc = system(cmd.c_str());
-        }
-    }
-
-    return rc;
-}
-
-int Launcher::launch_tree1()
-{
-    int rc;
-    
-    // this tree will have minimum agents
-    int totalSize = (int) topology.beMap.size();
-    char queueName[32];
-    Message *flistMsg = topology.filterList->getFlistMsg();
-
-    if (totalSize <= topology.fanOut) {
-        // no need to generate agent
-        BEMap::iterator it = topology.beMap.begin();
-
-        int initID = (*it).first;
-        int startID = initID;
-        int endID = initID + totalSize - 1;
-        topology.routingList->initSubGroup(VALIDBACKENDIDS, startID, endID);
-        if (flistMsg != NULL)
-            flistMsg->setRefCount(totalSize + 1);
-        
-        for ( ; it != topology.beMap.end(); ++it) {
-            MessageQueue *queue = topology.routingList->queryQueue((*it).first);
-            queue->produce(flistMsg); 
-
-            rc = launchClient((*it).first, topology.bePath, (*it).second, mode, true);
-            if (rc != SCI_SUCCESS) {
-                return rc;
-            }
-        }
-
-        return SCI_SUCCESS;
-    }
-
-    int stride = (int) ::ceil (::pow(double(topology.fanOut), topology.height - topology.level - 1));
-    int divf;
-    if ((totalSize % stride) == 0) {
-        divf = totalSize / stride;
-    } else {
-        divf = (totalSize - totalSize%stride) / stride + 1;
-    }
-    int step;
-    if ((totalSize % divf) == 0) {
-        step = totalSize / divf;
-    } else {
-        step = (totalSize - (totalSize % divf)) / divf + 1;
-    }
-    if (flistMsg != NULL)
-        flistMsg->setRefCount((totalSize + step - 1) / step + 1);
-    ::srand((unsigned int) ::time(NULL));
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = (*it).first;
-    for (int i = 0; i < totalSize; i += step) {
-        it = topology.beMap.begin();
-        for (int j = 0; j < i; j++) {
-            ++it;
-        }
-
-        // generate an agent
-        Topology *childTopo = new Topology(topology.nextAgentID--);
-        childTopo->fanOut  = topology.fanOut;
-        childTopo->level = topology.level + 1;
-        childTopo->height = topology.height;
-        childTopo->bePath = topology.bePath;
-        childTopo->agentPath = topology.agentPath;
-        
-        int min = (totalSize - i) < step ? (totalSize - i) : step;
-
-        int startID = initID + i;
-        int endID = initID + i + min - 1;
-        topology.routingList->initSubGroup(childTopo->agentID, startID, endID);
-
-        string hostname;
-        
-        int pos = ::rand() % min;
-        for (int j = 0; j < min; j++) {
-            if (pos == j) {
-                hostname = (*it).second;
-            }
-            childTopo->beMap[(*it).first] = (*it).second;
-            topology.incWeight(childTopo->agentID);
-            ++it;
-        }
-
-        rc = launchClient(childTopo->agentID, topology.agentPath, hostname, INTERNAL, true);
-        if (rc == SCI_SUCCESS) {
-            Message *msg = childTopo->packMsg();
-            MessageQueue *queue = topology.routingList->queryQueue(childTopo->agentID);
-            queue->produce(flistMsg); // before topology message
-            queue->produce(msg);
-            delete childTopo;
-        } else {
-            delete childTopo;
-            return rc;
-        }
-    }
-   
-    return SCI_SUCCESS;
-}
-
-int Launcher::launch_tree2()
-{
-    // this tree will have maximum agents but supposed to have better performance
-    // after evaluated by HongJun
-    int i, rc = SCI_SUCCESS;
-    int left = 0;
-    int totalSize = topology.beMap.size();
-    int step;
-    int size = 0;
-    int out = topology.fanOut;
-    Message *flistMsg = topology.filterList->getFlistMsg();
-    int ref = 0;
-    bool bottom = false; 
-
-    if (totalSize == 0)
-        return SCI_SUCCESS;
-
-    bottom = ((totalSize + out - 1) / out) > 1 ? false : true;
-    ref = (totalSize > out) ? out : totalSize;
-    if (flistMsg != NULL)
-        flistMsg->setRefCount(ref + totalSize);  // Keep it undeleted
-    // launch all of my back ends
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = it->first;
-    while (size < totalSize) {
-        BEMap::iterator fEnt = it; // first entry of each step
-        left = totalSize - size; 
-        step = (left + out - 1) / out;
-        out--;
-        if (step == 1) {
-            topology.routingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, it->first, true);
-            MessageQueue *queue = topology.routingList->queryQueue(it->first);
-            queue->produce(flistMsg); 
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                gCtrlBlock->getPurifierProcessor()->setInQueue(queue);
-                gCtrlBlock->setMyHandle(it->first);
-                gCtrlBlock->getPurifierProcessor()->start();
-            } else {
-                rc = launchClient(it->first, topology.bePath, it->second, mode, true);
-                if (rc != SCI_SUCCESS) {
-                    topology.routingList->removeBE(it->first);
-                    return rc;
-                }
-            }
-            it++;
-            // do the notify when it is back agent.
-            if ((size == (totalSize-1)) && bottom && (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)) {
-                int tmp_hndl = gCtrlBlock->getMyEmbedHandle();
-                int tmp_initID = gCtrlBlock->getAgent(tmp_hndl)->getRoutingList()->getTopology()->getInitID();
-                if ((mode == REGISTER) || !shell.empty()) {
-                    int times = 0;
-                    while (!gCtrlBlock->allRouted()) {
-                        if (times >= (waitTimes * 1000000  / WAIT_INTERVAL)) {
-                            rc = SCI_ERR_LAUNCH_FAILED;
-                            *(int *)gNotifier->getRetVal(tmp_initID) = rc;
-                            break;
-                        }
-                        times++;
-                        SysUtil::sleep(WAIT_INTERVAL);
-                    }
-                }
-                gNotifier->notify(tmp_initID);
-            }
-        } else {
-            int auxID = it->first;
-            string &hostname = it->second;
-            Topology *childTopo = new Topology(topology.nextAgentID--);
-            childTopo->fanOut  = topology.fanOut;
-            childTopo->level = topology.level + 1;
-            childTopo->height = topology.height;
-            childTopo->bePath = topology.bePath;
-            childTopo->agentPath = topology.agentPath;
-
-            int startID = initID + size;
-            int endID = initID + size + step - 1;
-            topology.routingList->initSubGroup(childTopo->agentID, startID, endID);
-            MessageQueue *queue = topology.routingList->queryQueue(childTopo->agentID);
-
-            for (i = 0; i < step; i++) {
-                childTopo->beMap[it->first] = it->second;
-                topology.incWeight(childTopo->agentID);
-                it++;
-            }
-
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                EmbedAgent *beAgent = new EmbedAgent();
-                beAgent->init(childTopo->agentID, NULL, queue, gCtrlBlock->getUpQueue());
-                rc = beAgent->work();
-            } else {
-                MODE m = INTERNAL;
-                if (embedMode)
-                    m = mode;
-                rc = launchClient(childTopo->agentID, topology.agentPath, hostname, m, true, auxID);
-            }
-            if (rc == SCI_SUCCESS) {
-                Message *msg = childTopo->packMsg();
-                queue->produce(flistMsg); // make the filter list loaded before topology
-                queue->produce(msg);
-                delete childTopo;
-            } else {
-                delete childTopo;
-                return rc;
-            }
-        }
-        size += step;
-    }
-
-    return rc;
-}
-
-int Launcher::launch_tree3()
-{
-    // this tree will have maximum agents but supposed to have better performance
-    // after evaluated by HongJun
-    int i, rc = SCI_SUCCESS;
-    int left = 0;
-    int totalSize = topology.beMap.size();
-    int step;
-    int size = 0;
-    int out = topology.fanOut;
-    Message *flistMsg = topology.filterList->getFlistMsg();
-    int ref = 0; 
-    bool shift = true;
-    bool bottom = false;
-
-    if (totalSize == 0)
-        return SCI_SUCCESS;
-
-    bottom = ((totalSize + out - 1) / out) > 1 ? false : true;
-    ref = (totalSize > out) ? out : totalSize;
-    if (flistMsg != NULL)
-        flistMsg->setRefCount(ref + totalSize);  // Keep it undeleted
-    // launch all of my back ends
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = it->first;
-    while (size < totalSize) {
-        BEMap::iterator fEnt = it; // first entry of each step
-        left = totalSize - size; 
-        step = (left + out - 1) / out;
-        out--;
-        if (step == 1) {
-            topology.routingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, it->first, true);
-            MessageQueue *queue = topology.routingList->queryQueue(it->first);
-            queue->produce(flistMsg); 
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                gCtrlBlock->getPurifierProcessor()->setInQueue(queue);
-                gCtrlBlock->setMyHandle(it->first);
-                gCtrlBlock->getPurifierProcessor()->start();
-            } else {
-                rc = launchClient(it->first, topology.bePath, it->second, mode, true);
-                if (rc != SCI_SUCCESS) {
-                    topology.routingList->removeBE(it->first);
-                    return rc;
-                }
-            }
-            it++;
-            // do the notify when it is back agent.
-            if ((size == (totalSize-1)) && bottom && (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)) {
-                int tmp_hndl = gCtrlBlock->getMyEmbedHandle();
-                int tmp_initID = gCtrlBlock->getAgent(tmp_hndl)->getRoutingList()->getTopology()->getInitID();
-                if ((mode == REGISTER) || !shell.empty()) {
-                    int times = 0;
-                    while (!gCtrlBlock->allRouted()) {
-                        if (times >= (waitTimes * 1000000  / WAIT_INTERVAL)) {
-                            rc = SCI_ERR_LAUNCH_FAILED;
-                            *(int *)gNotifier->getRetVal(tmp_initID) = rc;
-                            break;
-                        }
-                        times++;
-                        SysUtil::sleep(WAIT_INTERVAL);
-                    }
-                }
-                gNotifier->notify(tmp_initID);
-            }
-        } else {
-            string &hostname = it->second;
-            if (shift) {
-                int aID = topology.agentID;
-                int tmp = aID;
-                BEMap::iterator fh = it;
-                do {
-                    tmp = aID / topology.fanOut;
-                    if (tmp * topology.fanOut == aID) {
-                        fh++;
-                    } else {
-                        break;
-                    }
-                    aID = tmp;
-                } while (aID > 0);
-                hostname = fh->second;
-                shift = false;
-            }
-            Topology *childTopo = new Topology(topology.nextAgentID--);
-            childTopo->fanOut  = topology.fanOut;
-            childTopo->level = topology.level + 1;
-            childTopo->height = topology.height;
-            childTopo->bePath = topology.bePath;
-            childTopo->agentPath = topology.agentPath;
-
-            int startID = initID + size;
-            int endID = initID + size + step - 1;
-            topology.routingList->initSubGroup(childTopo->agentID, startID, endID);
-            MessageQueue *queue = topology.routingList->queryQueue(childTopo->agentID);
-
-            for (i = 0; i < step; i++) {
-                childTopo->beMap[it->first] = it->second;
-                topology.incWeight(childTopo->agentID);
-                it++;
-            }
-
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                EmbedAgent *beAgent = new EmbedAgent();
-                beAgent->init(childTopo->agentID, NULL, queue, gCtrlBlock->getUpQueue());
-                rc = beAgent->work();
-            } else {
-                rc = launchClient(childTopo->agentID, topology.agentPath, hostname, INTERNAL, true);
-            }
-            if (rc == SCI_SUCCESS) {
-                Message *msg = childTopo->packMsg();
-                queue->produce(flistMsg); // make the filter list loaded before topology
-                queue->produce(msg);
-                delete childTopo;
-            } else {
-                delete childTopo;
-                return rc;
-            }
-        }
-        size += step;
-    }
-
-    return rc;
-}
-
-int Launcher::launch_tree4()
-{
-    // this tree will have maximum agents but supposed to have better performance
-    // after evaluated by HongJun
-    int i, rc = SCI_SUCCESS;
-    int left = 0;
-    int totalSize = topology.beMap.size();
-    int step = 1;
-    int size = 0;
-    int out = topology.fanOut;
-    Message *flistMsg = topology.filterList->getFlistMsg();
-    int ref = 0; 
-    bool shift = true;
-
-    if (totalSize == 0)
-        return SCI_SUCCESS;
-
-    ref = (totalSize > out) ? out : totalSize;
-    if (flistMsg != NULL)
-        flistMsg->setRefCount(ref + totalSize);  // Keep it undeleted
-    // launch all of my back ends
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = it->first;
-    while (1) {
-        BEMap::iterator fEnt = it; // first entry of each step
-        if (step == 1) {
-            topology.routingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, it->first, true);
-            MessageQueue *queue = topology.routingList->queryQueue(it->first);
-            queue->produce(flistMsg); 
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                gCtrlBlock->getPurifierProcessor()->setInQueue(queue);
-                gCtrlBlock->setMyHandle(it->first);
-                gCtrlBlock->getPurifierProcessor()->start();
-            } else {
-                rc = launchClient(it->first, topology.bePath, it->second, mode, true);
-                if (rc != SCI_SUCCESS) {
-                    topology.routingList->removeBE(it->first);
-                    return rc;
-                }
-            }
-            it++;
-        } else {
-            int auxID = it->first;
-            string &hostname = it->second;
-            Topology *childTopo = new Topology(topology.nextAgentID--);
-            childTopo->fanOut  = topology.fanOut;
-            childTopo->level = topology.level + 1;
-            childTopo->height = topology.height;
-            childTopo->bePath = topology.bePath;
-            childTopo->agentPath = topology.agentPath;
-
-            int startID = initID + size;
-            int endID = initID + size + step - 1;
-            topology.routingList->initSubGroup(childTopo->agentID, startID, endID);
-            MessageQueue *queue = topology.routingList->queryQueue(childTopo->agentID);
-
-            for (i = 0; i < step; i++) {
-                childTopo->beMap[it->first] = it->second;
-                topology.incWeight(childTopo->agentID);
-                it++;
-            }
-
-            if ((gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT)
-                    && (fEnt == topology.beMap.begin())) {
-                assert(!"should not come here");
-            } else {
-                MODE m = INTERNAL;
-                if (embedMode)
-                    m = mode;
-                rc = launchClient(childTopo->agentID, topology.agentPath, hostname, m, true, auxID);
-            }
-            if (rc == SCI_SUCCESS) {
-                Message *msg = childTopo->packMsg();
-                queue->produce(flistMsg); // make the filter list loaded before topology
-                queue->produce(msg);
-                delete childTopo;
-            } else {
-                delete childTopo;
-                return rc;
-            }
-        }
-        size += step;
-        if (size >= totalSize) {
-            // do the notify when it is back agent.
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT) {
-                int tmp_hndl = gCtrlBlock->getMyEmbedHandle();
-                int tmp_initID = gCtrlBlock->getAgent(tmp_hndl)->getRoutingList()->getTopology()->getInitID();
-                if ((mode == REGISTER) || !shell.empty()) {
-                    int times = 0;
-                    while (!gCtrlBlock->allRouted()) {
-                        if (times >= (waitTimes * 1000000  / WAIT_INTERVAL)) {
-                            rc = SCI_ERR_LAUNCH_FAILED;
-                            *(int *)gNotifier->getRetVal(tmp_initID) = rc;
-                            break;
-                        }
-                        times++;
-                        SysUtil::sleep(WAIT_INTERVAL);
-                    }
-                }
-                gNotifier->notify(tmp_initID);
-            }
-            break;
-        }
-        left = totalSize - size; 
-        step = (left + out - 1) / out;
-        out--;
-    }
-
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/launcher.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/launcher.hpp
deleted file mode 100644
index 0f7f06e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/launcher.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Launcher
-
- Description: Runtime Launch the clients.
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   06/21/10 tuhongj        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _LAUNCHER_HPP
-#define _LAUNCHER_HPP
-
-#include "envvar.hpp"
-
-#include <map>
-#include <string>
-
-using namespace std;
-
-class Topology;
-class Stream;
-
-class Launcher 
-{
-    public:
-        enum MODE {
-            INTERNAL,
-            REGISTER,
-            REQUEST
-        };
-        typedef map<int, Stream *> CHILD_MAP;
-        
-    private:
-        Topology        &topology;
-        EnvVar          env;
-        string          shell;
-        string          localName;
-        int             scidPort;
-        MODE            mode;
-        bool            embedMode;
-        CHILD_MAP       childMap;
-        int             waitTimes;
-
-    public:    
-        Launcher(Topology &topy);
-        ~Launcher();
-
-        int initEnv();        
-        int launch();
-        
-        int launchBE(int beID, const char *hostname);
-        int launchAgent(int beID, const char *hostname);
-
-    private:
-        int launchClient(int ID, string &path, string host, MODE m = INTERNAL, bool batch = false, int beID = -1);
-
-        int launch_tree1(); // mininum agents
-        int launch_tree2(); // maximum agents
-        int launch_tree3(); // maximum agents
-        int launch_tree4(); // maximum agents
-
-        int startAll();
-};
-
-#endif
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp
deleted file mode 100644
index b807226..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Listener
-
- Description: Listener Thread.
-   
- Author: Tu HongJ, Liu Wei, Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-
-#include "log.hpp"
-#include "stream.hpp"
-#include "sshfunc.hpp"
-#include "exception.hpp"
-
-#include "listener.hpp"
-#include "ctrlblock.hpp"
-#include "embedagent.hpp"
-#include "socket.hpp"
-#include "readerproc.hpp"
-#include "writerproc.hpp"
-#include "routinglist.hpp"
-#include "queue.hpp"
-#include "tools.hpp"
-#include "ipconverter.hpp"
-
-Listener:: Listener(int hndl)
-        : Thread(hndl), bindPort(-1)
-{
-	char tmp[256] = {0};
-    socket = new Socket();
-	::gethostname(tmp, sizeof(tmp));
-	bindName = SysUtil::get_hostname(tmp);
-    if (bindName == "") {
-        bindName = tmp;
-    }
-}
-
-Listener::~Listener()
-{
-    delete socket;
-}
-
-int Listener::init()
-{
-    bindPort = 0;
-    char *envp = ::getenv("SCI_LISTENER_PORT");
-    if (envp) {
-        bindPort = atoi(envp);
-    }
-    envp = ::getenv("SCI_DEVICE_NAME");
-    if (envp) {
-        IPConverter converter;
-        string ifname = envp;
-        if (converter.getIP(ifname, true, bindName) == 0) {
-            socket->iflisten(bindPort, ifname);
-        } else {
-            log_error("Listener: invalid device name(%s). Will use the localhost", ifname.c_str());
-            socket->listen(bindPort, NULL);
-        }
-    } else {
-        socket->listen(bindPort, NULL);
-    }
-    
-    log_debug("listener binded to port %d", bindPort);
-
-    return bindPort;
-}
-
-int Listener::stop()
-{
-    setState(false);
-	socket->stopAccept();
-    join();
-
-    return 0;
-}
-
-void Listener::run()
-{
-    int child = -1;
-    int hndl = -1;
-    int pID = -1;
-    int key;
-    int rc;
-    struct iovec sign = {0};
-    bool state = true;
-
-    while (getState()) {
-        child = -1;
-        try {
-            if (!state) {
-                init();
-                state = true;
-            }
-            child = socket->accept();
-        } catch (SocketException &e) {
-            log_warn("Listener: socket broken: %s", e.getErrMsg().c_str());
-            if (child >= 0) {
-                shutdown(child, SHUT_RDWR);
-                close(child);
-            }
-            state = false;
-            SysUtil::sleep(WAIT_INTERVAL);
-            continue;
-        } catch (...) {
-            log_warn("Listener: unknown exception: %s");
-            break;
-        }
-        if (child < 0) {
-            // invalid connection
-            continue;
-        }
-        if (!gCtrlBlock->isEnabled()) {
-            log_debug("Listener: uninitialized, rejected this connection");
-            break;
-        }
-
-        log_debug("Listener: accepted a child agent sockfd %d", child);
-
-        if (gCtrlBlock->getRecoverMode()) {
-            rc = gCtrlBlock->isActiveSockfd(child);
-            if (rc != 0) {
-                log_warn("Listener: the fd %d is already used", child);
-                shutdown(child, SHUT_RDWR);
-                close(child);
-                log_warn("Listener: closed the fd %d", child);
-                continue;
-            }
-        }
-
-        Stream *stream = NULL;
-        try {
-            stream = new Stream();
-            stream->init(child);
-
-            *stream >> key >> hndl;
-            if (key != gCtrlBlock->getJobKey()) {
-                log_warn("Listener: client with invalid credential is trying to connect. key = %d, JobKey = %d, hndl = %d",
-                        key, gCtrlBlock->getJobKey(), hndl);
-                stream->stop();
-                delete stream;
-                stream = NULL;
-                continue;
-            }
-            if (hndl >= 0) {
-                log_debug("Listener: back end %d is connected. Parent ID is %d", hndl, pID); 
-            } else {
-                log_debug("Listener: agent %d is connected. Parent ID is %d", hndl, pID); 
-            }
-
-            log_debug("Listener: begin to get pID and sign");
-            *stream >> pID >> sign >> endl;
-
-            rc = psec_verify_data(&sign, "%d%d%d", key, hndl, pID);
-            delete [] (char *)sign.iov_base;
-            if (rc != 0) {
-                log_warn("Misleading message comes.");
-                stream->stop();
-                delete stream;
-                stream = NULL;
-                continue;
-            }
-            log_debug("Listener: begin to send back endl");
-            *stream << endl;
-            rc = gCtrlBlock->getAgent(pID)->getRoutingList()->startRouting(hndl, stream);
-        } catch (Exception &e) {
-            log_error("Listener: exception %s", e.getErrMsg());
-            break;
-        } catch (ThreadException &e) {
-            log_error("Listener: thread exception %d", e.getErrCode());
-            continue; // sometimes, the writer thread is starting
-        } catch (SocketException &e) {
-            log_error("Listener: socket exception: %s", e.getErrMsg().c_str());
-            if (stream != NULL) {
-                stream->stop();
-                delete stream;
-                stream = NULL;
-            }
-            continue;
-        } catch (std::bad_alloc) {
-            log_error("Listener: out of memory");
-            break;
-        } catch (...) {
-            log_error("Listener: unknown exception");
-            break;
-        }
-    }
-
-    setState(false);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp
deleted file mode 100644
index a028191..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Listener
-
- Description: Listener Thread.
-   
- Author: Tu HongJ, Liu Wei, Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _LISTENER_HPP
-#define _LISTENER_HPP
-
-#include "general.hpp"
-#include "thread.hpp"
-#include <string>
-
-using namespace std;
-
-class Socket;
-
-class Listener : public Thread 
-{
-    private:
-        int              bindPort;
-        Socket           *socket;
-		string			 bindName;
-    
-    public:
-        Listener(int hndl);
-        virtual ~Listener();
-        
-        int init();
-        int stop();
-
-        int getBindPort() { return bindPort; }
-		string & getBindName() { return bindName; }
-
-        int numOfSockFds() { return socket->numOfListenFds(); }
-        int getSockFds(int *fds) { return socket->getListenSockfds(fds); }
-
-        virtual void run();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp
deleted file mode 100644
index 6100a87..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Message
-
- Description: SCI internal message
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-   07/23/12 ronglli      Detect error message type 
-
-****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <pthread.h>
-#include <sys/time.h>
-#include <time.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "exception.hpp"
-#include "log.hpp"
-#include "sshfunc.hpp"
-#include "atomic.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-
-Message::Message(Type t)
-    : type(t)
-{
-    msgID = DEFAULT_MSG_ID;
-    filterID = SCI_FILTER_NULL;
-    group= SCI_GROUP_ALL;
-    len = 0;
-    buf = NULL;
-
-    refCount = 1;
-}
-
-Message::~Message()
-{
-    if (buf && len) {
-        delete [] buf;
-    }
-
-    buf = NULL;
-    len = 0;
-}
-
-Message * Message::joinSegments(Message *msg, Stream *inS, MessageQueue *inQ)
-{
-    int i = 0;
-    int segnum = msg->getID() - 1; // exclude the SEGMENT header
-    Message *newMsg = NULL;
-    Message **segments = (Message **)::malloc(segnum * sizeof(Message *));
-    newMsg = new Message();
-    if (inS) {
-        delete msg;
-        for (i = 0; i < segnum; i++) {
-            segments[i] = new Message();
-            *inS >> *segments[i];
-        }
-    } else {
-        inQ->remove();
-        inQ->multiConsume(segments, segnum);
-    }
-    newMsg->joinSegments(segments, segnum);
-    ::free(segments);
-
-    return newMsg;
-}
-
-int Message::joinSegments(Message **segments, int segnum)
-{
-    int i;
-    char **bufs = (char **)malloc(segnum * sizeof(char *));
-    int *sizes = new int[segnum];
-    int fid = segments[0]->getFilterID();
-    sci_group_t gid = segments[0]->getGroup();
-    Type typ = segments[0]->getType();
-    int id = segments[0]->getID();
-
-    for (i = 0; i < segnum; i++) {
-        bufs[i] = segments[i]->getContentBuf();
-        sizes[i] = segments[i]->getContentLen();
-    }
-    build(fid, gid, segnum, bufs, sizes, typ, id);
-    ::free(bufs);
-    delete []sizes;
-    for (i = 0; i < segnum; i++) {
-        if (decRefCount(segments[i]->getRefCount()) == 0) {
-            delete segments[i];
-        }
-    }
-
-    return 0;
-}
-
-void Message::build(int fid, sci_group_t g, int num_bufs, char *bufs[], int sizes[], Type t, int id)
-{
-    type = t;
-    msgID = id;
-    
-    filterID = fid;
-    group = g;
-
-    len = 0;
-    for (int i=0; i<num_bufs; i++) {
-        len += sizes[i];
-    }
-
-    if (len > 0) {
-        buf = new char[len];
-        char *ptr = buf;
-        for (int i=0; i<num_bufs; i++) {
-            if (sizes[i] > 0) {
-                ::memcpy(ptr, bufs[i], sizes[i]);
-                ptr += sizes[i];
-            }
-        }
-    }
-}
-
-void Message::setRefCount(int cnt) 
-{
-    refCount = cnt;
-}
-
-int & Message::getRefCount()
-{
-    return refCount;
-}
-
-bool Message::isValidType(int type)
-{
-    bool flag = false;
-    switch (type) {
-        case Message::UNKNOWN:
-        case Message::CONFIG:
-        case Message::COMMAND:
-        case Message::FILTER_LOAD:
-        case Message::FILTER_UNLOAD:
-        case Message::GROUP_CREATE:
-        case Message::GROUP_FREE:
-        case Message::GROUP_OPERATE:
-        case Message::GROUP_OPERATE_EXT:
-        case Message::QUIT:
-        case Message::DATA:
-        case Message::BE_REMOVE:
-        case Message::BE_ADD:
-        case Message::FILTER_LIST:
-        case Message::RELEASE:
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-        case Message::ERROR_EVENT:
-        case Message::GROUP_MERGE:
-        case Message::GROUP_DROP:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-        case Message::INVALID_POLL:
-        case Message::SOCKET_BROKEN:
-        case Message::ERROR_DATA:
-        case Message::ERROR_THREAD:
-        case Message::SEGMENT:
-            flag = true;
-            break;
-        default:
-            flag = false;
-            break;
-    }
-    return flag;
-}
-
-Stream & operator >> (Stream &stream, Message &msg)
-{  
-    int rc;
-    struct iovec vecs[6];
-    struct iovec sign = {0};
-    char fmt[32] = {0};
-
-    // receive message header
-    stream >> (int &) msg.type;
-    if (!msg.isValidType(msg.type)) {
-        log_error("message: invalid message type %d", msg.type);
-        throw SocketException(SocketException::NET_ERR_DATA);
-    }
-
-    stream >> msg.msgID;
-    stream >> msg.filterID;
-    stream >> (int &) msg.group;
-    
-    // receive message content
-    stream >> msg.len;
-    if (msg.len > 0) {
-        msg.buf = new char[msg.len];
-        ::memset(msg.buf, 0, msg.len);
-        stream.read(msg.buf, msg.len);
-    }
-    stream >> sign;
-    sprintf(fmt, "%%d%%d%%d%%d%%d%%%ds", msg.len);
-    rc = psec_verify_data(&sign, fmt, msg.type, msg.msgID, msg.filterID, msg.group, msg.len, msg.buf);
-    delete [] (char *)sign.iov_base;
-    if (rc != 0) {
-        throw Exception(Exception::INVALID_SIGNATURE);
-    }
-
-    return stream;
-}
-
-Stream & operator << (Stream &stream, Message &msg)
-{
-    struct iovec vecs[6];
-    struct iovec sign = {0};
-    char fmt[32] = {0};
-
-    sprintf(fmt, "%%d%%d%%d%%d%%d%%%ds", msg.len);
-    psec_sign_data(&sign, fmt, msg.type, msg.msgID, msg.filterID, msg.group, msg.len, msg.buf);
-    // send message header
-    stream << (int) msg.type;
-    stream << msg.msgID;
-    stream << msg.filterID;
-    stream << (int) msg.group;
-
-    // send message content
-    stream << msg.len;
-    if (msg.len > 0) {
-        stream.write(msg.buf, msg.len);
-    }
-    stream << sign;
-    psec_free_signature(&sign);
- 
-    return stream.flush();
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp
deleted file mode 100644
index f27393c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Message
-
- Description: SCI internal message
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-   01/16/12 ronglli      Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#ifndef _MESSAGE_HPP
-#define _MESSAGE_HPP
-
-#include "sci.h"
-
-#include "stream.hpp"
-
-#include "general.hpp"
-
-const int DEFAULT_MSG_ID = (-1024 * 1024);
-
-class MessageQueue;
-class Stream;
-
-class Message 
-{
-    public:
-        enum Type {
-            UNKNOWN = -1,
-            // used for downstream messages
-            CONFIG = -1001,
-            COMMAND = -1002,
-            FILTER_LOAD = -1003,
-            FILTER_UNLOAD = -1004,
-            GROUP_CREATE = -1005,
-            GROUP_FREE = -1006,
-            GROUP_OPERATE = -1007,
-            GROUP_OPERATE_EXT = -1008,
-            QUIT = -1009,
-            // used for upstream messages
-            DATA = -1010,
-            // used for dynamic +/- backend messages
-            BE_REMOVE = -1011,
-            BE_ADD = -1012,
-            FILTER_LIST = -1013,
-            RELEASE = -1014,
-            // used for error handling
-            UNCLE = -2001,
-            UNCLE_LIST = -2002,
-            PARENT = -2003,
-            ERROR_EVENT = -2004, // failure/recovery events
-            GROUP_MERGE = -2005,
-            GROUP_DROP = -2006,
-            // used for error injection 
-            SHUTDOWN = -3001,            
-            KILLNODE = -3002,
-            // used for polling mode
-            INVALID_POLL = -4001,
-            SOCKET_BROKEN = -4002,
-            ERROR_DATA = -4003,
-            ERROR_THREAD = -4004,
-            // used for message segmentation
-            SEGMENT = -5001
-        };
-        
-    private:
-        // message header
-        Type            type;
-        int             msgID;
-        int             filterID;
-        sci_group_t     group;
-
-        // message content
-        int             len;
-
-        int             refCount;
-        char            *buf;
-        
-    public:
-        Message(Type t = UNKNOWN);
-        ~Message();
-
-        int joinSegments(Message **segments, int segnum);
-        static Message *joinSegments(Message *msg, Stream *inS, MessageQueue *inQ);
-        void build(int fid, sci_group_t g, int num_bufs, char *bufs[], int sizes[], Type t, 
-            int id = DEFAULT_MSG_ID);
-        void setRefCount(int cnt);
-        int & getRefCount();
-        bool isValidType(int type);
-
-        void setID(int id) { msgID = id; }
-        void setFilterID(int id) { filterID = id; }
-        void setGroup(sci_group_t g) { group = g; }
-        Type getType() {  return type; }
-        int getID() { return msgID; }
-        int getFilterID() { return filterID; }
-        sci_group_t getGroup() { return group; }
-        
-        char * getContentBuf() { return buf; }
-        int getContentLen() { return len; }
-
-        friend Stream & operator >> (Stream &stream, Message &msg);
-        friend Stream & operator << (Stream &stream, Message &msg);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp
deleted file mode 100644
index 954d16b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Observer
-
- Description: For external notification usage.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/12/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#include "observer.hpp"
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stddef.h>
-#include <fcntl.h>
-#include <stdio.h>
-
-#include "exception.hpp"
-
-Observer::Observer()
-{
-    pipeFd[0] = -1;
-    pipeFd[1] = -1;
-
-    count = 0;
-    hasChar = false;
-
-    int rc = ::pipe(pipeFd);
-    if (rc != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-    async(pipeFd[0]);
-    async(pipeFd[1]);
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-Observer::~Observer()
-{
-    ::close(pipeFd[0]);
-    ::close(pipeFd[1]);
-
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void Observer::notify()
-{
-    lock();
-    try {
-        count++;
-        check();
-    } catch (...) {
-        unlock();
-        throw;
-    }
-    unlock();
-}
-
-void Observer::unnotify()
-{
-    lock();
-    try {
-        if (hasChar) {
-            readChar();
-            hasChar = false;
-        }
-        check();
-    } catch (...) {
-        unlock();
-        throw;
-    }
-    unlock();
-}
-
-int Observer::getPollFd()
-{
-    return pipeFd[0];
-}
-
-int Observer::getPipeWriteFd()
-{
-    return pipeFd[1];
-}
-
-void Observer::async(int fd)
-{
-    int flags, newflags;
-
-    flags = ::fcntl(fd, F_GETFL);
-    if (flags < 0)
-        throw Exception(Exception::SYS_CALL);
-
-    newflags = flags & ~O_NONBLOCK;
-
-    if (newflags != flags) {
-        if (::fcntl(fd, F_SETFL, newflags) < 0) {
-            throw Exception(Exception::SYS_CALL);
-        }
-    }
-}
-
-void Observer::readChar()
-{
-    // read a char signal from the socket
-    char signal;
-    while (true) {
-        int bytes = ::read(pipeFd[0], &signal, sizeof(char));
-        if (bytes < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
-                break;
-            }
-            throw Exception(Exception::SYS_CALL);
-        }
-        break;
-    }
-}
-
-void Observer::writeChar()
-{
-    // write a char signal to the socket
-    char signal = 'a';
-    while (true) {
-        int bytes = ::write(pipeFd[1], &signal, sizeof(char));
-        if (bytes < 0) {
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) {
-                continue;
-            }
-            throw Exception(Exception::SYS_CALL);
-        }
-        break;
-    }
-}
-
-void Observer::check()
-{
-    if (!hasChar) {
-        if (count > 0) {
-            hasChar = true;
-            writeChar();
-            count--;
-        }
-    }
-}
-
-void Observer::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void Observer::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp
deleted file mode 100644
index 0a1369c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Observer
-
- Description: For external notification usage.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/12/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _OBSERVER_HPP
-#define _OBSERVER_HPP
-
-#include <pthread.h>
-
-class Observer 
-{
-    private:
-        int             pipeFd[2];
-        long long       count;
-        bool            hasChar;
-
-        pthread_mutex_t mtx;
-        
-    public:
-        Observer();
-        ~Observer();
-        
-        void notify();
-        void unnotify();
-
-        // access 
-        int getPollFd();
-        int getPipeWriteFd();
-
-    private:
-        void async(int fd);
-        void readChar();
-        void writeChar();
-
-        void check();
-
-        void lock();
-        void unlock();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.cpp
deleted file mode 100644
index 97e5b77..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PrivateData
-
- Description: thread specific data
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code ()
-
-****************************************************************************/
-
-#include "privatedata.hpp"
-#include "filterproc.hpp"
-#include "routerproc.hpp"
-#include "routinglist.hpp"
-#include "filterlist.hpp"
-
-PrivateData::PrivateData(RoutingList *rt, FilterList *fl, FilterProcessor *fp, RouterProcessor *rp)
-    : routingList(rt), filterList(fl), routerProc(rp), filterProc(fp)
-{
-}
-
-PrivateData::~PrivateData()
-{
-}
-
-FilterProcessor * PrivateData::getFilterProcessor()
-{
-    return filterProc;
-}
-
-RouterProcessor * PrivateData::getRouterProcessor()
-{
-    return routerProc;
-}
-
-RoutingList * PrivateData::getRoutingList()
-{
-    return routingList;
-}
-
-Topology * PrivateData::getTopology()
-{
-    return routingList->getTopology();
-}
-
-FilterList * PrivateData::getFilterList()
-{
-    return filterList;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.hpp
deleted file mode 100644
index 7bfe156..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/privatedata.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PrivateData
-
- Description: thread specific data
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code ()
-
-****************************************************************************/
-
-#ifndef _PRIVATEDATA_HPP
-#define _PRIVATEDATA_HPP
-
-#include <stdlib.h>
-
-class FilterProcessor;
-class RouterProcessor;
-class RoutingList;
-class FilterList;
-class Topology;
-
-class PrivateData {
-    private:
-        RoutingList *routingList;
-        FilterList *filterList;
-        FilterProcessor * filterProc;
-        RouterProcessor * routerProc;
-
-    public:
-        PrivateData(RoutingList *rt = NULL, FilterList *fl = NULL, FilterProcessor *fp = NULL, RouterProcessor *rp = NULL);
-        ~PrivateData();
-        FilterProcessor * getFilterProcessor();
-        RouterProcessor * getRouterProcessor();
-        RoutingList * getRoutingList();
-        FilterList * getFilterList();
-        Topology * getTopology();
-};
-
-#endif
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp
deleted file mode 100644
index 11cf34a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Processor
-
- Description: Properties of class 'Processor':
-    input: a. a stream 
-           b. a message queue
-    output: a. none
-            b. a stream
-            c. one or multiple message queues
-    action: any kind message processing actions
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "processor.hpp"
-#include <assert.h>
-
-#include "ctrlblock.hpp"
-#include "log.hpp"
-#include "tools.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-
-Processor::Processor(int hndl) 
-    : Thread(hndl), inQueue(NULL), outQueue(NULL), hState(CtrlBlock::HEALTH)
-{
-    name = "Processor";
-
-    totalCount = 0;
-    totalSize = 0;
-}
-
-void Processor::run()
-{
-    log_debug("Processor %s: started", name.c_str());
-    
-    Message *msg = NULL;
-    while (getState() || isActive()) {
-        try {
-            // read a message
-            msg = read();
-            if (msg == NULL) {
-                log_debug("Processor %s: read a NULL message", name.c_str());
-                continue;
-            }
-
-            totalCount++;
-            totalSize += msg->getContentLen();
-            log_debug("Processor %s: processing a message, type=%d, filter ID=%d, group=%d, size=%d", 
-                    name.c_str(), msg->getType(), msg->getFilterID(), msg->getGroup(), msg->getContentLen());
-
-            // process the message
-            process(msg);
-
-            // write the message
-            write(msg);
-
-            log_debug("Processor %s: finished", name.c_str());
-        } catch (Exception &e) {
-            if (e.getErrCode() == Exception::INVALID_SIGNATURE) {
-                log_warn("Receives a misleading message");
-                continue;
-            }
-            hState = CtrlBlock::ERROR_THREAD;
-            seize();
-            log_error("Processor %s: exception %s", name.c_str(), e.getErrMsg());
-            break;
-        } catch (SocketException &e) {
-            if (e.getErrCode() == SocketException::NET_ERR_DATA) {
-                hState = CtrlBlock::ERROR_DATA;
-            } else {
-                if (recover() == 0) {
-                    continue;
-                }
-                hState = CtrlBlock::ERROR_CHILD_BROKEN;
-            }
-            seize();
-            if (e.getErrCode() == SocketException::NET_ERR_CLOSED) {
-                log_warn("Processor %s: socket exception %s", name.c_str(), e.getErrMsg().c_str());
-            } else {
-                log_error("Processor %s: socket exception %s", name.c_str(), e.getErrMsg().c_str());
-            }
-            break;
-        } catch (ThreadException &e) {
-            hState = CtrlBlock::ERROR_THREAD;
-            seize();
-            log_error("Processor %s: thread exception %d", name.c_str(), e.getErrCode());
-            break;
-        } catch (std::bad_alloc) {
-            hState = CtrlBlock::ERROR_THREAD;
-            seize();
-            log_error("Processor %s: out of memory", name.c_str());
-            break;
-        } catch (...) {
-            hState = CtrlBlock::ERROR_THREAD;
-            seize();
-            log_error("Processor %s: unknown exception", name.c_str());
-            break;
-        }
-    }
-
-    // do cleanup works
-    clean();
-    
-    log_debug("Processor %s: exited", name.c_str());
-}
-
-void Processor::release()
-{
-    while (!isLaunched()) {
-        // before join, this thread should have been launched
-        SysUtil::sleep(WAIT_INTERVAL);
-    } 
-    setState(false);
-    if (inQueue)
-        inQueue->release();
-    join();
-}
-
-bool Processor::isActive()
-{
-    if ((inQueue) && (inQueue->getState()))
-        return (inQueue->getSize() > 0);
-    return false;
-}
-
-void Processor::dump()
-{
-    log_perf("Until now, processor %s has processed %d messages, total size is %d bytes",
-        name.c_str(), totalCount, totalSize);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp
deleted file mode 100644
index 7a4fc08..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Processor
-
- Description: Properties of class 'Processor':
-    input: a. a stream 
-           b. a message queue
-    output: a. none
-            b. a stream
-            c. one or multiple message queues
-    action: any kind message processing actions
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _PROCESSOR_HPP
-#define _PROCESSOR_HPP
-
-#include <string>
-
-using namespace std;
-
-#include "thread.hpp"
-
-class Message;
-class MessageQueue;
-
-class Processor : public Thread 
-{      
-    protected:
-        string              name;
-
-        // for performance counting
-        int                 totalCount;
-        int                 totalSize;
-        MessageQueue        *inQueue;
-        MessageQueue        *outQueue;
-        int                 hState;
-
-    public:
-        Processor(int hndl = -1);
-
-        virtual void run();
-
-        virtual Message * read() = 0;
-        virtual void process(Message *msg) = 0;
-        virtual void write(Message *msg) = 0;
-        virtual void seize() = 0;
-        virtual int recover() = 0;
-        virtual void clean() = 0;
-
-        virtual bool isActive();
-        
-        void dump();
-        void setName(char *str) { name = str; }
-        string getName() { return name; }
-        virtual void release();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp
deleted file mode 100644
index e727334..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PurifierProcessor
-
- Description: Properties of class 'PurifierProcessor':
-    input: a. a stream 
-    output: a. a message queue
-    action: purify message, discarded useless messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/25/09 nieyy      Initial code (D153875)
-   01/16/12 ronglli    Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#include "purifierproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "atomic.hpp"
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "privatedata.hpp"
-#include "queue.hpp"
-#include "observer.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "writerproc.hpp"
-#include "initializer.hpp"
-#include "eventntf.hpp"
-#include "tools.hpp"
-#include "sshfunc.hpp"
-
-PurifierProcessor::PurifierProcessor(int hndl) 
-    : Processor(hndl), inStream(NULL), outErrorQueue(NULL), peerProcessor(NULL), observer(NULL), joinSegs(false)
-{
-    name = "Purifier";
-    hndlr = gCtrlBlock->getEndInfo()->be_info.hndlr;
-    param = gCtrlBlock->getEndInfo()->be_info.param;
-    routingList = new RoutingList(hndl);
-    routingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, hndl);
-    filterList = new FilterList();
-    PrivateData *pData = new PrivateData(routingList, filterList, NULL);
-    setSpecific(pData);
-}
-
-PurifierProcessor::~PurifierProcessor()
-{
-    if (inQueue)
-        delete inQueue;
-    if (routingList)
-        delete routingList;
-    if (filterList)
-        delete filterList;
-}
-
-RoutingList * PurifierProcessor::getRoutingList()
-{
-    return routingList;
-}
-
-FilterList * PurifierProcessor::getFilterList()
-{
-    return filterList;
-}
-
-Message * PurifierProcessor::read()
-{
-    Message *msg = NULL;
-    assert(inStream || inQueue);
-
-    if (inStream != NULL) {
-        msg = new Message();
-        *inStream >> *msg;
-    } else {
-        msg = inQueue->consume();
-    }
-
-    if (msg && (msg->getType() == Message::SEGMENT)) {
-        joinSegs = true;
-        msg = Message::joinSegments(msg, inStream, inQueue);
-    }
-
-    return msg;
-}
-
-void PurifierProcessor::process(Message * msg)
-{
-    Filter *filter = NULL;
-    switch(msg->getType()) {
-        case Message::SEGMENT:
-        case Message::COMMAND:
-            if (observer) {
-                observer->notify();
-                incRefCount(msg->getRefCount()); // inQueue and outQueue
-                outQueue->produce(msg);
-            } else {
-                hndlr(param, msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-            }
-            break;
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-        case Message::ERROR_EVENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            isError = true;
-            msg->setID(handle);
-            break;
-        case Message::GROUP_CREATE:
-        case Message::GROUP_OPERATE:
-        case Message::GROUP_OPERATE_EXT:
-            routingList->addBE(msg->getGroup(), VALIDBACKENDIDS, gCtrlBlock->getMyHandle());
-            break;
-        case Message::GROUP_FREE:
-            routingList->removeGroup(msg->getGroup());
-            break;
-        case Message::FILTER_LOAD:
-            filter = new Filter();
-            filter->unpackMsg(*msg);
-            filterList->loadFilter(filter->getId(), filter, false);
-            break;
-        case Message::FILTER_UNLOAD:
-            filterList->unloadFilter(msg->getFilterID(), false);
-            break;
-        case Message::FILTER_LIST:
-            filterList->loadFilterList(*msg, false);
-            break;
-        case Message::BE_REMOVE:
-        case Message::QUIT:
-            gCtrlBlock->setTermState(true);
-            gCtrlBlock->setRecoverMode(0);
-            setState(false);
-            break;
-        default:
-            break;
-    }
-}
-
-void PurifierProcessor::write(Message * msg)
-{
-    if (joinSegs || inStream) {
-        joinSegs = false;
-        if (decRefCount(msg->getRefCount()) == 0)
-            delete msg;
-        return;
-    }
-    inQueue->remove();
-}
-
-int PurifierProcessor::recover()
-{
-    int rc = -1;
-
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode())) {
-        return rc;
-    }
-
-    log_debug("Purifier: begin to do the recover.");
-    if (gCtrlBlock->getParentInfoWaitState()) {
-        while (gInitializer->pInfoUpdated == false) {
-            if (gCtrlBlock->getTermState()) {
-                log_debug("Purifier: incorrect state");
-                return rc;
-            }
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-    }
-
-    while ((rc != 0) && (!gCtrlBlock->getTermState())) {
-        log_debug("Purifier: begin to do the reconnect...");
-        try {
-            struct iovec sign = {0};
-            int hndl = gInitializer->getOrgHandle();
-            int pID = gInitializer->getParentID();
-            string pAddr = gInitializer->getParentAddr();
-            int pPort = gInitializer->getParentPort();
-
-            inStream->stopRead();
-
-            WriterProcessor * writer = getPeerProcessor();
-            while(!(writer->isLaunched())) {
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-            if (!writer->getRecoverState()) {
-                Message *msg = new Message(); 
-                // The writer thread may be in consume, which will not enter into recover. Need to send a notification msg to it
-                msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::RELEASE);
-
-                log_debug("Purifier: begin to set the writer release state to false, and produce rel msg to writer");
-                writer->setReleaseState(true);
-                writer->getInQueue()->produce(msg);
-            }
-            while(!(writer->getRecoverState())) {
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-            
-            rc = inStream->init(pAddr.c_str(), pPort);
-            log_debug("Purifier: Recover: rc = %d, My parent host is %s, parent port is %d, parent id is %d", rc, pAddr.c_str(), pPort, pID);
-            if (rc != 0) {
-                SysUtil::sleep(WAIT_INTERVAL);
-                continue;
-            }
-            log_debug("Purifier: begin to send jobkey %d, hndl %d, pID %d", gCtrlBlock->getJobKey(), hndl, pID);
-            psec_sign_data(&sign, "%d%d%d", gCtrlBlock->getJobKey(), hndl, pID);
-            *inStream << gCtrlBlock->getJobKey() << hndl << pID << sign << endl;
-            *inStream >> endl;
-
-            psec_free_signature(&sign);
-            log_debug("Purifier: after sending the jobkey, hndl, pID");
-
-            writer->setOutStream(inStream);
-
-            if ((rc == 0) && (gCtrlBlock->getParentInfoWaitState())) {           
-                gInitializer->pInfoUpdated = false; 
-                gCtrlBlock->setParentInfoWaitState(false); 
-                gNotifier->notify(gInitializer->notifyID);
-            }
-        } catch (SocketException &e) {
-            rc = -1;
-            log_error("Purifier: recover exception: socket exception: %s", e.getErrMsg().c_str());
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-    }
-
-    return rc;
-}
-
-void PurifierProcessor::seize()
-{
-    setState(false);
-}
-
-void PurifierProcessor::clean()
-{
-    if (inStream)
-        inStream->stopRead();
-    if (observer) {
-        try {
-            gCtrlBlock->releasePollQueue();
-        } catch (std::bad_alloc) {
-            log_error("Processor Purifier: out of memory");
-            // To do; add correct error handling
-        }
-    }
-    gCtrlBlock->setFlowctlState(false);
-
-    gCtrlBlock->disable();
-    if (peerProcessor) {
-        peerProcessor->release();
-        delete peerProcessor;
-    }
-}
-
-void PurifierProcessor::setInStream(Stream * stream)
-{
-    inStream = stream;
-}
-
-Stream * PurifierProcessor::getInStream()
-{
-    return inStream;
-}
-
-void PurifierProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-MessageQueue * PurifierProcessor::getInQueue()
-{
-    return inQueue;
-}
-
-void PurifierProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void PurifierProcessor::setOutErrorQueue(MessageQueue * queue)
-{
-    outErrorQueue = queue;
-}
-
-void PurifierProcessor::setPeerProcessor(WriterProcessor * processor)
-{
-    peerProcessor =  processor;
-}
-
-WriterProcessor * PurifierProcessor::getPeerProcessor()
-{
-    return peerProcessor;
-}
-
-void PurifierProcessor::setObserver(Observer * ob)
-{
-    observer = ob;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp
deleted file mode 100644
index 70980fe..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PurifierProcessor
-
- Description: Properties of class 'PurifierProcessor':
-    input: a. a stream 
-    output: a. two message queues
-    action: purify message, discarded useless messages
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _PURIFERPROC_HPP
-#define _PURIFERPROC_HPP
-
-#include "sci.h"
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class Observer;
-class WriterProcessor;
-class RoutingList;
-class FilterList;
-
-class PurifierProcessor : public Processor 
-{
-    private:
-        Stream              *inStream;
-        MessageQueue        *outErrorQueue;
-        WriterProcessor     *peerProcessor;
-        RoutingList         *routingList;
-        FilterList          *filterList;
-        Observer            *observer;
-        SCI_msg_hndlr       *hndlr;
-        void                *param;
-
-        bool                isCmd;
-        bool                isError;
-        bool                joinSegs;
-
-    public:
-        PurifierProcessor(int hndl = -1);
-        ~PurifierProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        void setInStream(Stream *stream);
-        Stream * getInStream();
-        void setOutQueue(MessageQueue *queue);
-        void setInQueue(MessageQueue *queue);
-        MessageQueue * getInQueue();
-        void setOutErrorQueue(MessageQueue *queue);
-        void setPeerProcessor(WriterProcessor *processor);
-        WriterProcessor * getPeerProcessor();
-        void setObserver(Observer *ob);
-        RoutingList * getRoutingList();
-        FilterList * getFilterList();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp
deleted file mode 100644
index 4430ed4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: MessageQueue
-
- Description: Messages manipulation.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-   01/16/12 ronglli      Fix the issue of semaphore overflow
-
-****************************************************************************/
-
-#include "queue.hpp"
-#include <stdlib.h>
-#include <sys/time.h>
-#include <time.h>
-#include <errno.h>
-#include <assert.h>
-#ifdef __APPLE__
-#include <mach/mach.h>
-#endif /* __APPLE__ */
-
-#include "exception.hpp"
-#include "ctrlblock.hpp"
-#include "log.hpp"
-
-#include "atomic.hpp"
-#include "message.hpp"
-#include "tools.hpp"
-
-MessageQueue::MessageQueue(bool ctl)
-    : thresHold(0), flowCtl(ctl)
-{
-    state = true;
-    ::pthread_mutex_init(&mtx, NULL);
-#ifndef __APPLE__
-    ::sem_init(&sem, 0, 0);
-#else /* __APPLE__ */
-    task = ::mach_task_self();
-    ::semaphore_create(task, &sem, SYNC_POLICY_FIFO, 0);
-#endif /* __APPLE__ */
-}
-
-MessageQueue::~MessageQueue()
-{
-    Message *msg = NULL;
-    while (!queue.empty()) {
-        msg = queue.front();
-        queue.pop_front();
-        if (decRefCount(msg->getRefCount()) == 0) {
-            delete msg;
-        }
-    }
-    queue.clear();
-    
-    ::pthread_mutex_destroy(&mtx);
-#ifndef __APPLE__
-    ::sem_destroy(&sem);
-#else /* __APPLE__ */
-    ::semaphore_destroy(task, sem);
-#endif /* __APPLE__ */
-}
-
-int MessageQueue::flowControl(int size)
-{
-    long long flowctlThreshold = gCtrlBlock->getFlowctlThreshold();
-
-    if(flowCtl) {
-        if ((gCtrlBlock->getMyRole() != CtrlBlock::BACK_END) && (size > 0)) {
-            while ((thresHold > flowctlThreshold) && (gCtrlBlock->getFlowctlState())) {
-                SysUtil::sleep(WAIT_INTERVAL);
-            }   
-        }
-    }
-
-    return 0;
-}
-
-int MessageQueue::multiProduce(Message **msgs, int num)
-{
-    assert(msgs && (num > 0));
-    int i;
-    int len = 0;
-
-    for (i = 0; i < num; i++) {
-        assert(msgs[i]);
-        len += msgs[i]->getContentLen();
-    }
-    lock();
-    for (i = 0; i < num; i++) {
-        queue.push_back(msgs[i]);
-        
-    }
-    thresHold += len;
-    unlock();
-
-    release();
-    flowControl(len);
-
-    return 0;
-}
-
-void MessageQueue::release()
-{
-    int cnt = 0;
-#ifndef __APPLE__
-    while (::sem_post(&sem) != 0) {
-#else /* __APPLE__ */
-    while (::semaphore_signal(sem) != 0) {
-#endif /* __APPLE__ */    
-        if (!state)
-            break;
-        if (!gCtrlBlock->getFlowctlState()) {
-            if (cnt > 10) {
-                state = false;
-                break;
-            }
-            cnt++;
-        }
-        SysUtil::sleep(WAIT_INTERVAL);
-    } 
-}
-
-int MessageQueue::sem_getvalue_i()
-{
-    int i = -1;
-#ifndef __APPLE__
-    ::sem_getvalue(&sem, &i);
-#endif /* __APPLE__ */
-    return i;
-}
-
-void MessageQueue::produce(Message *msg)
-{
-    int len = 0; 
-
-    if (!msg) {
-        return;
-    }
-    len = msg->getContentLen();
-    lock();
-    queue.push_back(msg);
-
-    thresHold += len;
-
-    unlock();
-#ifdef _SCI_DEBUG
-#ifndef __APPLE__
-    int val = sem_getvalue_i();
-    log_debug("queue %s: produce: sem value = %ld, thresHold = %ld", name.c_str(), val, thresHold);
-#endif /* __APPLE__ */
-#endif
-    release();
-    flowControl(len);
-
-    return;
-}
-
-int  MessageQueue::multiConsume(Message **msgs, int num)
-{
-    int i;
-    int len = 0;
-
-    for (i = 0; i < num; i++) {
-        if (sem_wait_i(-1) != 0) {
-            return -1;
-        }
-    }
-    lock();
-    for (i = 0; i < num; i++) {
-        msgs[i] = queue.front();
-        queue.pop_front();
-        len += msgs[i]->getContentLen();
-    }
-    thresHold -= len;
-
-    unlock();
-
-    return 0;
-}
-
-Message* MessageQueue::consume(int millisecs)
-{
-    int len = 0;
-
-    if (sem_wait_i(millisecs*1000) != 0) {
-        return NULL;
-    }
-
-    Message *msg = NULL;
-
-    lock();
-    if (!queue.empty()) {
-        msg = queue.front();
-        len = msg->getContentLen();
-        thresHold -= len;
-    }
-    unlock();
-
-    return msg;
-}
-
-void MessageQueue::remove()
-{
-    Message *msg = NULL;
-
-    lock();
-    if (queue.empty()) {
-        unlock();
-        return;
-    }
-
-    msg = queue.front();
-    queue.pop_front();
-    unlock();
-    if (decRefCount(msg->getRefCount()) == 0) {
-        delete msg;
-    }
-}
-
-int MessageQueue::getSize() 
-{
-    int size;
-
-    lock();
-    size = queue.size();
-    unlock();
-
-    return size;
-}
-
-bool MessageQueue::getState()
-{
-    return state;
-}
-
-void MessageQueue::setName(char *str)
-{
-    name = str;
-    if (name == "filterInQ") { 
-        flowCtl = true;
-    }
-}
-
-string MessageQueue::getName()
-{
-    return name;
-}
-
-int MessageQueue::sem_wait_i(int usecs)
-{
-    int rc = 0;
-
-#ifdef _SCI_DEBUG
-#ifndef __APPLE__
-    int val = sem_getvalue_i();
-    log_debug("queue %s: sem value = %ld, thresHold = %ld", name.c_str(), val, thresHold);
-#endif /* __APPLE__ */
-#endif
-
-#ifndef __APPLE__
-    if (usecs < 0) {
-        while (((rc = ::sem_wait(&sem)) != 0) && (errno == EINTR));
-        return rc;
-    } else { 
-        timespec ts;
-        ::clock_gettime(CLOCK_REALTIME, &ts);    // get current time
-        ts.tv_nsec += (usecs % 1000000) * 1000;
-        int ca = (ts.tv_nsec >= 1000000000) ? 1 : 0;
-        ts.tv_nsec %= 1000000000;
-        ts.tv_sec += (usecs / 1000000) + ca;
-        
-        while (((rc=::sem_timedwait(&sem, &ts))!=0) && (errno == EINTR));
-        return rc;
-    }
-#else /* __APPLE__ */
-    if (usecs < 0) {
-        ::semaphore_wait(sem);
-    } else {
-        mach_timespec_t ts;
-        struct timeval tv;
-        ::gettimeofday(&tv, NULL);    // get current time
-        ts.tv_nsec = (tv.tv_usec + (usecs % 1000000)) * 1000;
-        int ca = (ts.tv_nsec >= 1000000000) ? 1 : 0;
-        ts.tv_nsec %= 1000000000;
-        ts.tv_sec = tv.tv_sec + (usecs / 1000000) + ca;
-
-        ::semaphore_timedwait(sem, ts);
-    }
-    return 0;
-#endif /* __APPLE__ */
-}
-
-void MessageQueue::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void MessageQueue::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp
deleted file mode 100644
index cff4456..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: MessageQueue
-
- Description: Messages manipulation.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _QUEUE_HPP
-#define _QUEUE_HPP
-
-#include <deque>
-#include <string>
-
-using namespace std;
-
-#include <semaphore.h>
-#include <pthread.h>
-#ifdef __APPLE__
-#include <mach/task.h>
-#include <mach/semaphore.h>
-#endif /* __APPLE__ */
-
-#include "sci.h"
-#include "general.hpp"
-
-#include "stream.hpp"
-
-class Message;
-
-class MessageQueue 
-{      
-    private:
-        deque<Message*>                 queue;
-        pthread_mutex_t                 mtx;
-#ifndef __APPLE__
-        sem_t                           sem;
-#else /* __APPLE__ */
-        semaphore_t						sem;
-        task_t							task;
-#endif /* __APPLE__ */
-        string                          name;
-        volatile long long              thresHold;
-        bool                            flowCtl;
-        bool                            state;
-
-    public:
-        MessageQueue(bool ctl = false);
-        ~MessageQueue();
-
-        void produce(Message *msg);
-        void release();
-        int multiProduce(Message **msgs, int num);
-        int multiConsume(Message **msgs, int num);
-        Message *consume(int millisecs=-1);
-        void remove();
-
-        int getSize();
-        bool getState();
-
-        void setName(char *str); 
-        string getName();
-
-    private:
-        int sem_wait_i(int usecs);
-        int sem_getvalue_i();
-
-        void lock();
-        void unlock();
-        int flowControl(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp
deleted file mode 100644
index b4f142e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ReaderProcessor
-
- Description: Properties of class 'ReaderProcessor':
-    input: a stream
-    output: two message queues
-    action: relay messages from the stream to the queues, normal messages to a
-            queue, error handling messages to another queue
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-   01/16/12 ronglli    Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#include "readerproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-#include "writerproc.hpp"
-
-#include "eventntf.hpp"
-#include "tools.hpp"
-
-ReaderProcessor::ReaderProcessor(int hndl) 
-    : Processor(hndl), recoverID(-1), notifyID(-1), peerProcessor(NULL) 
-{
-    name = "Reader";
-
-    inStream = NULL;
-    outQueue = NULL;
-
-    outErrorQueue = NULL;
-}
-
-ReaderProcessor::~ReaderProcessor()
-{
-}
-
-Message * ReaderProcessor::read()
-{
-    assert(inStream);
-    Message *msg = NULL;
-
-    msg = new Message();
-    *inStream >> *msg;
-
-    return msg;
-}
-
-void ReaderProcessor::process(Message * msg)
-{
-    assert(msg);
-    // no action
-}
-
-void ReaderProcessor::write(Message * msg)
-{
-    assert(outQueue);
-
-    // normal and error messages to different queues
-    switch (msg->getType()) {
-        case Message::GROUP_MERGE:
-        case Message::ERROR_EVENT:
-            // use 'id' field to store child agent id information, and transfer this message
-            // to router processor
-            msg->setID(handle);
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            if (outErrorQueue) {
-                outErrorQueue->produce(msg);
-            } else {
-                delete msg;
-            }
-            break;
-        case Message::SOCKET_BROKEN:
-        case Message::ERROR_DATA:
-        case Message::ERROR_THREAD:
-            {
-                gCtrlBlock->notifyChildHealthState(msg);
-            }
-            break;
-        default:
-            outQueue->produce(msg);
-            break;
-    }
-}
-
-void ReaderProcessor::seize()
-{    
-    // exit the peer relay processor thread related to the same socket
-    setState(false);  
-    if (!gCtrlBlock->getTermState()) {
-        gCtrlBlock->notifyChildHealthState(handle, hState); 
-    }
-}
-
-int ReaderProcessor::recover()
-{    
-    // exit the peer relay processor thread related to the same socket
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode())) {
-        return -1;
-    }
-    inStream->stopRead(); 
-
-    WriterProcessor * writer = getPeerProcessor(); 
-    while(!(writer->isLaunched())) {
-        SysUtil::sleep(WAIT_INTERVAL);
-    }
-    if (!(writer->getRecoverState())) {
-        Message *msg = new Message(); 
-        msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::RELEASE);
-        writer->setReleaseState(true);
-        writer->getInQueue()->produce(msg);
-    }
-
-    if (recoverID == -1) {
-        recoverID = gNotifier->allocate();
-    }
-
-    Stream *st;
-    if (gNotifier->freeze_i(recoverID, &st) != 0) {
-        log_debug("reader%d: recover error: freeze_i failed for the stream %p, recoverID = %d", handle, st, recoverID);
-        return -1;
-    }
-    log_debug("reader%d: finish freeze for the stream %p, recoverID = %d", handle, st, recoverID);
-    recoverID = gNotifier->allocate();
-    log_debug("reader%d: begin to notify notifyID %d", handle, notifyID);
-    if (gNotifier->notify_i(notifyID) != 0) {
-        log_debug("reader%d: recover error: notify_i failed for the stream %p, recoverID = %d", handle, st, recoverID);
-        return -1;
-    }
-    
-    inStream = st;
-    return 0; 
-}
-
-void ReaderProcessor::clean()
-{
-    inStream->stopRead();
-    setState(false);    
-}
-
-void ReaderProcessor::setInStream(Stream * stream)
-{
-    if (inStream == NULL) {
-        log_debug("reader%d: begin to set the stream. Original is NULL", handle);
-        inStream = stream;
-    } else {
-        log_debug("reader%d: begin to notify the stream %p, recoverID = %d", handle, stream, recoverID);
-        while (recoverID == -1) {
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-        if (notifyID == -1) {
-            notifyID = gNotifier->allocate();
-        }
-        *(Stream **)gNotifier->getRetVal(recoverID) = stream;
-        gNotifier->notify(recoverID);
-        log_debug("reader%d: finish notify the recoverID %d", handle, recoverID);
-        log_debug("reader%d: begin to freeze the notifyID %d", handle, notifyID);
-        gNotifier->freeze(notifyID, NULL);
-        log_debug("reader%d: finish freeze the notifyID %d", handle, notifyID);
-        notifyID = gNotifier->allocate();
-    }
-
-}
-
-void ReaderProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void ReaderProcessor::setOutErrorQueue(MessageQueue * queue)
-{
-    outErrorQueue = queue;
-}
-
-void ReaderProcessor::setPeerProcessor(WriterProcessor* processor)
-{
-    peerProcessor =  processor;
-}
-
-WriterProcessor *ReaderProcessor::getPeerProcessor()
-{
-    return peerProcessor;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp
deleted file mode 100644
index 5a707a6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ReaderProcessor
-
- Description: Properties of class 'ReaderProcessor':
-    input: a stream
-    output: two message queues
-    action: relay messages from the stream to the queues, normal messages to a
-            queue, error handling messages to another queue
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _READERPROC_HPP
-#define _READERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class WriterProcessor;
-
-class ReaderProcessor : public Processor 
-{
-    private:
-        Stream              *inStream;
-        MessageQueue        *outErrorQueue;
-        int                 recoverID;
-        int                 notifyID;
-        WriterProcessor     *peerProcessor;
-
-    public:
-        ReaderProcessor(int hndl = -1);
-        ~ReaderProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        void setInStream(Stream *stream);
-        void setOutQueue(MessageQueue *queue);
-
-        void setOutErrorQueue(MessageQueue *queue);
-
-        void setPeerProcessor(WriterProcessor* processor);
-        WriterProcessor *getPeerProcessor();
-
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp
deleted file mode 100644
index 611100c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp
+++ /dev/null
@@ -1,346 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RouterProcessor
-
- Description: Properties of class 'RouterProcessor':
-    input: a. a stream 
-           b. a message queue
-    output: a set of message queues
-    action: route the message to the designated destination
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-   01/16/12 ronglli    Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include "sci.h"
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "atomic.hpp"
-#include "routerproc.hpp"
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "routinglist.hpp"
-#include "topology.hpp"
-#include "eventntf.hpp"
-#include "privatedata.hpp"
-#include "initializer.hpp"
-#include "sshfunc.hpp"
-#include "writerproc.hpp"
-#include "tools.hpp"
-
-RouterProcessor::RouterProcessor(int hndl, RoutingList *rlist, FilterList *flist) 
-    : Processor(hndl), curFilterID(SCI_FILTER_NULL), curGroup(SCI_GROUP_ALL), inStream(NULL), routingList(rlist), filterList(flist), joinSegs(false), peerProcessor(NULL)
-{
-    name = "Router";
-    PrivateData *pData = new PrivateData(routingList, filterList, NULL, this);
-    setSpecific(pData);
-}
-
-RouterProcessor::~RouterProcessor()
-{
-    if (inQueue)
-        delete inQueue;
-}
-
-Message * RouterProcessor::read()
-{
-    assert(inQueue || inStream);
-
-    Message *msg = NULL;
-    if (inStream) {
-        msg = new Message();
-        *inStream >> *msg;
-    } else {
-        msg = inQueue->consume();
-    }
-
-    if (msg && (msg->getType() == Message::SEGMENT) && (msg->getFilterID() == SCI_JOIN_SEGMENT)) {
-        joinSegs = true;
-        msg = Message::joinSegments(msg, inStream, inQueue);
-    }
-
-    return msg;
-}
-
-void RouterProcessor::process(Message * msg)
-{
-    Filter *filter = NULL;
-    Topology *topo = routingList->getTopology();
-    int rc;
-    
-    switch (msg->getType()) {
-        case Message::SEGMENT:
-            routingList->bcast(msg->getGroup(), msg);
-            break;
-        case Message::COMMAND:
-            if (msg->getFilterID() == SCI_FILTER_NULL) {
-                // bcast the message
-                routingList->bcast(msg->getGroup(), msg);
-            } else {
-                filter = filterList->getFilter(msg->getFilterID());
-                if (filter != NULL) {
-                    // call user's filter handler
-                    curFilterID = msg->getFilterID();
-                    curGroup = msg->getGroup();
-                    filter->input(msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-                } else {
-                    // bcast the message
-                    routingList->bcast(msg->getGroup(), msg);
-                }
-            }
-            break;
-        case Message::CONFIG:
-            topo->unpackMsg(*msg);
-            topo->setRoutingList(routingList);
-            topo->setFilterList(filterList);
-            
-            rc = topo->deploy();
-            break;
-        case Message::FILTER_LOAD:
-        case Message::FILTER_UNLOAD:
-            if (msg->getType() == Message::FILTER_LOAD) {
-                filter = new Filter();
-                filter->unpackMsg(*msg);
-                rc = filterList->loadFilter(filter->getId(), filter);
-            } else {
-                rc = filterList->unloadFilter(msg->getFilterID());
-            }
-
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());   
-            }
-
-            routingList->bcast(SCI_GROUP_ALL, msg);
-            break;
-        case Message::FILTER_LIST:
-            filterList->loadFilterList(*msg);
-            break;
-        case Message::GROUP_CREATE:
-        case Message::GROUP_FREE:
-        case Message::GROUP_OPERATE:
-        case Message::GROUP_OPERATE_EXT:
-        case Message::GROUP_DROP:
-        case Message::GROUP_MERGE:
-            routingList->parseCmd(msg);
-            break;
-        case Message::BE_ADD:
-            rc = gCtrlBlock->getTopology()->addBE(msg);
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());
-            }
-            break;
-        case Message::BE_REMOVE:
-            rc = gCtrlBlock->getTopology()->removeBE(msg);
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());
-            }
-            break;
-        case Message::QUIT:
-            gCtrlBlock->setTermState(true);
-            gCtrlBlock->setRecoverMode(0);
-            routingList->bcast(SCI_GROUP_ALL, msg);
-            setState(false);
-            break;
-        case Message::RELEASE:
-            setState(false);
-            break;
-        case Message::UNCLE_LIST:
-        case Message::ERROR_EVENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            routingList->bcast(SCI_GROUP_ALL, msg);
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void RouterProcessor::write(Message * msg)
-{
-    if (joinSegs || inStream) {
-        joinSegs = false;
-        if (decRefCount(msg->getRefCount()) == 0)
-            delete msg;
-        return;
-    }
-        
-    inQueue->remove();
-}
-
-void RouterProcessor::seize()
-{
-    try {
-        Message *msg = new Message();
-        msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::QUIT);
-        routingList->bcast(SCI_GROUP_ALL, msg);
-    } catch (std::bad_alloc) {
-        log_error("Processor Router: out of memory");
-        // To do; add correct error handling
-    }
-    gCtrlBlock->setTermState(true); // do not need to notify the parent the error children
-    setState(false);
-}
-
-int RouterProcessor::recover()
-{
-    int rc = -1;
-
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode())) {
-        return rc;
-    }
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        return rc;
-    }
-
-    log_debug("Routerproc: begin to do the recover");
-    if (gCtrlBlock->getParentInfoWaitState()) {
-        while (gInitializer->pInfoUpdated == false) { 
-            if (gCtrlBlock->getTermState()) {
-                log_debug("Routerproc: incorrect state");
-                return rc;
-            }
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-    }
-
-    while ((rc != 0) && (!gCtrlBlock->getTermState())) {
-        try {
-            struct iovec sign = {0};
-            int hndl = gInitializer->getOrgHandle(); 
-            int pID = gInitializer->getParentID();
-            string pAddr = gInitializer->getParentAddr();
-            int pPort = gInitializer->getParentPort();
-
-            inStream->stopRead();
-
-            WriterProcessor * writer = getPeerProcessor();
-            while(!(writer->isLaunched())) {
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-            
-            if (!writer->getRecoverState()) {
-                Message *msg = new Message(); 
-                msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::RELEASE);
-
-                log_debug("Routerproc: begin to set the writer release state to false");
-                writer->setReleaseState(true);
-                writer->getInQueue()->produce(msg);
-            }
-            while(!(writer->getRecoverState())) {
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-            
-            log_debug("Routerproc: Begin to do Recover: My parent host is %s, parent port is %d, parent id is %d", pAddr.c_str(), pPort, pID);
-            rc = inStream->init(pAddr.c_str(), pPort);
-            if (rc != 0) {
-                SysUtil::sleep(WAIT_INTERVAL);
-                continue;
-            }
-            gInitializer->setInStream(inStream);
-            psec_sign_data(&sign, "%d%d%d", gCtrlBlock->getJobKey(), hndl, pID);
-            *inStream << gCtrlBlock->getJobKey() << hndl << pID << sign << endl;
-            *inStream >> endl;
-
-            psec_free_signature(&sign);
-            log_debug("Routerproc: Recover: My parent host is %s, parent port is %d, parent id is %d", pAddr.c_str(), pPort, pID);
-
-            writer->setOutStream(inStream);
-
-            if ((rc == 0) && (gCtrlBlock->getParentInfoWaitState())) {
-                log_debug("Routerproc: begin to notify %d", gInitializer->notifyID);
-                gInitializer->pInfoUpdated = false;
-                gCtrlBlock->setParentInfoWaitState(false);
-                gNotifier->notify(gInitializer->notifyID);
-                log_debug("Routerproc: finish notify %d", gInitializer->notifyID);
-            }
-
-        } catch (SocketException &e) {
-            rc = -1;
-            log_error("Routerproc: socket exception: %s", e.getErrMsg().c_str());
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-    }
-
-    return rc;
-}
-
-void RouterProcessor::clean()
-{
-    if (inStream)
-        inStream->stopRead();
-    gCtrlBlock->setFlowctlState(false);
-    routingList->stopRouting();
-    gCtrlBlock->disable();
-}
-
-int RouterProcessor::getCurFilterID()
-{
-    return curFilterID;
-}
-
-sci_group_t RouterProcessor::getCurGroup()
-{
-    return curGroup;
-}
-
-void RouterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-MessageQueue * RouterProcessor::getInQueue()
-{
-    return inQueue;
-}
-
-void RouterProcessor::setInStream(Stream * stream)
-{
-    inStream = stream;
-}
-
-RoutingList * RouterProcessor::getRoutingList()
-{
-    return routingList;
-}
-
-void RouterProcessor::setPeerProcessor(WriterProcessor * processor)
-{
-        peerProcessor =  processor;
-}
-
-WriterProcessor *RouterProcessor::getPeerProcessor()
-{
-        return peerProcessor;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp
deleted file mode 100644
index 790e830..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RouterProcessor
-
- Description: Properties of class 'RouterProcessor':
-    input: a. a stream 
-           b. a message queue
-    output: a set of message queues
-    action: route the message to the designated destination
-   
- Author: Nicole Nie     Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ROUTERPROC_HPP
-#define _ROUTERPROC_HPP
-
-#include "sci.h"
-
-#include "processor.hpp"
-
-class MessageQueue;
-class Stream;
-class RoutingList;
-class FilterList;
-
-class WriterProcessor;
-
-class RouterProcessor : public Processor 
-{
-    private:
-        Stream              *inStream;
-        RoutingList         *routingList;
-        FilterList          *filterList;
-
-        int                 curFilterID;
-        sci_group_t         curGroup;
-        bool                joinSegs;
-
-        WriterProcessor     *peerProcessor; 
-
-    public:
-        RouterProcessor(int hndl, RoutingList *rlist, FilterList *flist);
-        ~RouterProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        int getCurFilterID();
-        sci_group_t getCurGroup();
-
-        void setInQueue(MessageQueue *queue);
-        MessageQueue * getInQueue();
-        void setInStream(Stream * stream);
-        RoutingList * getRoutingList();
-
-        void setPeerProcessor(WriterProcessor * processor);
-        WriterProcessor * getPeerProcessor();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp
deleted file mode 100644
index a59abc2..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp
+++ /dev/null
@@ -1,661 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RoutingList
-
- Description: Provide routing services for all threads.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (D156654)
-   01/16/12 ronglli      Add codes to retrieve BE list
-
-****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-
-#include <vector>
-
-#include "log.hpp"
-#include "packer.hpp"
-#include "group.hpp"
-#include "tools.hpp"
-#include "exception.hpp"
-#include "stream.hpp"
-#include "sshfunc.hpp"
-
-#include "routinglist.hpp"
-#include "eventntf.hpp"
-#include "initializer.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "ctrlblock.hpp"
-#include "filterproc.hpp"
-#include "readerproc.hpp"
-#include "topology.hpp"
-#include "writerproc.hpp"
-#include "eventntf.hpp"
-#include "dgroup.hpp"
-
-
-using namespace std;
-
-const int MAX_SUCCESSOR_NUM = 1024;
-const int MAX_SEGMENT_SIZE = 11680;
-const int MIN_SEGMENT_SIZE = 1440;  // 1500 - 40 - 20 (ethernet MTU - tcp/ip header - message header)
-
-RoutingList::RoutingList(int hndl)
-    : handle(hndl), maxSegmentSize(MAX_SEGMENT_SIZE), filterProc(NULL), myDistriGroup(NULL), topology(NULL)
-{
-    char *envp = ::getenv("SCI_SEGMENT_SIZE");
-    if (envp != NULL) {
-        maxSegmentSize = atoi(envp);
-        maxSegmentSize = maxSegmentSize > MIN_SEGMENT_SIZE ? maxSegmentSize : MIN_SEGMENT_SIZE;
-    }
-
-    if (handle == -1) {
-        // this is a front end, not parent
-        myDistriGroup = new DistributedGroup(0);
-    } else {
-        int pid = -1;
-        envp = ::getenv("SCI_PARENT_ID");
-        if (envp) {
-            pid = ::atoi(envp);
-        } else {
-            throw Exception(Exception::INVALID_LAUNCH);
-        }
-        myDistriGroup = new DistributedGroup(pid);
-    }
-
-    if (gCtrlBlock->getMyRole() != CtrlBlock::BACK_END) {
-        topology = new Topology(0); // 0 is an impossible agent ID so it will be changed when it receives a real topology
-    }
-    successorList = new int[MAX_SUCCESSOR_NUM];
-    queueInfo.clear();
-    routers.clear();
-    ::pthread_mutex_init(&mtx, NULL); 
-}
-
-RoutingList::~RoutingList()
-{  
-    delete myDistriGroup;
-    delete [] successorList;
-    delete topology;
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void RoutingList::parseCmd(Message *msg)
-{
-    bool notify = false;
-    int rc = SCI_SUCCESS;
-    if (msg->getType() == Message::GROUP_CREATE) {
-        Packer packer(msg->getContentBuf());
-
-        int num_bes = packer.unpackInt();
-        int be_list[num_bes];
-        for (int i=0; i<num_bes; i++) {
-            be_list[i] = packer.unpackInt();
-        }
-
-        myDistriGroup->create(num_bes, be_list, msg->getGroup());
-        bcast(msg->getGroup(), msg);
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_FREE) {
-        sci_group_t group = msg->getGroup();
-        
-        bcast(group, msg);
-        myDistriGroup->remove(group);
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_OPERATE) {
-        Packer packer(msg->getContentBuf());
-
-        sci_op_t op = (sci_op_t) packer.unpackInt();
-        sci_group_t group1 = (sci_group_t) packer.unpackInt();
-        sci_group_t group2 = (sci_group_t) packer.unpackInt();
-
-        rc = myDistriGroup->operate(group1, group2, op, msg->getGroup());
-        if (rc == SCI_SUCCESS) {
-            bcast(msg->getGroup(), msg);
-        }
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_OPERATE_EXT) {
-        Packer packer(msg->getContentBuf());
-
-        sci_op_t op = (sci_op_t) packer.unpackInt();
-        sci_group_t group = (sci_group_t) packer.unpackInt();
-        int num_bes = packer.unpackInt();
-        int be_list[num_bes];
-        for (int i=0; i<num_bes; i++) {
-            be_list[i] = packer.unpackInt();
-        }
-
-        rc = myDistriGroup->operateExt(group, num_bes, be_list, op, msg->getGroup());
-        if (rc == SCI_SUCCESS) {
-            bcast(msg->getGroup(), msg);
-        }
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_DROP) {
-        myDistriGroup->dropSuccessor(msg->getID());
-    } else if (msg->getType() == Message::GROUP_MERGE) {
-        DistributedGroup subDistriGroup(-1);
-        subDistriGroup.unpackMsg(*msg);
-
-        if (subDistriGroup.getPID() == handle) {
-            // if this message is from my son
-            myDistriGroup->merge(msg->getID(), subDistriGroup, false);
-        } else if (isSuccessorExist(subDistriGroup.getPID())){
-            // if this message is from my grandson
-            myDistriGroup->merge(msg->getID(), subDistriGroup, false);
-        } else {
-            // if this message is from my nephew
-            myDistriGroup->merge(msg->getID(), subDistriGroup, true);
-
-            // now update its parent id to me
-            subDistriGroup.setPID(handle);
-
-            // repack a message and send to my parent
-            Message *newmsg = subDistriGroup.packMsg();
-            filterProc->getOutQueue()->produce(newmsg);
-        }
-    } else {
-        assert(!"should never be here");
-    }
-
-    if (notify) {
-        void *ret = gNotifier->getRetVal(msg->getID());
-        *((int *) ret) = rc;
-        gNotifier->notify(msg->getID());
-    }
-}
-
-void RoutingList::propagateGroupInfo()
-{
-    // propgate my group information to my parent
-    Message *msg = myDistriGroup->packMsg();
-    if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        filterProc->getOutQueue()->produce(msg);
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        gCtrlBlock->getUpQueue()->produce(msg);
-    } else {
-        assert(!"should not be here");
-    }
-}
-
-int RoutingList::getSegments(Message *msg, Message ***segments, int ref)
-{
-    int i = 0;
-    int segnum = (msg->getContentLen() + maxSegmentSize - 1) / maxSegmentSize + 1;
-    int size = 0;
-    char *ptr = msg->getContentBuf();
-    sci_group_t gid = msg->getGroup();
-    Message::Type typ = msg->getType();
-    int mid = msg->getID();
-    int mfid = msg->getFilterID();
-    int hfid = mfid;
-    int mlen = msg->getContentLen();
-    *segments = (Message **)::malloc(segnum * sizeof(Message *));
-    Message **segs = *segments;
-
-    if ((mfid != SCI_FILTER_NULL) || (typ != Message::COMMAND)) {
-        hfid = SCI_JOIN_SEGMENT;
-    }
-    ::memset(segs, 0, segnum * sizeof(Message *));
-    segs[0] = new Message();
-    segs[0]->build(hfid, gid, 0, NULL, NULL, Message::SEGMENT, segnum);
-    segs[0]->setRefCount(ref);
-
-    for (i = 1; i < segnum; i++) {
-        segs[i] = new Message();
-        size = (i < (segnum - 1)) ? maxSegmentSize : ((mlen - 1) % maxSegmentSize + 1);
-        segs[i]->build(mfid, gid, 1, &ptr, &size, typ, mid);
-        segs[i]->setRefCount(ref);
-        ptr += size;
-    }
-
-    return segnum;
-}
-
-int RoutingList::bcast(sci_group_t group, Message *msg)
-{
-    if (group > SCI_GROUP_ALL) {
-        int hndl = querySuccessorId((int) group);
-        if (hndl == INVLIDSUCCESSORID) {
-            return SCI_ERR_GROUP_NOTFOUND;
-        } else if (hndl == VALIDBACKENDIDS) {
-            ucast((int)group, msg);
-        } else {
-            ucast(hndl, msg);
-        }
-        return SCI_SUCCESS;
-    }
-    
-    if (!isGroupExist(group)) {
-        return SCI_ERR_GROUP_NOTFOUND;
-    }
-
-    splitBcast(group, msg);
-    
-    return SCI_SUCCESS;
-}
-
-void RoutingList::splitBcast(sci_group_t group, Message *msg)
-{
-    int numSor = numOfSuccessor(group);
-    retrieveSuccessorList(group, successorList);
-    mcast(msg, successorList, numSor);
-}
-
-void RoutingList::mcast(Message *msg, int *sorList, int num)
-{
-    int i = 0;
-
-    if (msg->getContentLen() <= maxSegmentSize) {
-        msg->setRefCount(msg->getRefCount() + num);
-        for (i = 0; i < num; i++) {
-            queryQueue(sorList[i])->produce(msg);
-        }
-        return;
-    }
-
-    Message **segments;
-    int segnum = getSegments(msg, &segments, num);
-    for (i = 0; i < num; i++) {
-        queryQueue(sorList[i])->multiProduce(segments, segnum);
-    }
-    ::free(segments);
-}
-
-void RoutingList::ucast(int successor_id, Message *msg, int refInc)
-{
-    log_debug("Processor Router: send msg to successor %d", successor_id);
-    mcast(msg, &successor_id, refInc);
-
-    return;
-}
-
-void RoutingList::initSubGroup(int successor_id, int start_be_id, int end_be_id)
-{
-    char qName[64] = {0};
-    MessageQueue *queue = NULL;
-
-    if (successor_id != VALIDBACKENDIDS) {
-        queue = new MessageQueue();
-        ::sprintf(qName, "Agent%d_inQ", successor_id);
-        queue->setName(qName);
-        mapQueue(successor_id, queue);
-    } else {
-        int i = 0;
-        for (i = start_be_id; i <= end_be_id; i++) {
-            queue = new MessageQueue();
-            ::sprintf(qName, "BE%d_inQ", i);
-            queue->setName(qName);
-            mapQueue(i, queue);
-        }
-    }
-
-    myDistriGroup->initSubGroup(successor_id, start_be_id, end_be_id);
-}
-
-int RoutingList::startReading(int hndl)
-{
-    ROUTING_MAP::iterator it = routers.find(hndl);
-    assert(it != routers.end());
-    ReaderProcessor *reader = it->second.processor->getPeerProcessor();
-    reader->start();
-
-    return 0;
-}
-
-int RoutingList::startReaders()
-{
-    ReaderProcessor *reader = NULL;
-    ROUTING_MAP::iterator pit;
-
-    for (pit = routers.begin(); pit != routers.end(); ++pit) {
-        while (pit->second.processor == NULL) {
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-        reader = pit->second.processor->getPeerProcessor();
-        while (reader == NULL) {
-            SysUtil::sleep(WAIT_INTERVAL);
-            reader = pit->second.processor->getPeerProcessor();
-        }
-        reader->start();
-    }
-
-    return 0;
-}
-
-int RoutingList::numOfStreams()
-{
-    int size;
-    lock();
-    size = routers.size();
-    unlock();
-    return size;
-}
-
-int RoutingList::getStreamsSockfds(int *fds)
-{
-    int i = 0;
-    ROUTING_MAP::iterator it;
-
-    lock();
-    for (it = routers.begin(); it != routers.end(); ++it) {
-        fds[i] = it->second.stream->getSocket();
-        i++;
-    }
-    unlock();
-
-    return i;
-}
-
-int RoutingList::isActiveSockfd(int fd)
-{
-    int isSocket = 0;
-    ROUTING_MAP::iterator it;
-
-    lock();
-    for (it = routers.begin(); it != routers.end(); ++it) {
-        if (fd == it->second.stream->getSocket()) {
-            if ((it->second.stream->isReadActive()) || (it->second.stream->isWriteActive()) ){
-                isSocket = 1;
-                break;
-            }
-        }
-    }
-    unlock();
-
-    return isSocket;
-}
-
-bool RoutingList::allActive()
-{
-    bool active = true;
-    ROUTING_MAP::iterator it;
-
-    lock();
-    for (it = routers.begin(); it != routers.end(); ++it) {
-        if ((!(it->second.stream->isReadActive())) || (!(it->second.stream->isWriteActive())) ){
-            active = false;
-            break;
-        }
-    }
-    unlock();
-
-    return active;
-}
-
-void RoutingList::mapRouters(int hndl, WriterProcessor *writer, Stream *stream)
-{
-    lock();
-    if (writer != NULL) {
-        routers[hndl].processor = writer;
-    }
-    routers[hndl].stream = stream;
-    unlock();
-}
-
-int RoutingList::startRouting(int hndl, Stream *stream)
-{
-    char name[64] = {0};
-    MessageQueue *inQ = queryQueue(hndl);
-    while (inQ == NULL) {
-        SysUtil::sleep(WAIT_INTERVAL);
-        inQ = queryQueue(hndl);
-    }
-
-    WriterProcessor *writer = NULL;
-    if ((routers.find(hndl) != routers.end()) && (routers[hndl].stream != NULL)) {
-        if (!gCtrlBlock->getRecoverMode()) {
-            log_error("Duplicated client are trying to connect!!!");
-            return -1;
-        }
-        writer = routers[hndl].processor;
-        while(!(writer->getRecoverState())) {
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-
-        writer->setOutStream(stream);
-        mapRouters(hndl, NULL, stream);
-        return 0;
-    }
-
-    log_debug("routers[%d].stream = %p", hndl, stream);
-    ReaderProcessor *reader = new ReaderProcessor(hndl);
-    reader->setInStream(stream);
-    reader->setOutQueue(filterProc->getInQueue());
-    ::sprintf(name, "Reader%d", hndl);
-    reader->setName(name);
-
-    writer = new WriterProcessor(hndl);
-    writer->setInQueue(inQ);
-    writer->setOutStream(stream);
-    ::sprintf(name, "Writer%d", hndl);
-    writer->setName(name);
-
-    // reader is a peer processor of writer
-    writer->setPeerProcessor(reader);
-    reader->setPeerProcessor(writer);
-    mapRouters(hndl, writer, stream);
-
-    log_debug("The Reader%d thread has been newed!", hndl);
-    writer->start();
-    reader->start(); 
-
-    return 0;
-}
-
-int RoutingList::stopRouting(int hndl)
-{
-    ROUTING_MAP::iterator pit = routers.find(hndl);
-    if (pit != routers.end()) {
-        pit->second.processor->release();
-        delete pit->second.processor;
-
-        routers.erase(hndl);
-        queueInfo.erase(hndl);
-    }
-
-    return 0;
-}
-
-int RoutingList::stopRouting()
-{
-    // waiting for all processor threads terminate
-    ROUTING_MAP::iterator pit;
-    for (pit = routers.begin(); pit != routers.end(); ++pit) {
-        pit->second.processor->release();
-        delete pit->second.processor;
-    }
-
-    routers.clear();
-    queueInfo.clear();
-
-    return 0;
-}
-
-bool RoutingList::allRouted()
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_AGENT) {
-        char *envp = getenv("SCI_EMBED_AGENT");
-        if ((envp != NULL) && (strcasecmp(envp, "yes") == 0)) {
-            return (numOfQueues() == (numOfStreams() + 1));  // queueInfo contains itself
-        }
-    }
-
-    return (numOfQueues() == numOfStreams()); 
-}
-
-void RoutingList::addBE(sci_group_t group, int successor_id, int be_id, bool init)
-{
-    if (init) {
-        char qName[64] = {0};
-        int qID = 0;
-        MessageQueue *queue = new MessageQueue();
-
-        if (successor_id == VALIDBACKENDIDS) {
-            qID = be_id;
-            ::sprintf(qName, "BE%d_inQ", qID);
-        } else {
-            qID = successor_id;
-            ::sprintf(qName, "Agent%d_inQ", qID);
-        }
-        queue->setName(qName);
-        mapQueue(qID, queue);
-    }
-
-    myDistriGroup->addBE(group, successor_id, be_id);
-}
-
-void RoutingList::removeBE(int be_id)
-{
-    myDistriGroup->removeBE(be_id);
-}
-
-void RoutingList::removeGroup(sci_group_t group)
-{
-    myDistriGroup->remove(group);
-}
-
-void RoutingList::updateParentId(int pid)
-{
-    ::setenv("SCI_PARENT_ID", SysUtil::itoa(pid).c_str(), 1);
-    myDistriGroup->setPID(pid);
-}
-
-bool RoutingList::isGroupExist(sci_group_t group)
-{
-    return myDistriGroup->isGroupExist(group);
-}
-
-bool RoutingList::isSuccessorExist(int successor_id)
-{
-    return myDistriGroup->isSuccessorExist(successor_id);
-}
-
-
-int RoutingList::numOfBE(sci_group_t group)
-{
-    return myDistriGroup->numOfBE(group);
-}
-
-int RoutingList::numOfSuccessor(sci_group_t group)
-{
-    return myDistriGroup->numOfSuccessor(group);
-}
-
-int RoutingList::numOfBEOfSuccessor(int successor_id)
-{
-    if (successor_id >= 0) {
-        // if it is a back end
-        return 1;
-    }
-
-    return myDistriGroup->numOfBEOfSuccessor(successor_id);
-}
-
-int RoutingList::querySuccessorId(int be_id)
-{
-    return myDistriGroup->querySuccessorId(be_id);
-}
-
-void RoutingList::retrieveBEList(sci_group_t group, int * ret_val)
-{
-    assert(ret_val);
-    myDistriGroup->retrieveBEList(group, ret_val);
-}
-
-void RoutingList::retrieveSuccessorList(sci_group_t group, int * ret_val)
-{
-    assert(ret_val);
-    myDistriGroup->retrieveSuccessorList(group, ret_val);
-}
-
-void RoutingList::retrieveBEListOfSuccessor(int successor_id, int * ret_val)
-{
-    assert(ret_val);
-    myDistriGroup->retrieveBEListOfSuccessor(successor_id, ret_val);
-}
-
-void RoutingList::mapQueue(int hndl, MessageQueue *queue)
-{
-    lock();
-    queueInfo[hndl] = queue;
-    unlock();
-}
-
-MessageQueue * RoutingList::queryQueue(int hndl)
-{       
-    MessageQueue *queue = NULL;
-
-    lock();
-    QUEUE_MAP::iterator qit = queueInfo.find(hndl);
-    if (qit != queueInfo.end()) {
-        queue = (*qit).second;
-    }
-    unlock();
-
-    return queue;
-}
-
-int RoutingList::numOfQueues()
-{
-    int size;
-    lock();
-    size = queueInfo.size();
-    unlock();
-    return size;
-}
-
-void RoutingList::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void RoutingList::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
-Topology * RoutingList::getTopology()
-{
-    return topology;
-}
-
-FilterProcessor * RoutingList::getFilterProcessor()
-{
-    return filterProc;
-}
-
-void RoutingList::setFilterProcessor(FilterProcessor *proc)
-{
-    filterProc = proc;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp
deleted file mode 100644
index fb7115a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp
+++ /dev/null
@@ -1,126 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RoutingList
-
- Description: Provide routing services for all threads.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (D156654)
-   01/16/12 ronglli      Add codes to retrieve BE list
-
-****************************************************************************/
-
-#ifndef _ROUTINGLIST_HPP
-#define _ROUTINGLIST_HPP
-
-#include <pthread.h>
-#include "sci.h"
-#include "general.hpp"
-
-#include <map>
-
-class Message;
-class DistributedGroup;
-class Stream;
-class MessageQueue;
-class WriterProcessor;
-class FilterProcessor;
-class Topology;
-
-#define SCI_JOIN_SEGMENT -1001
-
-using namespace std;
-
-struct routingInfo {
-    Stream *stream;
-    WriterProcessor *processor;
-};
-
-class RoutingList
-{      
-    public:
-        typedef map<int, MessageQueue*> QUEUE_MAP;
-        typedef map<int, struct routingInfo> ROUTING_MAP;
-
-    private:
-        int                    handle;
-        DistributedGroup      *myDistriGroup;
-        int                   *successorList;
-        int                    maxSegmentSize;
-        pthread_mutex_t        mtx;
-        QUEUE_MAP              queueInfo;
-        ROUTING_MAP            routers;
-        FilterProcessor       *filterProc;
-        Topology              *topology;
-        
-    public:
-        RoutingList(int hndl);
-        ~RoutingList();
-        
-        void lock();
-        void unlock();
-        void parseCmd(Message *msg);
-        void propagateGroupInfo();
-        void mapQueue(int hndl, MessageQueue *queue);
-        MessageQueue * queryQueue(int hndl);
-        int numOfQueues();
-        void mapRouters(int hndl, WriterProcessor *writer, Stream *stream);
-
-        int startRouting(int hndl, Stream *stream);
-        int startReading(int hndl);
-        int startReaders();
-        int stopRouting(int hndl);
-        int stopRouting();
-        bool allRouted();
-
-        void setFilterProcessor(FilterProcessor *proc);
-        FilterProcessor * getFilterProcessor();
-        Topology * getTopology();
-
-        int getSegments(Message *msg, Message ***segments, int ref);
-        int bcast(sci_group_t group, Message *msg);
-        void ucast(int successor_id, Message *msg, int refInc = 1);
-        void mcast(Message *msg, int *sorList, int num);
-        void splitBcast(sci_group_t group, Message *msg);
-
-        void initSubGroup(int successor_id, int start_be_id, int end_be_id);
-        void addBE(sci_group_t group, int successor_id, int be_id, bool init = false);
-        void removeBE(int be_id);
-        void removeGroup(sci_group_t group);
-
-        void updateParentId(int pid);
-
-        bool isGroupExist(sci_group_t group);
-        bool isSuccessorExist(int successor_id);
-
-        int numOfBE(sci_group_t group);
-        int numOfSuccessor(sci_group_t group);
-        int numOfBEOfSuccessor(int successor_id);
-        
-        int querySuccessorId(int be_id);
-        void retrieveBEList(sci_group_t group, int *ret_val);
-        void retrieveSuccessorList(sci_group_t, int *ret_val);
-        void retrieveBEListOfSuccessor(int successor_id, int * ret_val);
-        int getStreamsSockfds(int *fds);
-        int numOfStreams();
-
-        int isActiveSockfd(int fd);
-        bool allActive();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp
deleted file mode 100644
index 0e9b3a7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: BEMap, Topology, Launcher
-
- Description: Runtime topology manipulation.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <math.h>
-#include <ctype.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include "log.hpp"
-#include "tools.hpp"
-#include "packer.hpp"
-#include "exception.hpp"
-#include "ipconverter.hpp"
-
-#include "topology.hpp"
-#include "launcher.hpp"
-#include "ctrlblock.hpp"
-#include "initializer.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "routinglist.hpp"
-#include "filterlist.hpp"
-#include "processor.hpp"
-#include "eventntf.hpp"
-#include "listener.hpp"
-#include "sshfunc.hpp"
-#include "purifierproc.hpp"
-#include "embedagent.hpp"
-
-#ifdef __APPLE__
-extern char **environ;
-#endif
-
-Topology::Topology(int id)
-    : agentID(id), initID(-1)
-{
-    beMap.clear();
-    weightMap.clear();
-}
-
-Topology::~Topology()
-{
-    beMap.clear();
-    weightMap.clear();
-}
-
-void Topology::setInitID()
-{
-    initID = gNotifier->allocate();
-}
-
-int Topology::getInitID()
-{
-    return initID;
-}
-
-Message * Topology::packMsg()
-{   
-    Packer packer;
-    packer.packInt(agentID);
-    packer.packInt(fanOut);
-    packer.packInt(level);
-    packer.packInt(height);
-    packer.packStr(bePath);
-    packer.packStr(agentPath);
-
-    BEMap::iterator it;
-    packer.packInt(beMap.size());    
-    for (it = beMap.begin(); it != beMap.end(); ++it) {
-        packer.packInt((*it).first);
-        packer.packStr((*it).second);
-    }
-
-    char *bufs[1];
-    int sizes[1];
-
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message(Message::CONFIG);
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::CONFIG);
-    delete [] bufs[0];
-
-    return msg;
-}
-
-Topology & Topology::unpackMsg(Message &msg) 
-{
-    int i, id, size;
-    Packer packer(msg.getContentBuf());
-
-    agentID = packer.unpackInt();
-    fanOut = packer.unpackInt();
-    level = packer.unpackInt();
-    height = packer.unpackInt();
-    bePath = packer.unpackStr();
-    agentPath = packer.unpackStr();
-
-    size = packer.unpackInt();
-    for (i = 0; i < size; i++) {
-        id = packer.unpackInt();
-        beMap[id] = packer.unpackStr();
-    }
-
-    return *this;
-}
-
-int Topology::init()
-{
-    int rc;
-    char *envp = NULL;
-    int numItem = -1;
-    char **hostlist = gCtrlBlock->getEndInfo()->fe_info.host_list;
-
-    if ((envp = ::getenv("SCI_BACKEND_NUM")) != NULL) {
-        int n = ::atoi(envp);
-        if (n > 0) {
-            numItem = n;
-        } else {
-            log_warn("Ignore invalid SCI_BACKEND_NUM value(%d)", n);
-        }
-    }
-    if (hostlist != NULL) {
-        rc = beMap.input((const char **)hostlist, numItem);
-    } else {
-        // check host file & num of be
-        char *hostfile = gCtrlBlock->getEndInfo()->fe_info.hostfile;
-        if ((envp = ::getenv("SCI_HOST_FILE")) != NULL) {
-            hostfile = envp;
-        }
-        if (hostfile == NULL) {
-            hostfile = "host.list";
-        }
-
-        rc = beMap.input(hostfile, numItem);
-    }
-    if (rc != SCI_SUCCESS) {
-        return rc;
-    }
-
-    // check fanout
-    fanOut = 32;
-    if ((envp = ::getenv("SCI_DEBUG_FANOUT")) != NULL) {
-        fanOut = ::atoi(envp);
-    }
-    
-    level = 0;
-    height = (int) ::ceil(::log((double)beMap.size()) / ::log((double)fanOut));
-
-    // check be path
-    if ((envp = ::getenv("SCI_BACKEND_PATH")) != NULL) {
-        bePath = envp;
-    } else {
-        if (gCtrlBlock->getEndInfo()->fe_info.bepath != NULL) {
-            bePath = gCtrlBlock->getEndInfo()->fe_info.bepath;
-        } else {
-            return SCI_ERR_UNKNOWN_INFO;
-        }
-    }
-
-#ifdef __64BIT__
-    const char *agentName = "scia64";
-#else
-    const char *agentName = "scia";
-#endif
-
-    envp = ::getenv("SCI_EMBED_AGENT");
-    if ((envp != NULL) && (strcasecmp(envp, "yes") == 0)) {
-        agentPath = bePath;
-    } else if ((envp = ::getenv("SCI_AGENT_PATH")) != NULL) {
-        agentPath = envp;
-        agentPath += "/";
-        agentPath += agentName;
-    } else {
-        char * tmpp = SysUtil::get_path_name(agentName);
-        if (tmpp == NULL) {
-            return SCI_ERR_AGENT_NOTFOUND;
-        }
-        agentPath = tmpp;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int Topology::deploy()
-{
-    Launcher launcher(*this);
-    nextAgentID = (agentID + 1) * fanOut - 2; // A formular to calculate the agentID of the first child
-    
-    int rc = launcher.launch();
-    if ((initID != -1) && ((gCtrlBlock->getMyRole() != CtrlBlock::BACK_AGENT))){ 
-        *(int *)gNotifier->getRetVal(initID) = rc;
-        gNotifier->notify(initID);   
-    }
-
-    return rc;
-}
-
-int Topology::addBE(Message *msg)
-{
-    assert(msg);
-
-    Packer packer(msg->getContentBuf());
-    char *host = packer.unpackStr();
-    int lev = packer.unpackInt();
-    int id = (int) msg->getGroup();
-
-    // find the first child agent with weight < fanOut
-    int aID = INVLIDSUCCESSORID;
-    map<int, int>::iterator it = weightMap.begin();
-    for (; it!=weightMap.end(); ++it) {
-        int weight = (*it).second;
-        if (!isFullTree(weight)) {
-            aID = (*it).first;
-            break;
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if ((aID == INVLIDSUCCESSORID) && ((lev <= level) || (level == height))) {
-        // if do not find
-        Launcher launcher(*this);
-        if (weightMap.size() == 0) { // if this agent does not have any child agents, launch a back end
-            rc = launcher.launchBE(id, host);
-        } else { // if this agent has child agent(s), launch an agent
-            rc = launcher.launchAgent(id, host);
-        }
-    } else {
-        if (aID == INVLIDSUCCESSORID)
-            aID = weightMap.begin()->first;
-        // otherwise delegate this command
-        routingList->addBE(SCI_GROUP_ALL, aID, id);
-        routingList->ucast(aID, msg);
-        incWeight(aID);
-    }
-
-    if (rc == SCI_SUCCESS) {
-        beMap[id] = host;
-    }
-
-    return rc;
-}
-
-int Topology::removeBE(Message *msg)
-{
-    assert(msg);
-
-    int id = (int) msg->getGroup();
-    if (!hasBE(id)) {
-        return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int aID = routingList->querySuccessorId(id);
-    assert(aID != INVLIDSUCCESSORID);
-
-    routingList->removeBE(id);
-    if (aID == VALIDBACKENDIDS) {
-        routingList->ucast(id, msg);
-        routingList->stopRouting(id);
-    } else {
-        routingList->ucast(aID, msg);
-        decWeight(aID);
-    }
-    
-    beMap.erase(id);
-    return SCI_SUCCESS;
-}
-
-int Topology::getBENum()
-{
-    return beMap.size();
-}
-
-int Topology::getLevel()
-{
-    return level;
-}
-
-bool Topology::hasBE(int beID)
-{
-    if (beMap.find(beID) != beMap.end())
-        return true;
-    else
-        return false;
-}
-
-void Topology::incWeight(int id)
-{
-    if (weightMap.find(id) == weightMap.end()) {
-        weightMap[id] = 1;
-    } else {
-        weightMap[id] = weightMap[id] + 1;
-    }
-}
-
-void Topology::decWeight(int id)
-{
-    assert(weightMap.find(id) != weightMap.end());
-
-    weightMap[id] = weightMap[id] - 1;
-    if (weightMap[id] == 0) {
-        weightMap.erase(id);
-    }
-}
-
-bool Topology::isFullTree(int beNum)
-{ 
-    if (beNum >= fanOut)
-        return true;
-
-    return false;
-}
-
-RoutingList * Topology::getRoutingList()
-{
-    return routingList;
-}
-
-void Topology::setRoutingList(RoutingList *rlist)
-{
-    routingList = rlist;
-}
-
-FilterList * Topology::getFilterList()
-{
-    return filterList;
-}
-
-void Topology::setFilterList(FilterList *flist)
-{
-    filterList = flist;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp
deleted file mode 100644
index 209449f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: BEMap, Topology, Launcher
-
- Description: Runtime topology manipulation.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _TOPOLOGY_HPP
-#define _TOPOLOGY_HPP
-
-#include <map>
-#include <string>
-
-using namespace std;
-
-#include "sci.h"
-#include "general.hpp"
-#include "stream.hpp"
-#include "envvar.hpp"
-#include "bemap.hpp"
-
-class Message;
-class Launcher;
-class RoutingList;
-class FilterList;
-
-class Topology 
-{        
-    private:
-        // primary members
-        int                  initID;
-        int                  agentID;
-        int                  fanOut;
-        int                  level;
-        int                  height;
-        string               bePath;
-        string               agentPath;
-        BEMap                beMap;
-
-        // other members
-        int                  nextAgentID;
-        RoutingList         *routingList;
-        FilterList          *filterList;
-
-        // weight factors
-        map<int, int> weightMap;
-
-    public: 
-        Topology(int id);
-        ~Topology();
-
-        Message * packMsg();
-        Topology & unpackMsg(Message &msg);
-
-        int init(); // only called by FE
-        int deploy();
-        int getInitID();
-        void setInitID();
-
-        int addBE(Message *msg);
-        int removeBE(Message *msg);
-
-        bool hasBE(int beID);
-        int getBENum();
-        int getLevel();
-        int getFanout() { return fanOut; }
-
-        void incWeight(int id);
-        void decWeight(int id);
-        RoutingList * getRoutingList();
-        void setRoutingList(RoutingList *rlist);
-        FilterList * getFilterList();
-        void setFilterList(FilterList *flist);
-
-        friend class Launcher;
-
-    private:
-        bool isFullTree(int beNum);
-};
-
-const int MAX_FD = 256;
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp
deleted file mode 100644
index 64cb835..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: WriterProcessor
-
- Description: Properties of class 'WriterProcessor':
-    input: a message queue
-    output: a stream
-    action: relay messages from the queue to the stream.
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-   01/16/12 ronglli    Add codes to detect SOCKET_BROKEN
-
-****************************************************************************/
-
-#include "writerproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "tools.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-#include "readerproc.hpp"
-
-#include "eventntf.hpp"
-#include "tools.hpp"
-
-WriterProcessor::WriterProcessor(int hndl) 
-    : Processor(hndl), peerProcessor(NULL), recoverID(-1), notifyID(-1), recoverState(false), releaseState(false)
-{
-    name = "Writer";
-
-    inQueue = NULL;
-    outStream = NULL;
-}
-
-WriterProcessor::~WriterProcessor()
-{
-    if (outStream)
-        delete outStream;
-    if (inQueue)
-        delete inQueue;
-}
-
-Message * WriterProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-
-    msg = inQueue->consume();
-
-    return msg;
-}
-
-void WriterProcessor::process(Message * msg)
-{
-    // no action
-}
-
-void WriterProcessor::write(Message * msg)
-{
-    assert(outStream);
-
-    switch (msg->getType()) {
-        case Message::RELEASE:
-            inQueue->remove();
-            if (getReleaseState()) {
-                throw (SocketException(SocketException::NET_ERR_CLOSED));
-            }
-            break;
-        default:
-            try {    
-                *outStream << *msg;
-            } catch (SocketException &e) {
-                inQueue->release();
-                throw;
-            } catch (...) {
-                inQueue->release();
-                throw;
-            }
-            inQueue->remove();
-            break;
-    }
-}
-
-void WriterProcessor::seize()
-{
-    setState(false);
-}
-
-int WriterProcessor::recover()
-{
-    if ((gCtrlBlock->getTermState()) || (!gCtrlBlock->getRecoverMode())) {
-        return -1;
-    }
-
-    outStream->stopWrite(); 
-
-    if (recoverID == -1) {
-        recoverID = gNotifier->allocate();
-    }
-    setRecoverState(true); 
-    Stream *st;
-    if (gNotifier->freeze_i(recoverID, &st) != 0) {
-        return -1;
-    }
-    log_debug("writer%d: have set the outStream to st %p, recoverID %d", handle, st, recoverID);
-    recoverID = gNotifier->allocate();
-    outStream = st;
-    setReleaseState(false);
-    setRecoverState(false);
-    log_debug("writer%d: begin to notify notifyID %d", handle, notifyID);
-    if (gNotifier->notify_i(notifyID) != 0) {
-        return -1;
-    }
-
-    return 0;
-}
-
-void WriterProcessor::clean()
-{
-    outStream->stopWrite();
-    gCtrlBlock->setFlowctlState(false);
-    if (peerProcessor) {
-        while (!peerProcessor->isLaunched()) {
-            SysUtil::sleep(WAIT_INTERVAL);
-        }  
-        peerProcessor->join(); // ReaderProcessor
-        delete peerProcessor;
-    }
-}
-
-void WriterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-void WriterProcessor::setOutStream(Stream * stream)
-{
-    if (outStream == NULL) {
-        outStream = stream;
-    } else {
-        log_debug("writer%d: begin to notify the stream %p, recoverID = %d", handle, stream, recoverID);
-        if (peerProcessor) {
-            peerProcessor->setInStream(stream);
-        }
-        while (recoverID == -1) {
-            SysUtil::sleep(WAIT_INTERVAL);
-        }
-        if (notifyID == -1) {
-            notifyID = gNotifier->allocate();
-        }
-        *(Stream **)gNotifier->getRetVal(recoverID) = stream;
-        gNotifier->notify(recoverID);
-        log_debug("writer%d: finish notify the recoverID %d", handle, recoverID);
-        log_debug("writer%d: begin to freeze the notifyID %d", handle, notifyID);
-        gNotifier->freeze(notifyID, NULL);
-        log_debug("writer%d: finish freeze the notifyID %d", handle, notifyID);
-        notifyID = gNotifier->allocate();
-    }
-}
-
-MessageQueue * WriterProcessor::getInQueue()
-{
-    return inQueue;
-}
-
-void WriterProcessor::setPeerProcessor(ReaderProcessor * processor)
-{
-    peerProcessor =  processor;
-}
-
-ReaderProcessor *WriterProcessor::getPeerProcessor()
-{
-    return peerProcessor;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp
deleted file mode 100644
index 99ffe64..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: WriterProcessor
-
- Description: Properties of class 'WriterProcessor':
-    input: a message queue
-    output: a stream
-    action: relay messages from the queue to the stream.
-   
- Author: Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _WRITERPROC_HPP
-#define _WRITERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class ReaderProcessor;
-
-class WriterProcessor : public Processor 
-{
-    private:
-        Stream              *outStream;
-        ReaderProcessor     *peerProcessor;
-        int                 recoverID;
-        int                 notifyID;
-
-        bool                recoverState;
-        bool                releaseState;
-
-    public:
-        WriterProcessor(int hndl = -1);
-        ~WriterProcessor();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual int recover();
-        virtual void clean();
-
-        void setInQueue(MessageQueue *queue);
-        MessageQueue * getInQueue();
-        void setOutStream(Stream *stream);
-        void setPeerProcessor(ReaderProcessor *processor);
-        ReaderProcessor *getPeerProcessor();
-
-        bool getRecoverState() { return recoverState; }
-        void setRecoverState(bool state) { recoverState = state; }
-        bool getReleaseState() { return releaseState; }
-        void setReleaseState(bool state) { releaseState = state; }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/ltmain.sh b/tools/sci/org.eclipse.ptp.sci/ltmain.sh
deleted file mode 100644
index a72f2fd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/ltmain.sh
+++ /dev/null
@@ -1,8406 +0,0 @@
-# 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
-#       automake:		$automake_version
-#       autoconf:		$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=2.2.6b
-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% $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"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  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
-	  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
-	      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
-	    ;;
-	  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/tools/sci/org.eclipse.ptp.sci/man/Makefile b/tools/sci/org.eclipse.ptp.sci/man/Makefile
deleted file mode 100644
index d072a0b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-# Makefile for MMSC common library
-include ../makefile.define
-#=========================== DISPLAY SETTING ===================================
-esc	=	\033[
-fore 	= 	33
-back	=	41
-
-#light:1m non-light:m
-light	=	1m
-
-#			echo "${esc}${back};${fore};${light}making all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}installing all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}cleaning all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}verycleaningall in $$i${esc}m";
-#================================================================================
-ifeq ($(OS), AIX)
-SUBDIRS =	aix
-else
-SUBDIRS =	linux
-endif
-
-all:
-	@for i in $(SUBDIRS); do\
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m all ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) all) || exit 1; \
-	done
-
-install:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m installing ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) install) || exit 1; \
-	done
-
-clean:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m cleaning ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) clean) || exit 1;\
-	done
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile b/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile
deleted file mode 100644
index ec05783..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-include ../../makefile.define
-
-install:
-	cp -p *.3 /usr/share/man/cat3/
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3
deleted file mode 100644
index c531dc1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3
+++ /dev/null
@@ -1,63 +0,0 @@
-NAME
-    SCI - General information SCI 1.0.0
-
-SCI
-    SCI (Scalable Communication Infrastructure) is an open source project 
-    under the terms of the Eclipse Public License v1.0s, its aim is to 
-    provide a common, light-weight, scalable, portable, and extensible
-    run-time and communication infrastructure for the deployment of 
-    developer tools on the emerging peta- and exa-scale high performance
-    computing systems.
-
-    For more information about EPL, see the following URL:
-        http://www.eclipse.org/legal/epl-v10.html
-
-MAN PAGE SYNTAX
-    Man pages for SCI routines are named according to C syntax, that is, 
-    they begin with the prefix "SCI_",  all in uppercase, and the first 
-    letter following the "SCI_" prefix is also uppercase. The rest of the
-    letters in the routine are all lowercase, for example, "SCI_Group_create".
-
-GETTING STARTED
-    To compile and link SCI programs:
-    % gcc -o test test.c -lsci (Linux)
-    or
-    % xlc_r -o test test.c -lsci_r (AIX)
-
-    % g++ -o test test.cxx -lsci (Linux)
-    or
-    % xlC_r -o test test.cxx -lsci_r (AIX)
-
-DOCUMENTATION
-    TBD
-
-VERSION
-    SCI version 1.0.0
-
-LICENSE
-    TBD
-
-ERRORS
-    All SCI routines return an error value.
-    
-    For more information on SCI error codes, see \fIsci.h\fP in the include 
-    directory.
-
-SEE ALSO
-    SCI_Initialize(3)
-    SCI_Terminate(3)
-    SCI_Query(3)
-    SCI_Bcast(3)
-    SCI_Upload(3)
-    SCI_Poll(3)
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
-    SCI_Group_query(3)
-    SCI_Filter_load(3)
-    SCI_Filter_unload(3)
-    SCI_Filter_bcast(3)
-    SCI_Filter_upload(3)
-    SCI_BE_add(3)
-    SCI_BE_remove(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3
deleted file mode 100644
index ef368e6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3
+++ /dev/null
@@ -1,57 +0,0 @@
-NAME
-    SCI_BE_add - Add a new back end at runtime
-
-C Syntax
-    #include <sci.h>
-    int SCI_BE_add(sci_be_t *be)
-
-INPUT PARAMETERS
-    be
-        The information of the back end to be added (INOUT).
-
-DESCRIPTION
-    This subroutine is used to add a new back end at runtime, once added,
-    the id of the new back end id will be added to the predefined group
-    SCI_GROUP_ALL.
-
-    In sci_be_t:
-
-        typedef struct {
-                int              id;
-                char             *hostname;
-        } sci_be_t;
-
-    id indicates the id of the new back end, it can be -1 (means its id 
-    will be assigned by SCI) or a postive value, hostname specified the 
-    host to launch this new back end.
-
-    Together with SCI_BE_remove, these two functions can be used to 
-    add/remove back ends dynamically at runtime.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                sci_be_t be;
-                be.id = -1;
-                be.hostname = "c890f1ec01.ppd.pok.ibm.com";
-                ...
-                SCI_BE_add(&be);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_EXISTED
-        The back id already existed
-    SCI_ERR_LAUNCH_FAILED
-        Unable to launch the back end
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_BE_remove(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3
deleted file mode 100644
index 74f857e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3
+++ /dev/null
@@ -1,41 +0,0 @@
-NAME
-    SCI_BE_remove - Remove an existed back end at runtime
-
-C Syntax
-    #include <sci.h>
-    int SCI_BE_remove(int be_id)
-
-INPUT PARAMETERS
-    be_id
-        The id of the back end to be removed (IN).
-
-DESCRIPTION
-    This subroutine is used to remove an existed back end at runtime, once
-    removed, this back end id will be removed from all existed groups.
-
-    Together with SCI_BE_add, these two functions can be used to add/remove
-    back ends dynamically at runtime.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int be_id = 0;
-                ...
-                SCI_BE_remove(be_id);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end specified by id does not exist
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_BE_add(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3
deleted file mode 100644
index b28f949..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3
+++ /dev/null
@@ -1,60 +0,0 @@
-NAME
-    SCI_Bcast - Broadcasts messages from the front end to some back ends
-
-C Syntax
-    #include <sci.h>
-    int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The id of the message filter (IN).
-    group
-        The group which the message belongs to (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to broadcast messages from the front end to all 
-    or part of back ends. The receivers can be determined by group if set
-    filter_id to SCI_FILTER_NULL, which means do not use message filter,
-    and a predefined group named SCI_GROUP_ALL means all back ends, or can 
-    be determined by filter_id if a new message filter is loaded by 
-    SCI_Filter_load.
-
-    This is a non-blocking call. The caller cannot assume that message transfer
-    has completed upon the return of the function. Instead, the handler function
-    defined in sci_info_t should be used to ensure the message arrival in the 
-    destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        Undefined group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Upload(3)
-    SCI_Poll(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3
deleted file mode 100644
index 5cb9d13..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3
+++ /dev/null
@@ -1,70 +0,0 @@
-NAME
-    SCI_Filter_bcast - Used in a message filter to broadcasts messages to some successors
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_bcast(int filter_id, int num_successors, int *successor_list, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The filter id of the messages to be broadcasted (IN).
-    num_successors
-        Number of successors (IN).
-    successor_list
-        The successor id list (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to broadcast messages to all or part of successors 
-    in a message filter. A successor id can be an agent id or a back end id, 
-    because a SCI execution environment is organized in a tree style, successor
-    means children.
-
-    The agent id can be queried by SCI_Query using query type AGENT_ID, and the
-    successor id list can be queried using query type NUM_SUCCESSORS and
-    SUCCESSOR_IDLIST.
-
-    The filter_id can be set to SCI_FILTER_NULL, means the downward messages will
-    use the current filter id, otherwise the new filter id will be used.
-
-    This is a non-blocking call. The caller cannot assume that message transfer
-    has completed upon the return of the function. Instead, the handler function
-    defined in sci_info_t should be used to ensure the message arrival in the 
-    destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int num_successors, *successor_list, sizes[1];
-                void *bufs[1];
-                ...
-                SCI_Query(NUM_SUCCESSORS, &num_successors);
-                successor_list = (int *)malloc(sizeof(int)*num_successors);
-                SCI_Query(SUCCESSOR_IDLIST, successor_list);
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_list, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the filter
-    SCI_ERR_INVALID_SUCCESSOR
-        The successor id list contains non-existed successor id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_upload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3
deleted file mode 100644
index 641c264..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3
+++ /dev/null
@@ -1,94 +0,0 @@
-NAME
-    SCI_Filter_load - Load a new message filter
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_load(sci_filter_info_t *filter_info)
-
-INPUT PARAMETERS
-    filter_info
-        The information of the filter to be loaded (IN).
-
-DESCRIPTION
-    This subroutine is used to load a new message with id specifed by filter_id,
-    if success, the initialization handler defined in the filter will be called.
-
-    In sci_filter_info_t:
-
-        typedef struct {
-                int              filter_id;
-                char             *so_file;
-        } sci_filter_info_t;
-
-    filter_id indicates the id of the new filter, and filter_id can be any positive
-    integers. so_file indicates the absolute path of the filter library.
-
-    In SCI, a message filter is specified by a shared library, in this shared 
-    library, at least the following three functions (name fixed) should be defined:
-    
-        // initialization handler
-        int filter_initialize(void **user_param);
-        // termination handler
-        int filter_terminate(void *user_param);
-        // message handler
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-        
-    The user-defined function filter_input will be called each time when a new
-    message is arrived. The filter_id can be used for SCI_Bcast, SCI_Upload or
-    SCI_Filter_upload once the filter has been loaded successfully.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        int filter_initialize(void **user_param)
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_terminate(void *user_param) 
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-        {
-                void *bufs[1];
-                int sizes[1];
-                int rc;
-        
-                bufs[0] = buf;
-                sizes[0] = size;
-    
-                rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-                if (rc != SCI_SUCCESS) {
-                        ...
-                } 
-    
-                return SCI_SUCCESS;
-        }
-
-        {
-                sci_filter_info_t filter_info;
-                filter_info.filter_id = 1;
-                filter_info.so_file = "/usr/lib/myfilter.so";
-                SCI_Filter_load(&filter_info);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_FILTER_PREDEFINED
-        Can't load predefined filter SCI_FILTER_NULL
-    SCI_ERR_FILTER_ID
-        Can't set negative filter_id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_unload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3
deleted file mode 100644
index 8bd47db..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3
+++ /dev/null
@@ -1,43 +0,0 @@
-NAME
-    SCI_Filter_unload - Unload a previously loaded filter
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_unload(int filter_id)
-
-INPUT PARAMETERS
-    filter_id
-        The id of the filter to be unloaded (IN).
-
-DESCRIPTION
-    This subroutine is used to unload a previously loaded filter specifed by
-    filter_id, if success, the termination handler defined in the filter will
-    be called.
-
-    Usually cleanup works can be performed in the termination handler.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int filter_id = 1;
-                ...
-                SCI_Filter_unload(filter_id);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_FILTER_PREDEFINED
-        Can't unload predefined filter SCI_FILTER_NULL
-    SCI_ERR_FILTER_ID
-        Unknown filter id or the filter is not loaded previously
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_load(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3
deleted file mode 100644
index 59c5367..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3
+++ /dev/null
@@ -1,53 +0,0 @@
-NAME
-    SCI_Filter_upload - Used in a message filter to uploads messages to another message filter or the parent
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The message filter id, set to SCI_FILTER_NULL means send to the parent directly (IN).
-    group
-        The group information of current message segment (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to upload messages to another message filter or the parent. 
-    Set filter_id to SCI_FILTER_NULL means send the message to the parent directly, 
-    otherwise message filters can be used in a cascaded style.
-
-    This is a non-blocking call. The caller cannot assume that message transfer has 
-    completed upon the return of the function. Instead, the handler function defined in
-    sci_info_t should be used to ensure the message arrival in the destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-    
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the filter
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_bcast(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3
deleted file mode 100644
index 6bb98a9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3
+++ /dev/null
@@ -1,64 +0,0 @@
-NAME
-    SCI_Group_create - Create a new group from a back end list
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_create(int num_bes, int *be_list, sci_group_t *group)
-
-INPUT PARAMETERS
-    num_bes
-        Number of back ends in the new group (IN).
-    be_list
-        The back end id list of the new group (IN).
-    group
-        The output group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from a back end list, the list
-    contains existed back end ids. The new group can be used for SCI_Bcast to 
-    specify destination receivers.
-
-    This is a blocking call. The caller can assume group is ready to use upon the
-    return of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes;
-                    sci_group_t odd_group, even_group;
-                    int odd_size, even_size;
-                    ...
-                    SCI_Query(NUM_BACKENDS, &num_bes);
-
-                    odd_size = (num_bes - num_bes%2) / 2;
-                    odd_list = (int *)malloc(sizeof(int) * odd_size);
-                    for (i=0; i<odd_size; i++) {
-                        odd_list[i] = i*2 + 1;
-                    }
-                    SCI_Group_create(odd_size, odd_list, &odd_group);
-
-                    even_size = (num_bes + num_bes%2) / 2;
-                    even_list = (int *)malloc(sizeof(int) * even_size);
-                    for (i=0; i<even_size; i++) {
-                        even_list[i] = i*2;
-                    }
-                    SCI_Group_create(even_size, even_list, &even_group);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end id list contains non-existed back end id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3
deleted file mode 100644
index 0cd75f9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3
+++ /dev/null
@@ -1,46 +0,0 @@
-NAME
-    SCI_Group_free - Free an existed group
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_free(sci_group_t group)
-
-INPUT PARAMETERS
-    group
-        The group to be freed (IN).
-
-DESCRIPTION
-    This subroutine is used to free an existed group which was previously created by
-    SCI_Group_create, SCI_Group_operate or SCI_Group_operate_ext.
-
-    This is a blocking call. The caller can assume group can't be used again upon the
-    return of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    sci_group_t odd_group, even_group;
-                    ...
-                    SCI_Group_free(odd_group);
-                    SCI_Group_free(even_group);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_PREDEFINED
-        Can't free predefined group SCI_GROUP_ALL
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3
deleted file mode 100644
index bd2f203..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3
+++ /dev/null
@@ -1,55 +0,0 @@
-NAME
-    SCI_Group_operate - Create a new group from two existed groups
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_operate(sci_group_t group1, sci_group_t group2, sci_op_t op, sci_group_t *newgroup)
-
-INPUT PARAMETERS
-    group1
-        Existed group 1 (IN).
-    group2
-        Existed group 2 (IN).
-    op
-        Indicates how to create the new group from two existed groups (IN).
-    newgroup
-        The output new group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from two existed groups, group1 and group2
-    can be SCI_GROUP_ALL, and op can be SCI_UNION, SCI_INTERSECTION and SCI_DIFFERENCE. The 
-    new newgroup can be used for SCI_Bcast to specify destination receivers.
-
-    This is a blocking call. The caller can assume newgroup is ready to use upon the return
-    of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes;
-                    sci_group_t group1, group2, newgroup;
-                    ...
-                    SCI_Group_operate(group1, group2, SCI_UNION, &newgroup);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_INVALID_OPERATOR
-        Incorrect op specified
-    SCI_ERR_GROUP_EMPTY
-        The new group is an empty group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3
deleted file mode 100644
index f29d587..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3
+++ /dev/null
@@ -1,64 +0,0 @@
-NAME
-    SCI_Group_operate_ext - Create a new group from an existed group and a back end list
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_operate(sci_group_t group, int num_bes, int *be_list, sci_op_t op, sci_group_t *newgroup)
-
-INPUT PARAMETERS
-    group
-        An existed group (IN).
-    num_bes
-        Number of back ends in another group (IN).
-    be_list
-        The back end id list of another group (IN).
-    op
-        Indicates how to create the new group (IN).
-    newgroup
-        The output new group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from an existed group and a back end list, 
-    group can be SCI_GROUP_ALL, and op can be SCI_UNION, SCI_INTERSECTION and SCI_DIFFERENCE.
-    The new newgroup can be used for SCI_Bcast to specify destination receivers.
-
-    This is a blocking call. The caller can assume newgroup is ready to use upon the return
-    of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes, *be_list;
-                    sci_group_t group, newgroup;
-                    ...
-                    num_bes = 3;
-                    be_list = (int *)malloc(sizeof(int)*num_bes);
-                    for (i=0; i<num_bes; i++) {
-                            be_list[i] = i;
-                    }
-                    SCI_Group_operate_ext(group, num_bes, be_list, SCI_UNION, &newgroup);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end id list contains non-existed back end id
-    SCI_ERR_INVALID_OPERATOR
-        Incorrect op specified
-    SCI_ERR_GROUP_EMPTY
-        The new group is an empty group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3
deleted file mode 100644
index efc072c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3
+++ /dev/null
@@ -1,60 +0,0 @@
-NAME
-    SCI_Group_query - Queries runtime information of an existed group
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val)
-
-INPUT PARAMETERS
-    group
-        The group to be queried (IN).
-    query
-        Specifies the type of query you want to request (IN).
-    ret_val
-        Specifies the reference parameter for SCI to store as the result of the query. 
-        The value of this parameter cannot be NULL (OUT).
-
-DESCRIPTION
-    This subroutine is used to query runtime statistics of an existed group. SCI defines
-    a set of query types as an enumeration in sci.h.
-
-    For example, you can query the number of back ends in a group using the query value 
-    of GROUP_MEMBER_NUM: SCI_Group_query(group, GROUP_MEMBER_NUM, &ret_val);
-
-    In SCI, sci_group_query_t defines the following valid query types:
-
-    GROUP_MEMBER_NUM
-        Query the number of back ends in the group
-    GROUP_MEMBER
-        Query the back end id list in the group
-    GROUP_SUCCESSOR_NUM
-        Query the number of successors in the group
-    GROUP_SUCCESSOR
-        Query the successor id list in the group
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int be_num, *be_list;
-                sci_group_t group;
-                ...
-                SCI_Group_query(group, GROUP_MEMBER_NUM, &be_num);
-                be_list = (int *)malloc(sizeof(int)*be_num);
-                SCI_Group_query(group, GROUP_MEMBER, be_list);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_UNKNOWN_INFO
-        Can't set NULL to ret_val
-    SCI_ERR_INVALID_CALLER
-        Can't be called from back end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-
-SEE ALSO
-    SCI_Query(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3
deleted file mode 100644
index 615e860..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3
+++ /dev/null
@@ -1,147 +0,0 @@
-NAME
-    SCI_Initialize - Initializes the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Initialize(sci_info_t *info)
-
-INPUT PARAMETERS
-    info
-        Pointer to the SCI startup information (IN).
-
-DESCRIPTION
-    This routine must be called before any other SCI routines are called. SCI
-    can be initialized more than once; subsequent calls to SCI_Initialize are
-    erroneous unless SCI_Terminate be called.
-
-    All SCI programs must contain a call to SCI_Initialize. SCI_Initialize 
-    accepts info as its argument:
-
-        typedef union {
-                sci_end_type_t   type;
-                sci_fe_info_t    fe_info;
-                sci_be_info_t    be_info;
-        } sci_info_t;
-
-    type can be SCI_FRONT_END or SCI_BACK_END.
-
-    In sci_fe_info_t:
-
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             *hostfile;
-                char             *bepath;
-                char             **beenvp;
-                char             reserve[64];
-        } sci_fe_info_t;
-
-    mode indicates the working mode of the front end, can be interrupt mode
-    (SCI_INTERRUPT) or polling mode (SCI_POLLING), hndlr specified the message 
-    handler and it can't be NULL, param specifies user-defined parameter in the 
-    message handler, err_hndlr specifies the error handler when errors occur and
-    it can be NULL, hostfile specifies the host list to initialize back ends, 
-    bepath specifies the command to run a back end, beenvp specifies any additional
-    environment variables user wants to pass to back ends and it should be ended 
-    with a NULL sign.
-
-    In sci_be_info_t:
-
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             reserve[64];
-        } sci_be_info_t;
-
-    mode indicates the working mode of the front end, can be interrupt mode
-    (SCI_INTERRUPT) or polling mode (SCI_POLLING), hndlr specified the message 
-    handler and it can't be NULL, param specifies user-defined parameter in the 
-    message handler, err_hndlr specifies the error handler when errors occur and 
-    it can be NULL.
-
-    Each program can be started as a front end or a back end, and can work in 
-    polling mode or interrupt mode, furthermore, besides sci_info_t, the following
-    environment variables begin with the prefix "SCI_" can be used to tune SCI 
-    programs (if a data field in sci_info_t indicates the same attribute as an 
-    environment variable, it will be overwritten):
-
-    SCI_HOST_FILE
-        host file, same as fe_info.hostfile in sci_info_t
-    SCI_BACKEND_NUM
-        number of back ends when startup
-    SCI_DEBUG_FANOUT
-        fanout of the SCI tree structure, the default value is 32
-    SCI_BACKEND_PATH
-        command to start a back end, same as fe_info.bepath in sci_info_t, can 
-        contain arguments, e.g., "/usr/bin/pdb_be 2"
-    SCI_USE_EXTLAUNCHER
-        set to "yes" to indicate all back ends are started by an external launcher, 
-        the default value is "no"
-    SCI_ENABLE_FAILOVER
-        set to "yes" to indicate SCI will try to recover connections when facing 
-        connection problems, the default value is "no"
-    SCI_REMOTE_SHELL
-        can be "rsh", "ssh" or "", indicates how underlying SCI processes (agents, 
-        back ends) will be started, "rsh" means using rshell, "ssh" means using ssh, 
-        "" means using sci daemon, it's the default value
-    SCI_DEVICE_NAME
-        can be "" or an ifconfig interface name, e.g., "ib0", if set to "", the 
-        connection path indicated by the first interface will be used, otherwise the 
-        specified connection path will be used, the default value is the first ifconfig 
-        device name
-    SCI_SEGMENT_SIZE
-        message segment size used in SCI pipeline mechanism, when the size of downstream
-        messages exceed a threshold (1.5 * size), this mechanism will be enabled
-        automatically by splitting the large message into smaller segments to 
-        increase the overall bandwidth, the default size is 46720 (bytes)
-    SCI_SYNC_INIT
-        if set to yes, the SCI_Initilize will block until all the backends are launched, 
-        otherwise it will return immediately. The default value is no.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        void handler(void *user_param, sci_group_t group, void *buffer, int size)
-        {
-                ...
-        }
-        
-        {
-                sci_info_t info;
-                info.type = SCI_FRONT_END;
-                info.fe_info.mode = SCI_INTERRUPT;
-                info.fe_info.hostfile = "./host.list";
-                info.fe_info.bepath = "/usr/bin/pdb_be";
-                info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-                info.fe_info.param = NULL;
-                SCI_Initialize(&info);
-                ... 
-                SCI_Terminate();
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_INVALID_ENDTYPE
-        Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END
-    SCI_ERR_NO_MEM
-        Out of memory
-    SCI_ERR_INVALID_JOBKEY
-        Invalid job key specified by SCI_JOB_KEY (only for BE)
-    SCI_ERR_INVALID_HOSTFILE
-        Invalid host file (only for FE)
-    SCI_ERR_UNKNOWN_INFO
-        Unknown back end info (only for FE)
-    SCI_ERR_LAUNCH_FAILED
-        Failed to launch client(s) (only for FE)
-    SCI_ERR_INITIALIZE_FAILED
-        Initialization failed
-
-SEE ALSO
-    SCI_Terminate(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3
deleted file mode 100644
index b50526c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3
+++ /dev/null
@@ -1,57 +0,0 @@
-NAME
-    SCI_Poll - Check for arriving messages in polling mode
-
-C Syntax
-    #include <sci.h>
-    int SCI_Poll(int timeout)
-
-INPUT PARAMETERS
-    timeout
-        Timeout if no message arrives in timeout milliseconds, <0 means no timeout (IN).
-
-DESCRIPTION
-    This subroutine is used to check for arriving messages in polling mode. If a new
-    message is arrived, user-registered handler in sci_info_t will be called to handle 
-    the message, otherwise a timeout will occur after timeout milliseconds elapsed.
-
-    If timeout is set to a negative value, no timeout will occur, and SCI_Poll can only
-    return when a new message arrived or errors occurred.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int pollFd, extFd, maxFd;
-                fd_set fdSet;
-                SCI_Query(POLLING_FD, &pollFd);
-                ...
-                FD_ZERO(&fdSet);
-                FD_SET(pollFd, &fdSet);
-                FD_SET(extFd, &fdSet);
-                maxFd = (pollFd > extFd) ? pollFd : extFd;
-                select(maxFd+1, &fdSet, 0, 0, NULL);
-                if (FD_ISSET(pollFd, &fdSet)) {
-                        SCI_Poll(-1);
-                }
-                if (FD_ISSET(extFd, &fdSet)) {
-                        ...
-                }
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_MODE
-        Can only be used in polling mode
-    SCI_ERR_POLL_INVALID
-        Invalid polling calls
-    SCI_ERR_POLL_TIMEOUT
-        A polling timeout occurs after timeout milliseconds elapsed
-
-SEE ALSO
-    SCI_Bcast(3)
-    SCI_Upload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3
deleted file mode 100644
index 52159ef..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3
+++ /dev/null
@@ -1,70 +0,0 @@
-NAME
-    SCI_Query - Queries runtime information of the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Query(sci_query_t query, void *ret_val)
-
-INPUT PARAMETERS
-    query
-        Specifies the type of query you want to request (IN).
-    ret_val
-        Specifies the reference parameter for SCI to store as the result of the 
-        query. The value of this parameter cannot be NULL (OUT).
-
-DESCRIPTION
-    This subroutine is used to query runtime settings and statistics from SCI.
-    SCI defines a set of query types as an enumeration in sci.h.
-
-    For example, you can query the backend id using the query value of BACKEND_ID: 
-    SCI_Query(BACKEND_ID, &ret_val);
-
-    In SCI, sci_query_t defines the following valid query types:
-
-    JOB_KEY
-        Query the job key of the current job
-    NUM_BACKENDS
-        Query the number of back ends in the job
-    BACKEND_ID
-        Query the back end id of current back end in the job
-    POLLING_FD
-        Query the external polling file descriptor in polling mode of the current job
-    NUM_FILTERS
-        Query the number of loaded filters in the current job
-    FILTER_IDLIST
-        Query the loaded filter id list of the current job
-    AGENT_ID
-        Query the agent id of current agent in the job
-    NUM_SUCCESSORS
-        Query the number of successors of current entity in the job
-    SUCCESSOR_IDLIST
-        Query the successor id list of current entity in the job
-    HEALTH_STATUS
-        Query the running status of current entity in the job, can be 0 (normal) or
-        1 (exited)
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int my_id;
-                SCI_Query(BACKEND_ID, &my_id);
-                int be_num;
-                SCI_Query(NUM_BACKENDS, &be_num);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_UNKNOWN_INFO
-        Can't set NULL to ret_val
-    SCI_ERR_INVALID_CALLER
-        Invalid query type for current entity. e.g., BACKEND_NUM can only be used
-        for back end
-    SCI_ERR_MODE
-        For POLLING_FD only, can only be used in polling mode
-
-SEE ALSO
-    SCI_Group_query(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3
deleted file mode 100644
index 3524d49..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3
+++ /dev/null
@@ -1,40 +0,0 @@
-NAME
-    SCI_Terminate - Terminates the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Terminate()
-
-INPUT PARAMETERS
-    none
-
-DESCRIPTION
-    Make sure this routine is the last SCI call. Any SCI calls made after
-    SCI_Terminate raise an error. You must be sure that all pending communications
-    have completed before calls SCI_Terminate.
-
-    Although SCI_Terminate terminates SCI processing, it does not terminate the
-    front end or back end. It is possible to continue with non-SCI processing
-    after calling SCI_Terminate, but no other SCI calls can be made unless
-    SCI_Initialize be called again.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                /* declare variables */
-                SCI_Initialize(&info);
-                ...
-                SCI_Terminate();
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Initialize(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3
deleted file mode 100644
index 0a53018..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3
+++ /dev/null
@@ -1,55 +0,0 @@
-NAME
-    SCI_Upload - Uploads messages from a back end to the front end
-
-C Syntax
-    #include <sci.h>
-    int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The id of the message filter (IN).
-    group
-        The group which the message belongs to (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to upload message from a back end to the front end. The
-    message can be sent directly to the front end if set filter_id to SCI_FILTER_NULL,
-    or can be sent to the filter indicated by filter_id if a new message filter is loaded 
-    by SCI_Filter_load.
-
-    This is a non-blocking call. The caller cannot assume that message transfer has 
-    completed upon the return of the function. Instead, the handler function defined in 
-    sci_info_t should be used to ensure the message arrival in the destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Bcast(3)
-    SCI_Poll(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile b/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile
deleted file mode 100644
index ec05783..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-include ../../makefile.define
-
-install:
-	cp -p *.3 /usr/share/man/cat3/
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3
deleted file mode 100644
index 90dc2f9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3
+++ /dev/null
@@ -1,80 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI\fP \- General information SCI 1.0.0
-
-.SH SCI
-.ft R
-SCI (Scalable Communication Infrastructure) is an open source project under
-under the terms of the Eclipse Public License v1.0s, its aim is to provide
-a common, light-weight, scalable, portable, and extensible run-time and
-communication infrastructure for the deployment of developer tools on the
-emerging peta- and exa-scale high performance computing systems.
-.sp
-For more information about EPL, see the following URL:
-.sp
-    http://www.eclipse.org/legal/epl-v10.html
-
-.SH MAN PAGE SYNTAX
-.ft R
-Man pages for SCI routines are named according to C syntax, that is, they 
-begin with the prefix "SCI_",  all in uppercase, and the first letter following
-the "SCI_" prefix is also uppercase. The rest of the letters in the routine are
-all lowercase, for example, "SCI_Group_create".
-
-.SH GETTING STARTED
-.ft R
-To compile and link SCI programs:
-.sp
-% gcc -o test test.c -lsci (Linux)
-.nf
-    or
-.nf
-% xlc_r -o test test.c -lsci_r (AIX)
-.sp
-% g++ -o test test.cxx -lsci (Linux)
-.nf
-    or
-.nf
-% xlC_r -o test test.cxx -lsci_r (AIX)
-
-.SH DOCUMENTATION
-.ft R
-TBD
-
-.SH VERSION
-.ft R
-SCI version 1.0.0
-
-.SH LICENSE
-.ft R
-TBD
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-For more information on SCI error codes, see \fIsci.h\fP in the include 
-directory.
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Initialize\fP(3)
-\fBSCI_Terminate\fP(3)
-\fBSCI_Query\fP(3)
-\fBSCI_Bcast\fP(3)
-\fBSCI_Upload\fP(3)
-\fBSCI_Poll\fP(3)
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
-\fBSCI_Group_query\fP(3)
-\fBSCI_Filter_load\fP(3)
-\fBSCI_Filter_unload\fP(3)
-\fBSCI_Filter_bcast\fP(3)
-\fBSCI_Filter_upload\fP(3)
-\fBSCI_BE_add\fP(3)
-\fBSCI_BE_remove\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3
deleted file mode 100644
index 362b4fb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3
+++ /dev/null
@@ -1,80 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_BE_add 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_BE_add\fP \- Add a new back end at runtime
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_BE_add(sci_be_t *\fIbe\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-be
-The information of the back end to be added (INOUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to add a new back end at runtime, once added,
-the id of the new back end id will be added to the predefined group
-\fBSCI_GROUP_ALL\fP.
-.sp
-In \fIsci_be_t\fP:
-.sp
-.nf
-        typedef struct {
-                int              id;
-                char             *hostname;
-        } sci_be_t;
-.fi
-.sp
-\fIid\fP indicates the id of the new back end, it can be -1 (means its id will be
-assigned by SCI) or a postive value, \fIhostname\fP specified the host to launch
-this new back end.
-.sp
-Together with \fBSCI_BE_remove\fP, these two functions can be used to add/remove
-back ends dynamically at runtime.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                sci_be_t be;
-                be.id = -1;
-                be.hostname = "c890f1ec01.ppd.pok.ibm.com";
-                ...
-                SCI_BE_add(&be);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_EXISTED
-The back id already existed
-.TP 1i
-SCI_ERR_LAUNCH_FAILED
-Unable to launch the back end
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_BE_remove\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3
deleted file mode 100644
index c722879..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3
+++ /dev/null
@@ -1,61 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_BE_remove 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_BE_remove\fP \- Remove an existed back end at runtime
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_BE_remove(int \fIbe_id\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-be_id
-The id of the back end to be removed (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to remove an existed back end at runtime, once removed,
-this back end id will be removed from all existed groups.
-.sp
-Together with \fBSCI_BE_add\fP, these two functions can be used to add/remove
-back ends dynamically at runtime.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int be_id = 0;
-                ...
-                SCI_BE_remove(be_id);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end specified by \fIid\fP does not exist
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_BE_add\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3
deleted file mode 100644
index 80ed073..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3
+++ /dev/null
@@ -1,82 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Bcast 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Bcast\fP \- Broadcasts messages from the front end to some back ends
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Bcast(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the message filter (IN).
-.TP 1i
-group
-The group which the message belongs to (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to broadcast messages from the front end to all or part of back
-ends. The receivers can be determined by \fIgroup\fP if set \fIfilter_id\fP to
-\fBSCI_FILTER_NULL\fP, which means do not use message filter, and a predefined
-group named \fBSCI_GROUP_ALL\fP means all back ends, or can be determined
-by \fIfilter_id\fP if a new message filter is loaded by \fBSCI_Filter_load\fP.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-Undefined \fIgroup\fP
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Upload\fP(3)
-\fBSCI_Poll\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3
deleted file mode 100644
index e0312cd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3
+++ /dev/null
@@ -1,93 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_bcast 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_bcast\fP \- Used in a message filter to broadcasts messages to some successors
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_bcast(int \fIfilter_id\fP, int \fInum_successors\fP, int *\fIsuccessor_list\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The filter id of the messages to be broadcasted (IN).
-.TP 1i
-num_successors
-Number of successors (IN).
-.TP 1i
-successor_list
-The successor id list (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to broadcast messages to all or part of successors in a message
-filter. A \fBsuccessor\fP id can be an agent id or a back end id, because a SCI execution
-environment is organized in a tree style, \fBsuccessor\fP means children.
-.sp
-The agent id can be queried by \fBSCI_Query\fP using query type \fBAGENT_ID\fP, and
-the successor id list can be queried using query type \fBNUM_SUCCESSORS\fP and
-\fBSUCCESSOR_IDLIST\fP.
-.sp
-The \fIfilter_id\fP can be set to SCI_FILTER_NULL, means the downward messages will use
-the current filter id, otherwise the new filter id will be used.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int num_successors, *successor_list, sizes[1];
-                void *bufs[1];
-                ...
-                SCI_Query(NUM_SUCCESSORS, &num_successors);
-                successor_list = (int *)malloc(sizeof(int)*num_successors);
-                SCI_Query(SUCCESSOR_IDLIST, successor_list);
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_list, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the filter
-.TP 1i
-SCI_ERR_INVALID_SUCCESSOR
-The successor id list contains non-existed successor id
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_upload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3
deleted file mode 100644
index 8ca5e8d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3
+++ /dev/null
@@ -1,119 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_load 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_load\fP \- Load a new message filter
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_load(sci_filter_info_t *\fIfilter_info\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_info
-The information of the filter to be loaded (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to load a new message with id specifed by \fIfilter_id\fP,
-if success, the initialization handler defined in the filter will be called.
-.sp
-In \fIsci_filter_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                int              filter_id;
-                char             *so_file;
-        } sci_filter_info_t;
-.fi
-.sp
-\fIfilter_id\fP indicates the id of the new filter, and \fIfilter_id\fP can be any positive
-integers. \fIso_file\fP indicates the absolute path of the filter library.
-.sp
-In SCI, a message filter is specified by a shared library, in this shared library,
-at least the following three functions (name fixed) should be defined:
-.sp
-.nf
-        // initialization handler
-        int filter_initialize(void **user_param);
-        // termination handler
-        int filter_terminate(void *user_param);
-        // message handler
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-.fi
-.sp
-The user-defined function \fBfilter_input\fP will be called each time when a new
-message is arrived. The \fIfilter_id\fP can be used for \fBSCI_Bcast\fP, \fBSCI_Upload\fP
-or \fBSCI_Filter_upload\fP once the filter has been loaded successfully.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        int filter_initialize(void **user_param)
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_terminate(void *user_param) 
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-        {
-                void *bufs[1];
-                int sizes[1];
-                int rc;
-        
-                bufs[0] = buf;
-                sizes[0] = size;
-    
-                rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-                if (rc != SCI_SUCCESS) {
-                        ...
-                } 
-    
-                return SCI_SUCCESS;
-        }
-
-        {
-                sci_filter_info_t filter_info;
-                filter_info.filter_id = 1;
-                filter_info.so_file = "/usr/lib/myfilter.so";
-                SCI_Filter_load(&filter_info);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_FILTER_PREDEFINED
-Can't load predefined filter SCI_FILTER_NULL
-.TP 1i
-SCI_ERR_FILTER_ID
-Can't set negative \fIfilter_id\fP
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_unload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3
deleted file mode 100644
index 92a3198..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3
+++ /dev/null
@@ -1,63 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_unload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_unload\fP \- Unload a previously loaded filter
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_unload(int \fIfilter_id\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the filter to be unloaded (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to unload a previously loaded filter specifed by \fIfilter_id\fP,
-if success, the termination handler defined in the filter will be called.
-.sp
-Usually cleanup works can be performed in the termination handler.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int filter_id = 1;
-                ...
-                SCI_Filter_unload(filter_id);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_FILTER_PREDEFINED
-Can't unload predefined filter SCI_FILTER_NULL
-.TP 1i
-SCI_ERR_FILTER_ID
-Unknown filter id or the filter is not loaded previously
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_load\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3
deleted file mode 100644
index fab2e9a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3
+++ /dev/null
@@ -1,76 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_upload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_upload\fP \- Used in a message filter to uploads messages to another message filter or the parent
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_upload(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The message filter id, set to \fBSCI_FILTER_NULL\fP means send to the parent directly (IN).
-.TP 1i
-group
-The group information of current message segment (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to upload messages to another message filter or the parent. 
-Set \fIfilter_id\fP to \fBSCI_FILTER_NULL\fP means send the message to the parent
-directly, otherwise message filters can be used in a cascaded style.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the filter
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_bcast\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3
deleted file mode 100644
index b7732d5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3
+++ /dev/null
@@ -1,86 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_create 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_create\fP \- Create a new group from a back end list
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_create(int \fInum_bes\fP, int *\fIbe_list\fP, sci_group_t *\fIgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-num_bes
-Number of back ends in the new group (IN).
-.TP 1i
-be_list
-The back end id list of the new group (IN).
-.TP 1i
-group
-The output group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from a back end list, the list contains
-existed back end ids. The new \fIgroup\fP can be used for \fBSCI_Bcast\fP to specify
-destination receivers.
-.sp
-This is a blocking call. The caller can assume \fIgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes;
-                    sci_group_t odd_group, even_group;
-                    int odd_size, even_size;
-                    ...
-                    SCI_Query(NUM_BACKENDS, &num_bes);
-
-                    odd_size = (num_bes - num_bes%2) / 2;
-                    odd_list = (int *)malloc(sizeof(int) * odd_size);
-                    for (i=0; i<odd_size; i++) {
-                        odd_list[i] = i*2 + 1;
-                    }
-                    SCI_Group_create(odd_size, odd_list, &odd_group);
-
-                    even_size = (num_bes + num_bes%2) / 2;
-                    even_list = (int *)malloc(sizeof(int) * even_size);
-                    for (i=0; i<even_size; i++) {
-                        even_list[i] = i*2;
-                    }
-                    SCI_Group_create(even_size, even_list, &even_group);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end id list contains non-existed back end id
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3
deleted file mode 100644
index d872798..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3
+++ /dev/null
@@ -1,67 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_free 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_free\fP \- Free an existed group
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_free(sci_group_t \fIgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-The group to be freed (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to free an existed group which was previously created by \fBSCI_Group_create\fP,
-\fBSCI_Group_operate\fP or \fBSCI_Group_operate_ext\fP.
-.sp
-This is a blocking call. The caller can assume \fIgroup\fP can't be used again upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    sci_group_t odd_group, even_group;
-                    ...
-                    SCI_Group_free(odd_group);
-                    SCI_Group_free(even_group);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_PREDEFINED
-Can't free predefined group \fBSCI_GROUP_ALL\fP
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3
deleted file mode 100644
index f810273..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3
+++ /dev/null
@@ -1,81 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_operate 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_operate\fP \- Create a new group from two existed groups
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_operate(sci_group_t \fIgroup1\fP, sci_group_t \fIgroup2\fP, sci_op_t \fIop\fP, sci_group_t *\fInewgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group1
-Existed group 1 (IN).
-.TP 1i
-group2
-Existed group 2 (IN).
-.TP 1i
-op
-Indicates how to create the new group from two existed groups (IN).
-.TP 1i
-newgroup
-The output new group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from two existed groups, \fIgroup1\fP and
-\fIgroup2\fP can be \fBSCI_GROUP_ALL\fP, and \fIop\fP can be \fBSCI_UNION\fP, 
-\fBSCI_INTERSECTION\fP and \fBSCI_DIFFERENCE\fP. The new \fInewgroup\fP can be 
-used for \fBSCI_Bcast\fP to specify destination receivers.
-.sp
-This is a blocking call. The caller can assume \fInewgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes;
-                    sci_group_t group1, group2, newgroup;
-                    ...
-                    SCI_Group_operate(group1, group2, SCI_UNION, &newgroup);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_INVALID_OPERATOR
-Incorrect \fIop\fP specified
-.TP 1i
-SCI_ERR_GROUP_EMPTY
-The new group is an empty group
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3
deleted file mode 100644
index 4035e56..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3
+++ /dev/null
@@ -1,92 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_operate_ext 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_operate_ext\fP \- Create a new group from an existed group and a back end list
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_operate(sci_group_t \fIgroup\fP, int \fInum_bes\fP, int *\fIbe_list\fP, sci_op_t \fIop\fP, sci_group_t *\fInewgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-An existed group (IN).
-.TP 1i
-num_bes
-Number of back ends in another group (IN).
-.TP 1i
-be_list
-The back end id list of another group (IN).
-.TP 1i
-op
-Indicates how to create the new group (IN).
-.TP 1i
-newgroup
-The output new group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from an existed group and a back end list, 
-\fIgroup\fP can be \fBSCI_GROUP_ALL\fP, and \fIop\fP can be \fBSCI_UNION\fP, 
-\fBSCI_INTERSECTION\fP and \fBSCI_DIFFERENCE\fP. The new \fInewgroup\fP can be 
-used for \fBSCI_Bcast\fP to specify destination receivers.
-.sp
-This is a blocking call. The caller can assume \fInewgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes, *be_list;
-                    sci_group_t group, newgroup;
-                    ...
-                    num_bes = 3;
-                    be_list = (int *)malloc(sizeof(int)*num_bes);
-                    for (i=0; i<num_bes; i++) {
-                            be_list[i] = i;
-                    }
-                    SCI_Group_operate_ext(group, num_bes, be_list, SCI_UNION, &newgroup);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end id list contains non-existed back end id
-.TP 1i
-SCI_ERR_INVALID_OPERATOR
-Incorrect \fIop\fP specified
-.TP 1i
-SCI_ERR_GROUP_EMPTY
-The new group is an empty group
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3
deleted file mode 100644
index 7ce4192..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3
+++ /dev/null
@@ -1,87 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_query 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_query\fP \- Queries runtime information of an existed group
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_query(sci_group_t \fIgroup\fP, sci_group_query_t \fIquery\fP, void *\fIret_val\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-The group to be queried (IN).
-.TP 1i
-query
-Specifies the type of query you want to request (IN).
-.TP 1i
-ret_val
-Specifies the reference parameter for SCI to store as the result of the query. 
-The value of this parameter cannot be NULL (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to query runtime statistics of an existed group.
-SCI defines a set of query types as an enumeration in \fIsci.h\fP.
-.sp
-For example, you can query the number of back ends in a group using the 
-query value of \fBGROUP_MEMBER_NUM\fP: SCI_Group_query(group, GROUP_MEMBER_NUM, &ret_val);
-.sp
-In SCI, sci_group_query_t defines the following valid query types:
-.sp
-.TP 1i
-GROUP_MEMBER_NUM
-Query the number of back ends in the \fIgroup\fP
-.TP 1i
-GROUP_MEMBER
-Query the back end id list in the \fIgroup\fP
-.TP 1i
-GROUP_SUCCESSOR_NUM
-Query the number of successors in the \fIgroup\fP
-.TP 1i
-GROUP_SUCCESSOR
-Query the successor id list in the \fIgroup\fP
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int be_num, *be_list;
-                sci_group_t group;
-                ...
-                SCI_Group_query(group, GROUP_MEMBER_NUM, &be_num);
-                be_list = (int *)malloc(sizeof(int)*be_num);
-                SCI_Group_query(group, GROUP_MEMBER, be_list);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Can't set NULL to \fIret_val\fP
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can't be called from back end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Query\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3
deleted file mode 100644
index e6fe587..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3
+++ /dev/null
@@ -1,186 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Initialize 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Initialize\fP \- Initializes the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Initialize(sci_info_t *\fIinfo\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-info
-Pointer to the SCI startup information (IN).
-
-.SH DESCRIPTION
-.ft R
-This routine must be called before any other SCI routines are called.
-SCI can be initialized more than once; subsequent calls to SCI_Initialize
-are erroneous unless SCI_Terminate be called.
-.sp
-All SCI programs must contain a call to SCI_Initialize. SCI_Initialize 
-accepts \fIinfo\fP as its argument:
-.sp
-.nf
-        typedef union {
-                sci_end_type_t   type;
-                sci_fe_info_t    fe_info;
-                sci_be_info_t    be_info;
-        } sci_info_t;
-.fi
-.sp
-\fItype\fP can be \fBSCI_FRONT_END\fP or \fBSCI_BACK_END\fP.
-.sp
-In \fIsci_fe_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             *hostfile;
-                char             *bepath;
-                char             **beenvp;
-                char             reserve[64];
-        } sci_fe_info_t;
-.fi
-.sp
-\fImode\fP indicates the working mode of the front end, can be interrupt mode
-(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
-the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
-parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
-errors occur and it can be \fBNULL\fP, \fIhostfile\fP specifies the host list to initialize
-back ends, \fIbepath\fP specifies the command to run a back end, \fIbeenvp\fP specifies
-any additional environment variables user wants to pass to back ends and it should
-be ended with a \fBNULL\fP sign.
-.sp
-In \fIsci_be_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             reserve[64];
-        } sci_be_info_t;
-.fi
-.sp
-\fImode\fP indicates the working mode of the front end, can be interrupt mode
-(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
-the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
-parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
-errors occur and it can be \fBNULL\fP.
-.sp
-Each program can be started as a front end or a back end, and can
-work in polling mode or interrupt mode, furthermore, besides sci_info_t,
-the following environment variables begin with the prefix "SCI_" can be 
-used to tune SCI programs (if a data field in sci_info_t indicates the same
-attribute as an environment variable, it will be overwritten):
-.sp
-.TP 1i
-SCI_HOST_FILE
-host file, same as fe_info.hostfile in sci_info_t
-.TP 1i
-SCI_BACKEND_NUM
-number of back ends when startup
-.TP 1i
-SCI_DEBUG_FANOUT
-fanout of the SCI tree structure, the default value is 32
-.TP 1i
-SCI_BACKEND_PATH
-command to start a back end, same as fe_info.bepath in sci_info_t, can contain 
-arguments, e.g., "/usr/bin/pdb_be 2"
-.TP 1i
-SCI_USE_EXTLAUNCHER
-set to "yes" to indicate all back ends are started by an external launcher, the
-default value is "no"
-.TP 1i
-SCI_ENABLE_FAILOVER
-set to "yes" to indicate SCI will try to recover connections when facing connection
-problems, the default value is "no"
-.TP 1i
-SCI_REMOTE_SHELL
-can be "rsh", "ssh" or "", indicates how underlying SCI processes (agents, back ends)
-will be started, "rsh" means using rshell, "ssh" means using ssh, "" means using sci
-daemon, it's the default value
-.TP 1i
-SCI_DEVICE_NAME
-can be "" or an ifconfig interface name, e.g., "ib0", if set to "", the connection path
-indicated by the first interface will be used, otherwise the specified connection path
-will be used, the default value is the first ifconfig device name
-.TP 1i
-SCI_SEGMENT_SIZE
-message segment size used in SCI pipeline mechanism, when the size of downstream
-messages exceed a threshold (1.5 * size), this mechanism will be enabled
-automatically by splitting the large message into smaller segments to 
-increase the overall bandwidth, the default size is 46720 (bytes)
-.TP 1i
-SCI_SYNC_INIT
-if set to yes, the SCI_Initilize will block until all the backends are launched, 
-otherwise it will return immediately. The default value is no.
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        void handler(void *user_param, sci_group_t group, void *buffer, int size)
-        {
-                ...
-        }
-        
-        {
-                sci_info_t info;
-                info.type = SCI_FRONT_END;
-                info.fe_info.mode = SCI_INTERRUPT;
-                info.fe_info.hostfile = "./host.list";
-                info.fe_info.bepath = "/usr/bin/pdb_be";
-                info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-                info.fe_info.param = NULL;
-                SCI_Initialize(&info);
-                ... 
-                SCI_Terminate();
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_INVALID_ENDTYPE
-Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-.TP 1i
-SCI_ERR_INVALID_JOBKEY
-Invalid job key specified by SCI_JOB_KEY (only for BE)
-.TP 1i
-SCI_ERR_INVALID_HOSTFILE
-Invalid host file (only for FE)
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Unknown back end info (only for FE)
-.TP 1i
-SCI_ERR_LAUNCH_FAILED
-Failed to launch client(s) (only for FE)
-.TP 1i
-SCI_ERR_INITIALIZE_FAILED
-Initialization failed
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Terminate\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3
deleted file mode 100644
index 0d03aa0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3
+++ /dev/null
@@ -1,78 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Poll 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Poll\fP \- Check for arriving messages in polling mode
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Poll(int \fItimeout\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-timeout
-Timeout if no message arrives in \fItimeout\fP milliseconds, <0 means no timeout (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to check for arriving messages in polling mode. If a new message
-is arrived, user-registered handler in \fIsci_info_t\fP will be called to handle the message,
-otherwise a timeout will occur after \fItimeout\fP milliseconds elapsed.
-.sp
-If \fItimeout\fP is set to a negative value, no timeout will occur, and \fBSCI_Poll\fP can only
-return when a new message arrived or errors occurred.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int pollFd, extFd, maxFd;
-                fd_set fdSet;
-                SCI_Query(POLLING_FD, &pollFd);
-                ...
-                FD_ZERO(&fdSet);
-                FD_SET(pollFd, &fdSet);
-                FD_SET(extFd, &fdSet);
-                maxFd = (pollFd > extFd) ? pollFd : extFd;
-                select(maxFd+1, &fdSet, 0, 0, NULL);
-                if (FD_ISSET(pollFd, &fdSet)) {
-                        SCI_Poll(-1);
-                }
-                if (FD_ISSET(extFd, &fdSet)) {
-                        ...
-                }
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_MODE
-Can only be used in polling mode
-.TP 1i
-SCI_ERR_POLL_INVALID
-Invalid polling calls
-.TP 1i
-SCI_ERR_POLL_TIMEOUT
-A polling timeout occurs after \fItimeout\fP milliseconds elapsed
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Bcast\fP(3)
-\fBSCI_Upload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3
deleted file mode 100644
index c4800c9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3
+++ /dev/null
@@ -1,102 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Query 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Query\fP \- Queries runtime information of the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Query(sci_query_t \fIquery\fP, void *\fIret_val\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-query
-Specifies the type of query you want to request (IN).
-.TP 1i
-ret_val
-Specifies the reference parameter for SCI to store as the result of the query. 
-The value of this parameter cannot be NULL (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to query runtime settings and statistics from SCI.
-SCI defines a set of query types as an enumeration in \fIsci.h\fP.
-.sp
-For example, you can query the backend id using the query value of
-\fBBACKEND_ID\fP: SCI_Query(BACKEND_ID, &ret_val);
-.sp
-In SCI, sci_query_t defines the following valid query types:
-.sp
-.TP 1i
-JOB_KEY
-Query the job key of the current job
-.TP 1i
-NUM_BACKENDS
-Query the number of back ends in the job
-.TP 1i
-BACKEND_ID
-Query the back end id of current back end in the job
-.TP 1i
-POLLING_FD
-Query the external polling file descriptor in polling mode of the current job
-.TP 1i
-NUM_FILTERS
-Query the number of loaded filters in the current job
-.TP 1i
-FILTER_IDLIST
-Query the loaded filter id list of the current job
-.TP 1i
-AGENT_ID
-Query the agent id of current agent in the job
-.TP 1i
-NUM_SUCCESSORS
-Query the number of successors of current entity in the job
-.TP 1i
-SUCCESSOR_IDLIST
-Query the successor id list of current entity in the job
-.TP 1i
-HEALTH_STATUS
-Query the running status of current entity in the job, can be 0 (normal) or
-1 (exited)
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int my_id;
-                SCI_Query(BACKEND_ID, &my_id);
-                int be_num;
-                SCI_Query(NUM_BACKENDS, &be_num);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Can't set NULL to \fIret_val\fP
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Invalid query type for current entity. e.g., \fBBACKEND_NUM\fP can only be
-used for back end
-.TP 1i
-SCI_ERR_MODE
-For \fBPOLLING_FD\fP only, can only be used in polling mode
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_query\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3
deleted file mode 100644
index a89c5ec..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3
+++ /dev/null
@@ -1,58 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Terminate 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Terminate\fP \- Terminates the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Terminate()
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-none
-
-.SH DESCRIPTION
-.ft R
-Make sure this routine is the last SCI call. Any SCI calls made after
-SCI_Terminate raise an error. You must be sure that all pending
-communications have completed before calls SCI_Terminate.
-.sp
-Although SCI_Terminate terminates SCI processing, it does not terminate
-the front end or back end. It is possible to continue with non-SCI processing
-after calling SCI_Terminate, but no other SCI calls can be made unless
-SCI_Initialize be called again.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                /* declare variables */
-                SCI_Initialize(&info);
-                ...
-                SCI_Terminate();
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Initialize\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3
deleted file mode 100644
index 93d0c6d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3
+++ /dev/null
@@ -1,78 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Upload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Upload\fP \- Uploads messages from a back end to the front end
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Upload(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the message filter (IN).
-.TP 1i
-group
-The group which the message belongs to (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to upload message from a back end to the front end. The message
-can be sent directly to the front end if set \fIfilter_id\fP to \fBSCI_FILTER_NULL\fP,
-or can be sent to the filter indicated by \fIfilter_id\fP if a new message filter is loaded 
-by \fBSCI_Filter_load\fP.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Bcast\fP(3)
-\fBSCI_Poll\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/missing b/tools/sci/org.eclipse.ptp.sci/missing
deleted file mode 100755
index 894e786..0000000
--- a/tools/sci/org.eclipse.ptp.sci/missing
+++ /dev/null
@@ -1,360 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2005-06-08.21
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
-#   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, 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.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-
-# 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'
-  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]
-
-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
-
-# 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).
-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 "$1" 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 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
-    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 [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f y.tab.h ]; then
-	echo >y.tab.h
-    fi
-    if [ ! -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 [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -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 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    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 's/.*-o \([^ ]*\).*/\1/p'`
-    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-end: "$"
-# End:
diff --git a/tools/sci/org.eclipse.ptp.sci/plugin.properties b/tools/sci/org.eclipse.ptp.sci/plugin.properties
deleted file mode 100644
index b0ac9d6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-
-pluginName=PTP Scalable Communication Infrastructure (SCI)
-pluginProvider=Eclipse PTP
diff --git a/tools/sci/org.eclipse.ptp.sci/pom.xml b/tools/sci/org.eclipse.ptp.sci/pom.xml
deleted file mode 100644
index 47b71a6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.eclipse.ptp</groupId>
-    <artifactId>ptp-parent</artifactId>
-    <version>9.3.0-SNAPSHOT</version>
-    <relativePath>../../../pom.xml</relativePath>
-  </parent>
-
-  <artifactId>org.eclipse.ptp.sci</artifactId>
-  <version>9.3.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-  
-    <build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-antrun-plugin</artifactId>
-				<version>1.1</version>
-				<executions>
-					<execution>
-						<id>fix-version</id>
-						<goals>
-							<goal>run</goal>
-						</goals>
-						<phase>prepare-package</phase>
-						<configuration>
-							<tasks>
-								<replace file="configure">
-									<replacefilter token="@buildVersion@" value="${unqualifiedVersion}.${buildQualifier}"/>
-								</replace>
-								<replace file="configure.in">
-									<replacefilter token="@buildVersion@" value="${unqualifiedVersion}.${buildQualifier}"/>
-								</replace>
-							</tasks>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-</project>
diff --git a/tools/sci/org.eclipse.ptp.sci/scia/.cvsignore b/tools/sci/org.eclipse.ptp.sci/scia/.cvsignore
deleted file mode 100644
index e7422cb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.deps
-Makefile
-.libs
-scia
diff --git a/tools/sci/org.eclipse.ptp.sci/scia/Makefile.am b/tools/sci/org.eclipse.ptp.sci/scia/Makefile.am
deleted file mode 100644
index 554e0b9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/Makefile.am
+++ /dev/null
@@ -1,29 +0,0 @@
-scia_SOURCES = scia.cpp
-scia64_SOURCES = scia.cpp
-if SYSTEM_AIX
-if BIT64
-bin_PROGRAMS = scia64 scia
-else
-bin_PROGRAMS = scia
-endif
-scia_CPPFLAGS = -g -O0 -I../common -I../include
-scia_LDFLAGS = -L../common -lcmn64 -lrt -lpthread -ldl
-scia64_CPPFLAGS = -g -O0 -q64 -I../common -I../include -D__64BIT__
-scia64_LDFLAGS = -q64 -L../common -lcmn64 -lrt -lpthread -ldl
-endif
-if SYSTEM_DARWIN
-bin_PROGRAMS = scia
-scia_CPPFLAGS = -I../common -I../include
-scia_LDFLAGS = -L../common -lcmn -lpthread -ldl
-endif
-if SYSTEM_LINUX
-if BIT64
-bin_PROGRAMS = scia64
-scia64_CPPFLAGS = -m64 -g -O0 -I../common -I../include -D__64BIT__
-scia64_LDFLAGS = -m64 -L../common -lcmn -lrt -lpthread -ldl
-else
-bin_PROGRAMS = scia
-scia_CPPFLAGS = -m32 -g -O0 -I../common -I../include
-scia_LDFLAGS = -m32 -L../common -lcmn -lrt -lpthread -ldl
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/scia/Makefile.in b/tools/sci/org.eclipse.ptp.sci/scia/Makefile.in
deleted file mode 100644
index 019cfad..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/Makefile.in
+++ /dev/null
@@ -1,563 +0,0 @@
-# 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@
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = scia$(EXEEXT)
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = scia$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = scia64$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = scia64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	scia$(EXEEXT)
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@bin_PROGRAMS = scia$(EXEEXT)
-subdir = scia
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-am_scia_OBJECTS = scia-scia.$(OBJEXT)
-scia_OBJECTS = $(am_scia_OBJECTS)
-scia_LDADD = $(LDADD)
-scia_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(scia_LDFLAGS) $(LDFLAGS) -o $@
-am_scia64_OBJECTS = scia64-scia.$(OBJEXT)
-scia64_OBJECTS = $(am_scia64_OBJECTS)
-scia64_LDADD = $(LDADD)
-scia64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(scia64_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(scia_SOURCES) $(scia64_SOURCES)
-DIST_SOURCES = $(scia_SOURCES) $(scia64_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-scia_SOURCES = scia.cpp
-scia64_SOURCES = scia.cpp
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@scia_CPPFLAGS = -m32 -g -O0 -I../common -I../include
-@SYSTEM_AIX_TRUE@scia_CPPFLAGS = -g -O0 -I../common -I../include
-@SYSTEM_DARWIN_TRUE@scia_CPPFLAGS = -I../common -I../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@scia_LDFLAGS = -m32 -L../common -lcmn -lrt -lpthread -ldl
-@SYSTEM_AIX_TRUE@scia_LDFLAGS = -L../common -lcmn64 -lrt -lpthread -ldl
-@SYSTEM_DARWIN_TRUE@scia_LDFLAGS = -L../common -lcmn -lpthread -ldl
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@scia64_CPPFLAGS = -m64 -g -O0 -I../common -I../include -D__64BIT__
-@SYSTEM_AIX_TRUE@scia64_CPPFLAGS = -g -O0 -q64 -I../common -I../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@scia64_LDFLAGS = -m64 -L../common -lcmn -lrt -lpthread -ldl
-@SYSTEM_AIX_TRUE@scia64_LDFLAGS = -q64 -L../common -lcmn64 -lrt -lpthread -ldl
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .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) --gnu scia/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu scia/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):
-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
-scia$(EXEEXT): $(scia_OBJECTS) $(scia_DEPENDENCIES) 
-	@rm -f scia$(EXEEXT)
-	$(scia_LINK) $(scia_OBJECTS) $(scia_LDADD) $(LIBS)
-scia64$(EXEEXT): $(scia64_OBJECTS) $(scia64_DEPENDENCIES) 
-	@rm -f scia64$(EXEEXT)
-	$(scia64_LINK) $(scia64_OBJECTS) $(scia64_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scia-scia.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scia64-scia.Po@am__quote@
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-scia-scia.o: scia.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scia-scia.o -MD -MP -MF $(DEPDIR)/scia-scia.Tpo -c -o scia-scia.o `test -f 'scia.cpp' || echo '$(srcdir)/'`scia.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scia-scia.Tpo $(DEPDIR)/scia-scia.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scia.cpp' object='scia-scia.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scia-scia.o `test -f 'scia.cpp' || echo '$(srcdir)/'`scia.cpp
-
-scia-scia.obj: scia.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scia-scia.obj -MD -MP -MF $(DEPDIR)/scia-scia.Tpo -c -o scia-scia.obj `if test -f 'scia.cpp'; then $(CYGPATH_W) 'scia.cpp'; else $(CYGPATH_W) '$(srcdir)/scia.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scia-scia.Tpo $(DEPDIR)/scia-scia.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scia.cpp' object='scia-scia.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scia-scia.obj `if test -f 'scia.cpp'; then $(CYGPATH_W) 'scia.cpp'; else $(CYGPATH_W) '$(srcdir)/scia.cpp'; fi`
-
-scia64-scia.o: scia.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scia64-scia.o -MD -MP -MF $(DEPDIR)/scia64-scia.Tpo -c -o scia64-scia.o `test -f 'scia.cpp' || echo '$(srcdir)/'`scia.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scia64-scia.Tpo $(DEPDIR)/scia64-scia.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scia.cpp' object='scia64-scia.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scia64-scia.o `test -f 'scia.cpp' || echo '$(srcdir)/'`scia.cpp
-
-scia64-scia.obj: scia.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scia64-scia.obj -MD -MP -MF $(DEPDIR)/scia64-scia.Tpo -c -o scia64-scia.obj `if test -f 'scia.cpp'; then $(CYGPATH_W) 'scia.cpp'; else $(CYGPATH_W) '$(srcdir)/scia.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scia64-scia.Tpo $(DEPDIR)/scia64-scia.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scia.cpp' object='scia64-scia.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scia64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scia64-scia.obj `if test -f 'scia.cpp'; then $(CYGPATH_W) 'scia.cpp'; else $(CYGPATH_W) '$(srcdir)/scia.cpp'; fi`
-
-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:
-	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-binPROGRAMS
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libtool ctags distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir 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-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 \
-	uninstall-binPROGRAMS
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp b/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp
deleted file mode 100644
index e9a32e0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: main() function.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <signal.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <assert.h>
-#include <dlfcn.h>
-
-#include "sci.h"
-
-#ifdef _SCI_LINUX
-#define SCI_LIB_PATH "libsci.so"
-#else  // aix
-#ifdef __64BIT__
-#define SCI_LIB_PATH "libsci_r.a(libsci64_r.o)"
-#else  // 32-bit
-#define SCI_LIB_PATH "libsci_r.a(libsci_r.o)"
-#endif // 32-bit
-#endif // aix
-
-typedef int (scia_init_hndlr)(sci_info_t *);
-typedef int (scia_term_hndlr)();
-
-int main()
-{
-    void *dlopen_file = NULL;
-    char *error = NULL;
-    int rc;
-
-#if defined(_SCI_LINUX)
-    dlopen_file = ::dlopen(SCI_LIB_PATH, RTLD_NOW | RTLD_LOCAL);
-#elif defined(__APPLE__)
-    dlopen_file = ::dlopen(SCI_LIB_PATH, RTLD_NOW | RTLD_LOCAL);
-#else  // aix
-    dlopen_file = ::dlopen(SCI_LIB_PATH, RTLD_NOW | RTLD_LOCAL | RTLD_MEMBER);
-#endif
-    if (!dlopen_file) {
-        ::fprintf (stderr, "%s\n", ::dlerror());
-        ::exit(1);
-    }
-
-    ::dlerror();    /* Clear any existing error */
-    scia_init_hndlr *init_hndlr = (scia_init_hndlr *) ::dlsym(dlopen_file, "SCI_Initialize");
-    scia_term_hndlr *term_hndlr = (scia_term_hndlr *) ::dlsym(dlopen_file, "SCI_Terminate");
-    if ((error = ::dlerror()) != NULL)  {
-        ::fprintf (stderr, "%s\n", error);
-        ::exit(1);
-    }
-    
-    // sleep(20);
-    rc = init_hndlr(NULL);
-    if (rc != SCI_SUCCESS) {
-        ::fprintf(stderr, "scia initialization failed\n");
-        ::exit(1);
-    }
-    rc = term_hndlr();
-    if (rc != SCI_SUCCESS) {
-        ::fprintf(stderr, "scia termination failed\n");
-        ::exit(1);
-    }
-
-    ::dlclose(dlopen_file);
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/.cvsignore b/tools/sci/org.eclipse.ptp.sci/scid/.cvsignore
deleted file mode 100644
index 8a23c2f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.deps
-Makefile
-.libs
-scidv1
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/Makefile.am b/tools/sci/org.eclipse.ptp.sci/scid/Makefile.am
deleted file mode 100644
index cc8ed6c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-sbin_PROGRAMS = scidv1
-scidv1_SOURCES = extlaunch.cpp  extlisten.cpp  locker.cpp  scid.cpp
-
-if SYSTEM_AIX
-scidv1_CPPFLAGS = -q64 -I../common -I../secmod
-scidv1_LDFLAGS = -q64 -L../common -lcmn64 -lrt -lpthread -ldl
-endif
-if SYSTEM_LINUX
-scidv1_CPPFLAGS = -I../common -I../secmod
-scidv1_LDFLAGS = -L../common -lcmn -lrt -lpthread -ldl
-endif
-if SYSTEM_DARWIN
-scidv1_CPPFLAGS = -I../common -I../secmod
-scidv1_LDFLAGS = -L../common -lcmn -lpthread -ldl
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/Makefile.in b/tools/sci/org.eclipse.ptp.sci/scid/Makefile.in
deleted file mode 100644
index 699e136..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/Makefile.in
+++ /dev/null
@@ -1,577 +0,0 @@
-# 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@
-sbin_PROGRAMS = scidv1$(EXEEXT)
-subdir = scid
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(sbindir)"
-PROGRAMS = $(sbin_PROGRAMS)
-am_scidv1_OBJECTS = scidv1-extlaunch.$(OBJEXT) \
-	scidv1-extlisten.$(OBJEXT) scidv1-locker.$(OBJEXT) \
-	scidv1-scid.$(OBJEXT)
-scidv1_OBJECTS = $(am_scidv1_OBJECTS)
-scidv1_LDADD = $(LDADD)
-scidv1_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(scidv1_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(scidv1_SOURCES)
-DIST_SOURCES = $(scidv1_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-scidv1_SOURCES = extlaunch.cpp  extlisten.cpp  locker.cpp  scid.cpp
-@SYSTEM_AIX_TRUE@scidv1_CPPFLAGS = -q64 -I../common -I../secmod
-@SYSTEM_DARWIN_TRUE@scidv1_CPPFLAGS = -I../common -I../secmod
-@SYSTEM_LINUX_TRUE@scidv1_CPPFLAGS = -I../common -I../secmod
-@SYSTEM_AIX_TRUE@scidv1_LDFLAGS = -q64 -L../common -lcmn64 -lrt -lpthread -ldl
-@SYSTEM_DARWIN_TRUE@scidv1_LDFLAGS = -L../common -lcmn -lpthread -ldl
-@SYSTEM_LINUX_TRUE@scidv1_LDFLAGS = -L../common -lcmn -lrt -lpthread -ldl
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .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) --gnu scid/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu scid/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):
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
-	@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || 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)$(sbindir)$$dir'"; \
-	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
-	    } \
-	; done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || 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)$(sbindir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(sbindir)" && rm -f $$files
-
-clean-sbinPROGRAMS:
-	@list='$(sbin_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
-scidv1$(EXEEXT): $(scidv1_OBJECTS) $(scidv1_DEPENDENCIES) 
-	@rm -f scidv1$(EXEEXT)
-	$(scidv1_LINK) $(scidv1_OBJECTS) $(scidv1_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scidv1-extlaunch.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scidv1-extlisten.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scidv1-locker.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scidv1-scid.Po@am__quote@
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-scidv1-extlaunch.o: extlaunch.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-extlaunch.o -MD -MP -MF $(DEPDIR)/scidv1-extlaunch.Tpo -c -o scidv1-extlaunch.o `test -f 'extlaunch.cpp' || echo '$(srcdir)/'`extlaunch.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-extlaunch.Tpo $(DEPDIR)/scidv1-extlaunch.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='extlaunch.cpp' object='scidv1-extlaunch.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-extlaunch.o `test -f 'extlaunch.cpp' || echo '$(srcdir)/'`extlaunch.cpp
-
-scidv1-extlaunch.obj: extlaunch.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-extlaunch.obj -MD -MP -MF $(DEPDIR)/scidv1-extlaunch.Tpo -c -o scidv1-extlaunch.obj `if test -f 'extlaunch.cpp'; then $(CYGPATH_W) 'extlaunch.cpp'; else $(CYGPATH_W) '$(srcdir)/extlaunch.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-extlaunch.Tpo $(DEPDIR)/scidv1-extlaunch.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='extlaunch.cpp' object='scidv1-extlaunch.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-extlaunch.obj `if test -f 'extlaunch.cpp'; then $(CYGPATH_W) 'extlaunch.cpp'; else $(CYGPATH_W) '$(srcdir)/extlaunch.cpp'; fi`
-
-scidv1-extlisten.o: extlisten.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-extlisten.o -MD -MP -MF $(DEPDIR)/scidv1-extlisten.Tpo -c -o scidv1-extlisten.o `test -f 'extlisten.cpp' || echo '$(srcdir)/'`extlisten.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-extlisten.Tpo $(DEPDIR)/scidv1-extlisten.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='extlisten.cpp' object='scidv1-extlisten.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-extlisten.o `test -f 'extlisten.cpp' || echo '$(srcdir)/'`extlisten.cpp
-
-scidv1-extlisten.obj: extlisten.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-extlisten.obj -MD -MP -MF $(DEPDIR)/scidv1-extlisten.Tpo -c -o scidv1-extlisten.obj `if test -f 'extlisten.cpp'; then $(CYGPATH_W) 'extlisten.cpp'; else $(CYGPATH_W) '$(srcdir)/extlisten.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-extlisten.Tpo $(DEPDIR)/scidv1-extlisten.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='extlisten.cpp' object='scidv1-extlisten.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-extlisten.obj `if test -f 'extlisten.cpp'; then $(CYGPATH_W) 'extlisten.cpp'; else $(CYGPATH_W) '$(srcdir)/extlisten.cpp'; fi`
-
-scidv1-locker.o: locker.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-locker.o -MD -MP -MF $(DEPDIR)/scidv1-locker.Tpo -c -o scidv1-locker.o `test -f 'locker.cpp' || echo '$(srcdir)/'`locker.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-locker.Tpo $(DEPDIR)/scidv1-locker.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='locker.cpp' object='scidv1-locker.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-locker.o `test -f 'locker.cpp' || echo '$(srcdir)/'`locker.cpp
-
-scidv1-locker.obj: locker.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-locker.obj -MD -MP -MF $(DEPDIR)/scidv1-locker.Tpo -c -o scidv1-locker.obj `if test -f 'locker.cpp'; then $(CYGPATH_W) 'locker.cpp'; else $(CYGPATH_W) '$(srcdir)/locker.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-locker.Tpo $(DEPDIR)/scidv1-locker.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='locker.cpp' object='scidv1-locker.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-locker.obj `if test -f 'locker.cpp'; then $(CYGPATH_W) 'locker.cpp'; else $(CYGPATH_W) '$(srcdir)/locker.cpp'; fi`
-
-scidv1-scid.o: scid.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-scid.o -MD -MP -MF $(DEPDIR)/scidv1-scid.Tpo -c -o scidv1-scid.o `test -f 'scid.cpp' || echo '$(srcdir)/'`scid.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-scid.Tpo $(DEPDIR)/scidv1-scid.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scid.cpp' object='scidv1-scid.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-scid.o `test -f 'scid.cpp' || echo '$(srcdir)/'`scid.cpp
-
-scidv1-scid.obj: scid.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT scidv1-scid.obj -MD -MP -MF $(DEPDIR)/scidv1-scid.Tpo -c -o scidv1-scid.obj `if test -f 'scid.cpp'; then $(CYGPATH_W) 'scid.cpp'; else $(CYGPATH_W) '$(srcdir)/scid.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/scidv1-scid.Tpo $(DEPDIR)/scidv1-scid.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='scid.cpp' object='scidv1-scid.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(scidv1_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o scidv1-scid.obj `if test -f 'scid.cpp'; then $(CYGPATH_W) 'scid.cpp'; else $(CYGPATH_W) '$(srcdir)/scid.cpp'; fi`
-
-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:
-	for dir in "$(DESTDIR)$(sbindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-sbinPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-sbinPROGRAMS
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-sbinPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-sbinPROGRAMS ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	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-sbinPROGRAMS 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 uninstall-sbinPROGRAMS
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp b/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp
deleted file mode 100644
index dde49f7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtLauncher
-
- Description: Support External Laucher such as POE
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-   10/10/12 ronglli      Add oom_adj codes
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <assert.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "tools.hpp"
-#include "sshfunc.hpp"
-#include "log.hpp"
-#include "exception.hpp"
-#include "locker.hpp"
-#include "stream.hpp"
-#include "socket.hpp"
-
-#include "extlaunch.hpp"
-
-const int MAX_FD = 256;
-
-vector<ExtLauncher *> launcherList;
-
-const int MAX_PWD_BUF_SIZE = 1024;
-const int MAX_ENV_VAR_NUM = 1024;
-
-void set_oom_adj(int s)
-{
-#ifdef _SCI_LINUX
-    char oomfname[256] = "";
-    char oomadjstr[16] = "";
-    int oomfd = -1;
-    struct stat oomadjst = {0};
-    int nbytes = -1;
-
-    int score = s;
-    score = (score < -1000) ? (-1000) : (score);
-    score = (score > 1000) ? (1000) : (score);
-    
-    ::sprintf(oomfname, "/proc/%d/oom_score_adj", getpid());
-    if (::stat(oomfname, &oomadjst) != 0) {
-        /* could not find oom_score_adj, will try oom_adj instead */
-        ::sprintf(oomfname, "/proc/%d/oom_adj", getpid());
-        double oomadjval = (score < 0) ? (((double) score/1000.0)*17.0) : (((double) score/1000.0)*15.0);
-        ::sprintf(oomadjstr, "%.0f", oomadjval);
-    } else {
-        ::sprintf(oomadjstr, "%d", score);
-    }
-
-    oomfd = ::open(oomfname, O_WRONLY, 0);
-    if (oomfd < 0) {
-        log_error("open() failed for %s: errno = %d\n", oomfname, errno);
-        return;
-    }
-
-    nbytes = ::write(oomfd, oomadjstr, strlen(oomadjstr));
-    if (nbytes < 0) {
-        log_error("write() failed for %s: errno = %d", oomfname, errno);
-    } else {
-        log_crit("wrote %d bytes to %s: %s", nbytes, oomfname, oomadjstr);
-    }
-    ::close(oomfd);
-#endif
-}
-
-ExtLauncher::ExtLauncher(Stream *s, bool auth)
-    : stream(s)
-{
-    memset(&usertok, 0, sizeof(usertok));
-    sshAuth = auth;
-}
-
-ExtLauncher::~ExtLauncher()
-{
-}
-
-int ExtLauncher::verifyToken(bool suser) 
-{
-    int rc;
-    struct passwd pwd;
-    struct passwd *result = NULL;
-    char *pwdBuf = new char[MAX_PWD_BUF_SIZE];
-
-    while (1) {
-        rc = ::getpwnam_r(userName.c_str(), &pwd, pwdBuf, MAX_PWD_BUF_SIZE, &result);
-        if ((rc == EINTR) || (rc == EMFILE) || (rc == ENFILE)) {
-            SysUtil::sleep(WAIT_INTERVAL);
-            continue;
-        }
-        if (NULL == result) {
-            delete []pwdBuf;
-            throw Exception(Exception::INVALID_USER);
-        } else {
-            break;
-        }
-    } 
-    if (suser) {
-        ::setgid(pwd.pw_gid);
-        ::setuid(pwd.pw_uid);
-    }
-    ::seteuid(pwd.pw_uid);
-    rc = SSHFUNC->verify_id_token(pwd.pw_name, &usertok);
-    delete []pwdBuf;
-
-    return rc;
-}
-
-int ExtLauncher::verifyData(struct iovec &sign, int jobkey, int id, char *path, char *envStr)
-{
-    int rc = -1;
-
-    ssKeyLen = sizeof(sessionKey);
-    rc = SSHFUNC->get_key_from_token(NULL, &usertok, sessionKey, &ssKeyLen);
-    if (rc != 0)
-        return rc;
-
-    if (path == NULL) {
-        rc = SSHFUNC->verify_data(sessionKey, ssKeyLen, &sign, "%d%d%d", mode, jobkey, id);
-    } else {
-        rc = SSHFUNC->verify_data(sessionKey, ssKeyLen, &sign, "%d%d%d%s%s", mode, jobkey, id, path, envStr);
-    }
-
-    return rc;
-}
-
-void ExtLauncher::run()
-{
-    int id, jobKey, rc;
-    string path, envStr;
-    struct iovec sign;
-    try {
-        *stream >> userName >> usertok >> sign >> (int &)mode >> jobKey >> id;
-        switch (mode) {
-            case INTERNAL:
-                *stream >> path >> envStr >> endl;
-                log_crit("[%s] Launch %d.%d %s with %s internally", userName.c_str(), 
-                    jobKey, id, path.c_str(), envStr.c_str());
-                launchInt(jobKey, id, (char *)path.c_str(), (char *)envStr.c_str(), sign);
-                break;
-            case REGISTER:
-                *stream >> path >> envStr >> endl;
-                log_crit("[%s] Receive register info %d.%d %s", userName.c_str(), jobKey, 
-                        id, envStr.c_str());
-                rc = doVerify(sign, jobKey, id, (char *)path.c_str(), (char *)envStr.c_str());
-                if (rc == 0) {
-                    rc = launchReg(jobKey, id, (char *)envStr.c_str());
-                }
-                break;
-            case REQUEST:
-                *stream >> endl;
-                log_crit("[%s] Handle external launching request %d.%d", userName.c_str(),
-                        jobKey, id);
-                rc = doVerify(sign, jobKey, id);
-                if (rc == 0) {
-                    double starttm = SysUtil::microseconds();
-                    rc = -1;
-                    while ((rc != 0) && ((SysUtil::microseconds() - starttm) < FIVE_MINUTES)) {
-                        rc = launchReq(jobKey, id);
-                        SysUtil::sleep(WAIT_INTERVAL);
-                    }
-                }
-                break;
-            default:
-                break;
-        }
-    } catch (SocketException &e) {
-        log_error("socket exception %s", e.getErrMsg().c_str());
-    } catch (Exception &e) {
-        log_error("exception %s, errno = %d", e.getErrMsg(), errno);
-    } catch (...) {
-        log_error("unknown exception");
-    }
-
-    delete stream;
-    delete [] (char *)usertok.iov_base;
-    setState(false);
-
-    Locker::getLocker()->lock();
-    launcherList.push_back(this);
-    Locker::getLocker()->unlock();
-    Locker::getLocker()->notify();
-}
-
-char * ExtLauncher::getExename(char *path)
-{
-    int len;
-    char *exename = NULL;
-    char *p1 = NULL, *p2 = NULL;
-
-    // get the exe name
-    p1 = path;
-    do {
-        if (((*p1)==' ') || ((*p1)=='\t')) {
-            p1++;
-        } else if ((*p1) == '\0') {
-            return NULL;
-        } else {
-            break;
-        }
-    } while (1);
-    p2 = p1;
-    while (((*p2)!=' ') && ((*p2)!='\t') && ((*p2)!='\0')) {
-        p2++;
-    }
-    len = p2 - p1;
-    exename = new char[len+1]; // Need to be deleted outside
-    ::strncpy(exename, p1, len);
-    exename[len] = '\0';
-
-    return exename;
-}
-
-int ExtLauncher::launchInt(int jobkey, int id, char *path, char *envStr, struct iovec &signature)
-{
-    pid_t pid;
-    int i = 0;
-    int rc = 0;
-    char *exename = getExename(path); // There is a new inside
-
-    if (::access(exename, F_OK | R_OK | X_OK) != 0) {
-        retStr = string(exename) + " is not an executable file";
-        log_error("%s", retStr.c_str());
-        delete [] exename;
-        return -1;
-    }
-
-    pid = ::fork();
-    if (pid < 0) { // fork failed
-        rc =  errno;
-        retStr = "fork failed";
-    } else if (pid == 0) { // child process
-        int sfd = stream->getSocket();
-        // the child process can't ignore SIGCHLD signal
-        ::sigaction(SIGCHLD, &oldSa, NULL);
-        dup2(sfd, STDIN_FILENO);
-        for (i = STDERR_FILENO + 1; i < MAX_FD; i++) {
-            ::close(i);
-        }
-        set_oom_adj(1000);
-
-        try {
-            rc = putSessionKey(-1, signature, jobkey, id, path, envStr, true);
-            if (rc != 0) {
-                exit(rc);
-            }
-        } catch (Exception &e) {
-            exit(-1);
-        }
-
-        char *p = envStr;
-        char *params[4096];
-        for (i = 0; i < MAX_ENV_VAR_NUM-1; i++) {
-            p = ::strchr(p, ';');
-            if (NULL == p) {
-                break;
-            }
-            *p = '\0';
-            params[i] = ++p;
-        }
-        params[i] = NULL;
-        rc = ::execle("/bin/sh", "/bin/sh", "-c", path, (char *)NULL, params); 
-        if (rc < 0) {
-            exit(0);
-        }
-    }
-    delete [] exename;
-
-    return rc;
-}
-
-int ExtLauncher::getSessionKey(int fd)
-{
-    int n, rc;
-    struct iovec vecs[2];
-
-    vecs[0].iov_base = &rc;
-    vecs[0].iov_len = sizeof(rc);
-    vecs[1].iov_base = &sessionKey;
-    vecs[1].iov_len = sizeof(sessionKey);
-    if ((n = readv(fd, vecs, 2)) == -1) {
-        rc = -1;
-    }
-    ssKeyLen = n - sizeof(rc);
-
-    return rc;
-}
-
-int ExtLauncher::putSessionKey(int fd, struct iovec &sign, int jobkey, int id, char *path, char *envStr, bool suser)
-{
-    int i, rc;
-    struct iovec vecs[2];
-
-    rc = verifyToken(suser);
-#ifdef PSEC_OPEN_SSL
-    if (sshAuth) {
-        if (rc == 0) {
-            rc = verifyData(sign, jobkey, id, path, envStr);
-        }
-        if (fd < 0)
-            return rc;
-
-        vecs[0].iov_base = &rc;
-        vecs[0].iov_len = sizeof(rc);
-        vecs[1].iov_base = sessionKey;
-        vecs[1].iov_len = ssKeyLen;
-        writev(fd, vecs, 2);
-    }
-#endif
-
-    return rc;
-}
-
-int ExtLauncher::doVerify(struct iovec &sign, int jobkey, int id, char *path, char *envStr)
-{
-#ifndef PSEC_OPEN_SSL
-    return 0;
-#endif
-    int rc = -1;
-    pid_t pid;
-    int sockfd[2];
-
-    if (!sshAuth)
-        return 0;
-
-    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) == -1) {
-        log_error("Failed to create socketpair!");
-        return -1;
-    }
-
-    if ((pid = ::fork()) < 0) {
-        rc =  errno;
-        retStr = "fork failed";
-        log_error("Failed to fork child!");
-    } else if (pid == 0) { // child process
-        int i;
-        close(sockfd[1]);
-        dup2(sockfd[0], MAX_FD);
-        for (i = 0; i < MAX_FD; i++) {
-            ::close(i);
-        }
-        rc = putSessionKey(MAX_FD, sign, jobkey, id, path, envStr);
-        close(MAX_FD);
-        exit(0);
-    } else { // parent process
-        close(sockfd[0]);
-        rc = getSessionKey(sockfd[1]);
-        close(sockfd[1]);
-    }
-
-    return rc;
-} 
-
-
-int ExtLauncher::launchReg(int jobkey, int id, const char *envStr)
-{
-    Locker::getLocker()->lock();
-    TASK_INFO &task = jobInfo[jobkey];
-    task.user = userName;
-    task.config[id] = envStr;
-    task.timestamp = SysUtil::microseconds();
-    memset(&task.token, 0, sizeof(task.token));
-    if (usertok.iov_len > 0) {
-        task.token.iov_len = usertok.iov_len;
-        task.token.iov_base = new char [usertok.iov_len];
-        memcpy(task.token.iov_base, usertok.iov_base, usertok.iov_len);
-    }
-
-    Locker::getLocker()->unlock();
-
-    return 0;
-}
-
-int ExtLauncher::launchReq(int jobkey, int id)
-{
-    struct iovec sign = {0};
-
-    Locker::getLocker()->lock();
-    if (jobInfo.find(jobkey) == jobInfo.end()) {
-        Locker::getLocker()->unlock();
-        return -1;
-    }
-    TASK_INFO &task = jobInfo[jobkey];
-    if (task.user != userName) {
-        Locker::getLocker()->unlock();
-        return -2;
-    }
-    TASK_CONFIG &cfg = task.config;
-    if (cfg.find(id) == cfg.end()) {
-        Locker::getLocker()->unlock();
-        return -1;
-    }
-
-    SSHFUNC->sign_data(sessionKey, ssKeyLen, &sign, 2, cfg[id].c_str(), cfg[id].size() + 1, task.token.iov_base, task.token.iov_len);
-    *stream << cfg[id] << task.token << sign << endl;
-
-    cfg.erase(id);
-    if (cfg.size() == 0)
-        jobInfo.erase(jobkey);
-    Locker::getLocker()->unlock();
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp b/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp
deleted file mode 100644
index cceb55a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtLauncher
-
- Description: Support External Laucher such as POE
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _EXTLAUNCH_HPP
-#define _EXTLAUNCH_HPP
-
-#include <sys/uio.h>
-#include <pwd.h>
-
-#include <string>
-#include <map>
-
-#include "thread.hpp"
-
-#define WAIT_INTERVAL 1000  // 1000 usec
-#define FIVE_MINUTES 5000000 * 60
-
-using namespace std;
-
-class Stream;
-
-enum LAUNCH_MODE {
-    INTERNAL,
-    REGISTER,
-    REQUEST
-};
-
-class ExtLauncher : public Thread 
-{
-    private:
-        Stream         *stream;
-        string          retStr;
-        string          userName;
-        struct iovec    usertok;
-        char            sessionKey[64];
-        size_t          ssKeyLen;
-        LAUNCH_MODE     mode;
-        bool            sshAuth;
-
-    private:
-        char *getExename(char *path);
-
-        int verifyToken(bool suser = false);
-        int verifyData(struct iovec &sign, int jobkey, int id, char *path = NULL, char *envStr = NULL);
-        int doVerify(struct iovec &sign, int jobkey, int id, char *path = NULL, char *envStr = NULL);
-        int putSessionKey(int fd, struct iovec &sign, int jobkey, int id, char *path, char *envStr, bool suer = true);
-        int getSessionKey(int fd);
-    public:
-        ExtLauncher(Stream *s, bool auth = false);
-        virtual ~ExtLauncher();
-
-        virtual void run();
-
-        int launchInt(int jobkey, int id, char *path, char *envStr, struct iovec &sign);
-        int launchReg(int jobkey, int id, const char *envStr);
-        int launchReq(int jobkey, int id);
-        int regInfo();
-};
-
-typedef map<int, string> TASK_CONFIG;
-typedef struct TASK_INFO {
-    string          user;
-    TASK_CONFIG     config;
-    double          timestamp;
-    struct iovec    token;
-};
-typedef map<int, TASK_INFO> JOB_INFO;
-
-extern JOB_INFO jobInfo;
-extern vector<ExtLauncher *> launcherList;
-extern struct sigaction oldSa;
-
-void set_oom_adj(int s);
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp b/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp
deleted file mode 100644
index 82a9fea..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtListener
-
- Description: ...
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include <assert.h>
-#include <netdb.h>
-#include <stdlib.h>
-
-#include "stream.hpp"
-#include "log.hpp"
-#include "tools.hpp"
-
-#include "extlisten.hpp"
-#include "locker.hpp"
-#include "extlaunch.hpp"
-
-#ifdef DAEMON_PORT
-#define SCID_PORT DAEMON_PORT
-#else
-#define SCID_PORT 6188
-#endif
-
-#ifdef DAEMON_NAME
-#define SCID_NAME DAEMON_NAME
-#else
-#define SCID_NAME "sciv1" 
-#endif
-
-ExtListener::ExtListener()
-{
-}
-
-ExtListener::~ExtListener()
-{
-}
-
-void ExtListener::run()
-{
-    string out_val = "";
-    int rc;
-    bool sshAuth = false;
-
-    int child = -1;
-    int port = SCID_PORT;
-    struct servent *serv = NULL; 
-    char *envp = getenv("SCI_DAEMON_NAME");
-
-    if (envp != NULL) {
-        serv = getservbyname(envp, "tcp");
-    } else {
-        serv = getservbyname(SCID_NAME, "tcp");
-    }
-    if (serv != NULL) {
-        port = ntohs(serv->s_port);
-    }
-    
-    rc = SysUtil::read_config("SCI_ENABLE_SSHAUTH", out_val);
-    if(rc == 0) {
-        if (out_val == "yes") {
-            sshAuth = true;
-        } else if (out_val == "no") {
-            sshAuth = false;
-        } else {
-            log_error("Wrong value of \"SCI_ENABLE_SSHAUTH\": %s\n", out_val.c_str());
-        }
-    }
-
-    try {
-        socket.listen(port);
-    }catch (SocketException &e) {
-        log_error("socket exception %s", e.getErrMsg().c_str());
-        setState(false);
-        exit(1);
-    } catch (...) {
-        log_error("unknown exception");
-        setState(false);
-        exit(1);
-    }
-    log_crit("Extended listener is running");
-
-    while (getState()) {
-        try {
-            child = socket.accept();
-        } catch (SocketException &e) {
-            log_error("socket exception %s", e.getErrMsg().c_str());
-            break;
-        } catch (...) {
-            log_error("unknown exception");
-            break;
-        }
-        
-        if (child < 0)
-           continue;
-
-        Stream *stream = new Stream();
-        stream->init(child);
-        ExtLauncher *launcher = new ExtLauncher(stream, sshAuth);
-        launcher->start();
-    }
-
-    setState(false);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp b/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp
deleted file mode 100644
index cf96511..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtListener
-
- Description: ...
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _EXTLISTEN_HPP
-#define _EXTLISTEN_HPP
-
-#include "thread.hpp"
-#include "socket.hpp"
-
-class ExtListener : public Thread 
-{
-    private:
-        Socket     socket;
-
-    public:
-        ExtListener();
-        virtual ~ExtListener();
-        
-        virtual void run();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp b/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp
deleted file mode 100644
index 4766323..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Locker
-
- Description: Lock Operations.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/12/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include "locker.hpp"
-#include <stdio.h>
-#include <assert.h>
-#include <sched.h>
-
-Locker * Locker::locker = NULL;
-
-Locker::Locker()
-{
-    ::pthread_mutex_init(&gMutex, NULL);
-
-    ::pthread_mutex_init(&cMutex, NULL);
-    ::pthread_cond_init(&cond, NULL);
-
-    freezed = false;
-}
-
-Locker::~Locker()
-{
-    ::pthread_mutex_destroy(&gMutex);
-
-    ::pthread_cond_destroy(&cond);
-    ::pthread_mutex_destroy(&cMutex);
-}
-
-Locker * Locker::getLocker()
-{
-    if (locker == NULL) {
-        locker = new Locker();
-    }
-    
-    return locker;
-}
-
-void Locker::lock()
-{
-    ::pthread_mutex_lock(&gMutex);
-}
-
-void Locker::unlock()
-{
-    ::pthread_mutex_unlock(&gMutex);
-}
-
-/*
-
-Warning: do not try to use freeze() & notify() function in a same thread, the style is like:
-    thread a: freeze()
-    thread b: notify()
- The freeze & notification times are unlimited.
-
-*/
-
-void Locker::freeze()
-{   
-    ::pthread_mutex_lock(&cMutex);
-    freezed= true;
-    while (freezed) {
-        ::pthread_cond_wait(&cond, &cMutex);
-    }
-    ::pthread_mutex_unlock(&cMutex);
-}
-
-void Locker::notify()
-{
-    ::pthread_mutex_lock(&cMutex);
-    freezed= false;
-    ::pthread_cond_broadcast(&cond);
-    ::pthread_mutex_unlock(&cMutex);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp b/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp
deleted file mode 100644
index 86f68eb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Locker
-
- Description: Global lock operations.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/12/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _LOCKER_HPP
-#define _LOCKER_HPP
-
-#include <pthread.h>
-
-class Locker 
-{
-    private:
-        static Locker         *locker;
-        pthread_mutex_t       gMutex;
-
-        pthread_mutex_t       cMutex;
-        pthread_cond_t        cond;
-
-        bool                  freezed;
-
-        Locker();
-        
-    public:
-        ~Locker();
-        static Locker * getLocker();
-        
-        void lock();
-        void unlock();
-
-        void freeze();
-        void notify();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp b/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp
deleted file mode 100644
index 3e5c5e4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: SCI Service Daemon
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-   09/04/12 ronglli      Update the logging
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <fstream>
-
-#include "tools.hpp"
-#include "log.hpp"
-#include "locker.hpp"
-
-#include "extlisten.hpp"
-#include "extlaunch.hpp"
-
-
-const int MAXFD = 128;
-JOB_INFO jobInfo;
-string pidFile;
-
-struct sigaction oldSa;
-
-void sig_term(int sig)
-{
-    if (sig == SIGTERM) {
-        log_crit("Terminating ... ");
-        unlink(pidFile.c_str());
-        exit(0);
-    }
-}
-
-void daemonInit()
-{
-    umask(0);
-
-    ::sigaction(SIGCHLD, NULL, &oldSa);
-    
-    struct sigaction sa;
-    sa.sa_handler = SIG_IGN;
-    sa.sa_flags = 0;
-    sigemptyset(&sa.sa_mask);
-    sigaction(SIGHUP, &sa, NULL);
-    sigaction(SIGINT, &sa, NULL);
-    sigaction(SIGPIPE, &sa, NULL);
-    sigaction(SIGUSR1, &sa, NULL);
-    sigaction(SIGUSR2, &sa, NULL);
-    sigaction(SIGCHLD, &sa, NULL);
-    sa.sa_handler = sig_term;
-    sigaction(SIGTERM, &sa, NULL);
-
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-    pid_t pid;
-    if ((pid = fork()) < 0)
-        exit(-1);
-    else if (pid != 0) /* parent */
-        exit(0);
-    setsid();
-#endif
-
-    chdir("/");
-    /* close off file descriptors */
-    for (int i = 0; i < MAXFD; i++)
-        close(i);
-
-    /* redirect stdin, stdout, and stderr to /dev/null */
-    open("/dev/null", O_RDONLY);
-    open("/dev/null", O_RDWR);
-    open("/dev/null", O_RDWR);
-}
-
-void writePidFile(string &pidf)
-{
-    unlink(pidf.c_str());
-    ofstream pidfile(pidf.c_str());
-    if (!pidfile) {
-        printf("Cann't write pid file %s", pidf.c_str());
-        return;
-    }
-    pidfile << (int)getpid();
-}
-
-int checkPidFile(string &pidf)
-{
-    ifstream pidfile(pidf.c_str());
-    if (!pidfile)
-        return 0;
-
-    string line;
-    pidfile >> line;
-    if (line.size() == 0)
-        return 0;
-
-    int pid = atoi(line.c_str());
-    if (kill(pid, 0) == 0)
-        return -1;
-
-    return 0;
-}
-
-void usage(char * pName)
-{
-    printf("%s [-p pidDir] [-l logDir] [-s severity] [-e] \n\n", pName);
-    printf("    -p pidDir\t\tSpecify the pid directory. Default is: \"/var/run/\"(Linux) and \"/var/opt/\"(AIX)\n");
-    printf("    -l logDir\t\tSpecify the log directory. Default is: \"/tmp/\"\n");
-    printf("    -s severity\t\tSpecify the log severity. Default is: \"'3'(INFORMATION)\"\n");
-    printf("    -e \t\t\tEnable the log. Default is: disabled\n");
-}
-
-int initService(int argc, char *argv[])
-{
-    int i;
-    char *optpattern = "hl:p:s:e";
-    char *prog = argv[0];
-    char *p = NULL;
-    string logDir = "/tmp";
-    int logLevel = Log::INFORMATION;
-    int logMode = Log::DISABLE;
-#if defined(_SCI_LINUX) || defined(__APPLE__)
-    string pidDir = "/var/run/";
-#else
-    string pidDir = "/var/opt/";
-#endif
-    string logFile;
-
-    extern char *optarg;
-    extern int  optind;
-    p = strrchr(prog, '/');
-    if (p != NULL) 
-        p++;
-    else
-        p = prog;
-    
-    while ((i = getopt(argc, argv, optpattern)) != EOF) {
-        switch (i) {
-            case 'l':
-                logDir = optarg;
-                break ;
-            case 'p':
-                pidDir = optarg;
-                break;
-            case 's':
-                logLevel = atoi(optarg);
-                break;
-            case 'e':
-                logMode = Log::ENABLE;
-                break;
-            case 'h':
-                usage(p);
-                exit(0);
-                break;
-        }
-    }
-    pidFile = pidDir + "/" + p + ".pid";
-    if (checkPidFile(pidFile) < 0) {
-        printf("%s is already running...\n", p);
-        return -1;
-    }
-    if (getuid() != 0) {
-        printf("Must running as root\n");
-        return -1;
-    }
-    daemonInit();
-    writePidFile(pidFile);
-
-    logFile = string(p) + ".log"; 
-    Log::getInstance()->init(logDir.c_str(), logFile.c_str(), logLevel, logMode);
-
-    return 0;
-}
-
-int main(int argc, char *argv[])
-{
-    char *envp = NULL;
-
-    set_oom_adj(-1000);
-    if (initService(argc, argv) != 0)
-        return -1;
-
-    envp = ::getenv("SCI_DISABLE_IPV6");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        Socket::setDisableIPv6(1);
-    }
-
-    ExtListener *listener = new ExtListener();
-    listener->start();
-
-    launcherList.clear();
-    while (1) {
-        Locker::getLocker()->freeze();
-
-        log_debug("Delete unused launcher");
-        Locker::getLocker()->lock();
-        vector<ExtLauncher *>::iterator lc;
-        for (lc = launcherList.begin(); lc != launcherList.end(); lc++) {
-            while (!(*lc)->isLaunched()) {
-                // before join, this thread should have been launched
-                SysUtil::sleep(WAIT_INTERVAL);
-            }
-            (*lc)->join();
-            delete (*lc);
-        }
-        launcherList.clear();
-        Locker::getLocker()->unlock();
-
-        log_info("Begin to cleanup the jobInfo");
-        Locker::getLocker()->lock();
-        JOB_INFO::iterator it;
-        for (it = jobInfo.begin(); it != jobInfo.end(); ) {
-            if ((SysUtil::microseconds() - it->second.timestamp) > FIVE_MINUTES) {
-                log_crit("Erase jobInfo item %d", it->first);
-                jobInfo.erase(it++);
-            } else {
-                ++it;
-            }
-        }
-        log_info("Finish cleanup the jobInfo");
-        Locker::getLocker()->unlock();
-    }
-
-    listener->join();
-    delete listener;
-    delete Log::getInstance();
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/sciv1 b/tools/sci/org.eclipse.ptp.sci/scid/sciv1
deleted file mode 100755
index ca99c96..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/sciv1
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/bin/sh
-#
-# chkconfig: 2345 31 41
-# description: Scalable Communication Infrastructure (SCI) Service Daemon
-#
-### BEGIN INIT INFO
-# Provides:          IBM
-# Required-Start:    
-# Should-Start:      
-# Required-Stop:     
-# Should-Stop:       
-# Default-Start:     3 5
-# Default-Stop:      0 1 2 6
-# Short-Description: start/stop/restart scid daemon service
-# Description:       Scalable Communication Infrastructure 
-#	(SCI) Service Daemon, it's a daemon needed when initializing
-#	SCI sessions.
-#	pidfile: /var/run/scidv1.pid
-### END INIT INFO
-
-if [[ -a /etc/redhat-release ]] ; then
-    
-    # Source function library.
-    if [ -f /etc/init.d/functions ] ; then
-        . /etc/init.d/functions
-    elif [ -f /etc/rc.d/init.d/functions ] ; then
-        . /etc/rc.d/init.d/functions
-    else
-        exit 1
-    fi
-
-    # Avoid using root's TMPDIR
-    unset TMPDIR
-
-    RETVAL=0
-
-    start() {
-        KIND="SCI"
-        echo -n $"Starting $KIND services: "
-        daemon scidv1
-        RETVAL=$?
-        echo
-        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sciv1 || \
-            RETVAL=1
-        return $RETVAL
-    }
-
-    stop() {
-        KIND="SCI"
-        echo -n $"Shutting down $KIND services: "
-        killproc scidv1
-        RETVAL=$?
-        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sciv1
-        echo ""
-        return $RETVAL
-    }
-
-    restart() {
-        stop
-        start
-    }
-
-    rhstatus() {
-        status scidv1
-        RETVAL=$?
-        if [ $RETVAL -ne 0 ] ; then
-            return $RETVAL
-        fi
-    }
-
-    # Allow status as non-root.
-    if [ "$1" = status ]; then
-        rhstatus
-        exit $?
-    fi
-
-    case "$1" in
-    start)
-        start
-        ;;
-    stop)
-        stop
-        ;;
-    restart)
-        restart
-        ;;
-    status)
-        rhstatus
-        ;;
-    *)
-        echo $"Usage: $0 {start|stop|restart|status}"
-        exit 2
-    esac
-
-    exit $?
-
-elif [[ -a /etc/SuSE-release ]] ; then
-
-    SCID_BIN="/usr/sbin/scidv1"
-    PID_FILE="/var/run/scidv1.pid"
-    LOG_FILE="/tmp/*.scidv1.log.*"
-
-    . /etc/rc.status
-    rc_reset
-
-    # Check for missing binary
-    if [ ! -x ${SCID_BIN} ]; then
-        echo -n >&2 "SCI daemon, ${SCID_BIN} is not installed. "
-        rc_status -s
-        exit 5
-    fi
-
-    case "$1" in
-    start)
-        echo -n "Starting SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN}
-        case $? in
-            0) echo -n "- Warning: daemon already running. " ;;
-            1) echo -n "- Warning: ${PID_FILE} exists. " ;;
-        esac
-        rm -f ${LOG_FILE} >/dev/null 2>&1
-        startproc -p ${PID_FILE} ${SCID_BIN}
-        rc_status -v
-        ;;
-    stop)
-        echo -n "Shutting down SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN} || \
-            echo -n " Warning: daemon is not running. "
-        killproc -p ${PID_FILE} -t 10 ${SCID_BIN}
-        rc_status -v
-        ;;
-    restart)
-        $0 stop
-        $0 start
-        rc_status
-        ;;
-    status)
-        echo -n "Checking for SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN}
-        rc_status -v
-        ;;
-    *)
-        echo "Usage: $0 {start|stop|restart|status}"
-        exit 1
-        ;;
-    esac
-    rc_exit
-
-elif [[ -d /usr/share/ubuntu-docs ]] ; then
-
-    test -f /usr/sbin/scidv1 || exit 0
-
-    . /lib/lsb/init-functions
-
-    case "$1" in
-    start)  
-        log_begin_msg "Starting SCI service daemon..."
-        start-stop-daemon --start --quiet --pidfile /var/run/scidv1.pid --name scidv1 --startas /usr/sbin/scidv1
-        log_end_msg $?
-        ;;
-    stop)   
-        log_begin_msg "Stopping SCI service daemon..."
-        start-stop-daemon --stop --quiet --pidfile /var/run/scidv1.pid --name scidv1
-        log_end_msg $?
-        ;;
-    restart) 
-        log_begin_msg "Restarting SCI service daemon..."
-        start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/scidv1.pid --name scidv1
-        start-stop-daemon --start --quiet --pidfile /var/run/scidv1.pid --name sci --startas /usr/sbin/scidv1
-        log_end_msg $?
-        ;;
-    *) 
-        log_success_msg "Usage: $0 start|stop|restart"
-        exit 1 
-        ;;
-    esac
-    exit 0
-
-else
-    
-    echo "Error: requires Redhat, SUSE or Ubuntu"
-    exit 1
-    
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/.cvsignore b/tools/sci/org.eclipse.ptp.sci/secmod/.cvsignore
deleted file mode 100644
index bd5fe06..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-.deps
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.am b/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.am
deleted file mode 100644
index f9f279a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-if SYSTEM_AIX
-lib_LIBRARIES = libpsec.a
-
-PSEC_CFLAGS = -g -O0 -D_GNU_SOURCE -U_TRACE -U_DEBUG_IOLIST -U_DEBUG_RDWR -U_DEBUG_ATOM \
-              -U_CHECK_MEM_LEAK -U_TRACE_RESPONDER_DELAY -U_TRACE_IO_OP -D_FILE_OFFSET_BITS=64 \
-              -D_UTE_TRACE -U_TRACE_IO_FLOW -UUSE_MIO -U_MEM_HW -D_CC_SHARED_LOCK -U_ENABLE_CC_ASSERT -qmkshrobj -I../
-libpsec.a : shr_64.o shr.o libpsec_ossh.so libpsec_ossh64.so
-	$(AR) -X32_64 -rv $@ shr_64.o shr.o
-
-shr_64.o : psec.64o psec_utils.64o
-	$(CC) -q64 $(PSEC_CFLAGS) -o $@ $^
-
-shr.o : psec.o psec_utils.o
-	$(CC) -q32 $(PSEC_CFLAGS) -o $@ $^
-
-%.o: %.c 
-	$(CC) -q32 -c $(PSEC_CFLAGS) -o $@ $< 
-
-%.64o: %.c
-	$(CC) -q64 -c $(PSEC_CFLAGS) -o $@ $< 
-
-libpsec_ossh.so : psec_openssh.c
-	$(CC) -q32 -g -O0 $(PSEC_CFLAGS) -o $@ $^ -lcrypto
-
-libpsec_ossh64.so : psec_openssh.c
-	$(CC) -q64 -g -O0 $(PSEC_CFLAGS) -o $@ $^ -lcrypto
-
-install-exec-hook:
-	cp *.so /usr/lib
-
-clean-hook:
-	rm -f *.a *.so
-
-else
-lib_LTLIBRARIES = libpsec.la libpsec_ossh.la
-libpsec_la_SOURCES = psec.c psec_utils.c 
-libpsec_ossh_la_SOURCES = psec_openssh.c
-libpsec_la_CFLAGS = $(PSEC_CFLAGS)
-libpsec_ossh_la_CFLAGS = $(PSEC_CFLAGS)
-install-exec-hook:
-	-ln -sf $(libdir)/libpsec.so /usr/`basename $(libdir)`/libpsec.so
-	-ln -sf $(libdir)/libpsec_ossh.so /usr/`basename $(libdir)`/libpsec_ossh.so
-uninstall-hook:
-	-unlink /usr/`basename $(libdir)`/libsci.so
-	-unlink /usr/`basename $(libdir)`/libsci_ossh.so
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.in b/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.in
deleted file mode 100644
index 99dedb8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/Makefile.in
+++ /dev/null
@@ -1,645 +0,0 @@
-# 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@
-subdir = secmod
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-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'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libdir)"
-LIBRARIES = $(lib_LIBRARIES)
-ARFLAGS = cru
-libpsec_a_AR = $(AR) $(ARFLAGS)
-libpsec_a_LIBADD =
-libpsec_a_SOURCES = libpsec.c
-libpsec_a_OBJECTS = libpsec.$(OBJEXT)
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libpsec_la_LIBADD =
-am__libpsec_la_SOURCES_DIST = psec.c psec_utils.c
-@SYSTEM_AIX_FALSE@am_libpsec_la_OBJECTS = libpsec_la-psec.lo \
-@SYSTEM_AIX_FALSE@	libpsec_la-psec_utils.lo
-libpsec_la_OBJECTS = $(am_libpsec_la_OBJECTS)
-libpsec_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpsec_la_CFLAGS) \
-	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-@SYSTEM_AIX_FALSE@am_libpsec_la_rpath = -rpath $(libdir)
-libpsec_ossh_la_LIBADD =
-am__libpsec_ossh_la_SOURCES_DIST = psec_openssh.c
-@SYSTEM_AIX_FALSE@am_libpsec_ossh_la_OBJECTS =  \
-@SYSTEM_AIX_FALSE@	libpsec_ossh_la-psec_openssh.lo
-libpsec_ossh_la_OBJECTS = $(am_libpsec_ossh_la_OBJECTS)
-libpsec_ossh_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpsec_ossh_la_CFLAGS) \
-	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-@SYSTEM_AIX_FALSE@am_libpsec_ossh_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-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 = libpsec.c $(libpsec_la_SOURCES) $(libpsec_ossh_la_SOURCES)
-DIST_SOURCES = libpsec.c $(am__libpsec_la_SOURCES_DIST) \
-	$(am__libpsec_ossh_la_SOURCES_DIST)
-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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-@SYSTEM_AIX_TRUE@lib_LIBRARIES = libpsec.a
-@SYSTEM_AIX_TRUE@PSEC_CFLAGS = -g -O0 -D_GNU_SOURCE -U_TRACE -U_DEBUG_IOLIST -U_DEBUG_RDWR -U_DEBUG_ATOM \
-@SYSTEM_AIX_TRUE@              -U_CHECK_MEM_LEAK -U_TRACE_RESPONDER_DELAY -U_TRACE_IO_OP -D_FILE_OFFSET_BITS=64 \
-@SYSTEM_AIX_TRUE@              -D_UTE_TRACE -U_TRACE_IO_FLOW -UUSE_MIO -U_MEM_HW -D_CC_SHARED_LOCK -U_ENABLE_CC_ASSERT -qmkshrobj -I../
-
-@SYSTEM_AIX_FALSE@lib_LTLIBRARIES = libpsec.la libpsec_ossh.la
-@SYSTEM_AIX_FALSE@libpsec_la_SOURCES = psec.c psec_utils.c 
-@SYSTEM_AIX_FALSE@libpsec_ossh_la_SOURCES = psec_openssh.c
-@SYSTEM_AIX_FALSE@libpsec_la_CFLAGS = $(PSEC_CFLAGS)
-@SYSTEM_AIX_FALSE@libpsec_ossh_la_CFLAGS = $(PSEC_CFLAGS)
-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) --gnu secmod/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu secmod/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):
-install-libLIBRARIES: $(lib_LIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
-	@$(POST_INSTALL)
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  if test -f $$p; then \
-	    $(am__strip_dir) \
-	    echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \
-	    ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \
-	  else :; fi; \
-	done
-
-uninstall-libLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \
-	cd "$(DESTDIR)$(libdir)" && rm -f $$files
-
-clean-libLIBRARIES:
-	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-@SYSTEM_AIX_FALSE@libpsec.a: $(libpsec_a_OBJECTS) $(libpsec_a_DEPENDENCIES) 
-@SYSTEM_AIX_FALSE@	-rm -f libpsec.a
-@SYSTEM_AIX_FALSE@	$(libpsec_a_AR) libpsec.a $(libpsec_a_OBJECTS) $(libpsec_a_LIBADD)
-@SYSTEM_AIX_FALSE@	$(RANLIB) libpsec.a
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_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
-libpsec.la: $(libpsec_la_OBJECTS) $(libpsec_la_DEPENDENCIES) 
-	$(libpsec_la_LINK) $(am_libpsec_la_rpath) $(libpsec_la_OBJECTS) $(libpsec_la_LIBADD) $(LIBS)
-libpsec_ossh.la: $(libpsec_ossh_la_OBJECTS) $(libpsec_ossh_la_DEPENDENCIES) 
-	$(libpsec_ossh_la_LINK) $(am_libpsec_ossh_la_rpath) $(libpsec_ossh_la_OBJECTS) $(libpsec_ossh_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpsec.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpsec_la-psec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpsec_la-psec_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpsec_ossh_la-psec_openssh.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libpsec_la-psec.lo: psec.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_la_CFLAGS) $(CFLAGS) -MT libpsec_la-psec.lo -MD -MP -MF $(DEPDIR)/libpsec_la-psec.Tpo -c -o libpsec_la-psec.lo `test -f 'psec.c' || echo '$(srcdir)/'`psec.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libpsec_la-psec.Tpo $(DEPDIR)/libpsec_la-psec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='psec.c' object='libpsec_la-psec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_la_CFLAGS) $(CFLAGS) -c -o libpsec_la-psec.lo `test -f 'psec.c' || echo '$(srcdir)/'`psec.c
-
-libpsec_la-psec_utils.lo: psec_utils.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_la_CFLAGS) $(CFLAGS) -MT libpsec_la-psec_utils.lo -MD -MP -MF $(DEPDIR)/libpsec_la-psec_utils.Tpo -c -o libpsec_la-psec_utils.lo `test -f 'psec_utils.c' || echo '$(srcdir)/'`psec_utils.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libpsec_la-psec_utils.Tpo $(DEPDIR)/libpsec_la-psec_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='psec_utils.c' object='libpsec_la-psec_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_la_CFLAGS) $(CFLAGS) -c -o libpsec_la-psec_utils.lo `test -f 'psec_utils.c' || echo '$(srcdir)/'`psec_utils.c
-
-libpsec_ossh_la-psec_openssh.lo: psec_openssh.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_ossh_la_CFLAGS) $(CFLAGS) -MT libpsec_ossh_la-psec_openssh.lo -MD -MP -MF $(DEPDIR)/libpsec_ossh_la-psec_openssh.Tpo -c -o libpsec_ossh_la-psec_openssh.lo `test -f 'psec_openssh.c' || echo '$(srcdir)/'`psec_openssh.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libpsec_ossh_la-psec_openssh.Tpo $(DEPDIR)/libpsec_ossh_la-psec_openssh.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='psec_openssh.c' object='libpsec_ossh_la-psec_openssh.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpsec_ossh_la_CFLAGS) $(CFLAGS) -c -o libpsec_ossh_la-psec_openssh.lo `test -f 'psec_openssh.c' || echo '$(srcdir)/'`psec_openssh.c
-
-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 $(LIBRARIES) $(LTLIBRARIES)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-@SYSTEM_AIX_TRUE@uninstall-hook:
-clean: clean-am
-
-clean-am: clean-generic clean-libLIBRARIES clean-libLTLIBRARIES \
-	clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-libLIBRARIES install-libLTLIBRARIES
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
-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 -rf ./$(DEPDIR)
-	-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: uninstall-libLIBRARIES uninstall-libLTLIBRARIES
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-.MAKE: install-am install-exec-am install-strip uninstall-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLIBRARIES clean-libLTLIBRARIES clean-libtool ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool 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-exec-hook install-html install-html-am \
-	install-info install-info-am install-libLIBRARIES \
-	install-libLTLIBRARIES 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 uninstall-hook \
-	uninstall-libLIBRARIES uninstall-libLTLIBRARIES
-
-@SYSTEM_AIX_TRUE@libpsec.a : shr_64.o shr.o libpsec_ossh.so libpsec_ossh64.so
-@SYSTEM_AIX_TRUE@	$(AR) -X32_64 -rv $@ shr_64.o shr.o
-
-@SYSTEM_AIX_TRUE@shr_64.o : psec.64o psec_utils.64o
-@SYSTEM_AIX_TRUE@	$(CC) -q64 $(PSEC_CFLAGS) -o $@ $^
-
-@SYSTEM_AIX_TRUE@shr.o : psec.o psec_utils.o
-@SYSTEM_AIX_TRUE@	$(CC) -q32 $(PSEC_CFLAGS) -o $@ $^
-
-@SYSTEM_AIX_TRUE@%.o: %.c 
-@SYSTEM_AIX_TRUE@	$(CC) -q32 -c $(PSEC_CFLAGS) -o $@ $< 
-
-@SYSTEM_AIX_TRUE@%.64o: %.c
-@SYSTEM_AIX_TRUE@	$(CC) -q64 -c $(PSEC_CFLAGS) -o $@ $< 
-
-@SYSTEM_AIX_TRUE@libpsec_ossh.so : psec_openssh.c
-@SYSTEM_AIX_TRUE@	$(CC) -q32 -g -O0 $(PSEC_CFLAGS) -o $@ $^ -lcrypto
-
-@SYSTEM_AIX_TRUE@libpsec_ossh64.so : psec_openssh.c
-@SYSTEM_AIX_TRUE@	$(CC) -q64 -g -O0 $(PSEC_CFLAGS) -o $@ $^ -lcrypto
-
-@SYSTEM_AIX_TRUE@install-exec-hook:
-@SYSTEM_AIX_TRUE@	cp *.so /usr/lib
-
-@SYSTEM_AIX_TRUE@clean-hook:
-@SYSTEM_AIX_TRUE@	rm -f *.a *.so
-@SYSTEM_AIX_FALSE@install-exec-hook:
-@SYSTEM_AIX_FALSE@	-ln -sf $(libdir)/libpsec.so /usr/`basename $(libdir)`/libpsec.so
-@SYSTEM_AIX_FALSE@	-ln -sf $(libdir)/libpsec_ossh.so /usr/`basename $(libdir)`/libpsec_ossh.so
-@SYSTEM_AIX_FALSE@uninstall-hook:
-@SYSTEM_AIX_FALSE@	-unlink /usr/`basename $(libdir)`/libsci.so
-@SYSTEM_AIX_FALSE@	-unlink /usr/`basename $(libdir)`/libsci_ossh.so
-
-# 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/tools/sci/org.eclipse.ptp.sci/secmod/psec.c b/tools/sci/org.eclipse.ptp.sci/secmod/psec.c
deleted file mode 100644
index 3c57f6d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec.c
+++ /dev/null
@@ -1,676 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-#include <pthread.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "psec.h"
-#include "psec_lib.h"
-#include "psec_mod.h"
-
-char *_psec_rtne_list[PSM_SYMTBLE_SIZE] = {
-#define PSM__INIT 0
-	"psm__init",
-#define PSM__CLEANUP 1
-	"psm__cleanup",
-#define PSM__GET_ID_TOKEN 2
-	"psm__get_id_token",
-#define PSM__VERIFY_ID_TOKEN 3
-	"psm__verify_id_token",
-#define PSM__GET_ID_FROM_TOKEN 4
-	"psm__get_id_from_token",
-#define PSM__FREE_ID_TOKEN 5
-	"psm__free_id_token",
-#define PSM__GET_KEY_FROM_TOKEN 6
-	"psm__get_key_from_token",
-#define PSM__SIGN_DATA 7
-	"psm__sign_data",
-#define PSM__VERIFY_DATA 8
-	"psm__verify_data",
-#define PSM__FREE_SIGNATURE 9
-	"psm__free_signature"};
-
-
-_psec_state_desc _PSEC_STATE = {0, PTHREAD_MUTEX_INITIALIZER, 0, NULL, NULL};
-
-int
-_psec_load_auth_module(
-	_psec_module_t psmp)
-{
-	int rc = 0;
-do {
-	if (!psmp) {
-		// printf("Error [%s:d]: internal error: invalid auth module_pinter\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_PTR_ERR; break;
-	}
-	pthread_mutex_lock(&psmp->psm_mutex);
-	pthread_cleanup_push((void(*)(void *))pthread_mutex_unlock, (void *)&psmp->psm_mutex);
-do {
-	if (PSM_STATE_INITED&psmp->psm_stindex) break;  // already init'ed
-do {
-	if (PSM_STATE_LOADED&psmp->psm_stindex) break;	// already loaded
-	if (!psmp->psm_fpath) {
-		// printf("Error [%s:%d]: internal error: invalid module file path (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-		rc = PSEC_MODULE_PATH_ERR; break;
-	}
-	if (!(psmp->psm_object = dlopen(psmp->psm_fpath, RTLD_NOW))) {
-		// char *errmsg = dlerror();
-		// printf("Error [%s:%d]: dlopen() failed: %s\n", __FILE__, __LINE__, errmsg?errmsg:"<no error message>");
-		rc = PSEC_DLOPEN_ERR; break;
-	}
-do {
-	// resolve all the symbols
-	int i; for (i=0; i<PSM_SYMTBLE_SIZE; i++) {
-		if (!(psmp->psm_symtble[i] = dlsym(psmp->psm_object, _psec_rtne_list[i]))) {
-			// char *errmsg = dlerror();
-			// printf("Error [%s:%d]: dlsym() failed: %s\n", __FILE__, __LINE__, errmsg?errmsg:"<no error message>");
-			if (i<6) rc = PSEC_DLSYM_ERR+i;
-			break;
-		}
-	}
-	if (rc) {
-		memset(psmp->psm_symtble, 0, sizeof(psmp->psm_symtble));
-		break;
-	}
-} while (0);
-	if (rc) {
-		dlclose(psmp->psm_object); psmp->psm_object = NULL;
-		break;
-	}
-	psmp->psm_stindex |= PSM_STATE_LOADED;
-} while (0);
-	if (rc) break;
-	pthread_cleanup_push((void (*)(void *))(psmp->psm_symtble[PSM__CLEANUP]), NULL);
-do {
-	// call the module's initialization routine
-	if (rc = ((int(*)())psmp->psm_symtble[PSM__INIT])(psmp->psm_opts)) {
-		((void (*)())psmp->psm_symtble[PSM__CLEANUP])();
-		// printf("Error [%s:%d]: init failed w/rc = %d for module %s\n", __FILE__, __LINE__, rc, psmp->psm_fpath);
-		rc = PSEC_MODULE_INIT_ERR; break;
-	}
-	psmp->psm_stindex |= PSM_STATE_INITED;
-} while (0);
-	pthread_cleanup_pop(0);
-}  while (0);
-	pthread_cleanup_pop(1);
-} while (0);
-	return rc;
-}
-
-int
-psec_set_auth_module(
-	char *name,
-	char *fpath,
-	char *opts,
-	unsigned int *mdlhndl)
-{
-	int rc = 0, tmdlhndl;
-do {
-	// check arguments
-	if (!fpath) { rc = PSEC_ARGS_ERR; break; }
-	if ('/'!=fpath[0]) { rc = PSEC_MODULE_PATH_ERR; break; }
-{
-	struct stat amsbuf = {0};
-	if (0>stat(fpath, &amsbuf)) {
-		// printf("Error [%s:%d]: stat() failed w/errno = %d for %s\n", __FILE__, __LINE__, errno, fpath);
-		rc = PSEC_MODULE_FILE_ERR; break;
-	}
-	if (!S_ISREG(amsbuf.st_mode)) { rc = PSEC_MODULE_IREG_ERR; break; }
-	if (0==amsbuf.st_size) { rc = PSEC_MODULE_SIZE_ERR; break; }
-}
-{	// get the mutex lock and load the authentication module 
-	_psec_module_t psmp = NULL;
-	pthread_mutex_lock(&_PSEC_STATE.pss_mutex);
-	pthread_cleanup_push((void(*)(void *))pthread_mutex_unlock, &_PSEC_STATE.pss_mutex);
-do {
-	// search for an existing entry
-	psmp = _PSEC_STATE.pss_modules;
-	while (psmp) {
-		if (!strcmp(psmp->psm_fpath, fpath)) break;
-		psmp = psmp->next;
-	}
-	if (psmp) break;		// module data already allocated
-	// allocate memory for the module's internal data structure
-	psmp = malloc(sizeof(_psec_module_sec));
-	if (!psmp) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = PSEC_MEMORY_ERR; break;
-	}
-do {
-	memset(psmp, 0, sizeof(*psmp));
-	if (rc = pthread_mutex_init(&psmp->psm_mutex, NULL)) {
-		// printf("Error [%s:%d]: pthread_mutex_init() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = PSEC_MUTEX_INIT_ERR; break;
-	}
-do {
-	if (!(psmp->psm_fpath = strdup(fpath))) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = PSEC_MEMORY2_ERR; break;
-	}
-do {
-	if (name&&!(psmp->psm_name = strdup(name))) {
-		// printf("Error [%s:%d] strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = PSEC_MEMORY3_ERR; break;
-	}
-do {
-do {	// translate options
-	// options are a list of comma separated characters (no spaces allowed);
-	// options can have values within square brackets, immediately
-	// following the character identifying the option.
-	// one important optiom is 'm' and it defines the options that the
-	// shared library will pass to the auth module's init function
-	// if there is no value to this option, the auth module's init function
-	// will get a NULL pointer
-	char *cp = opts;
-	if (!cp||('\0'==*cp)) break;
-	do {
-		switch (*cp) {
-			case 'm': case 'M':
-				if (psmp->psm_opts) {
-					// printf("Error [%s:%d]: module options can be specified only once\n", __FILE__, __LINE__);
-					rc = PSEC_MODULE_OPTS_ERR; break;
-				}
-				if (('\0'==*++cp)||('['!=*cp)) break;		// no value
-{				// find the end of module options string
-				char *endcp = cp++;
-				while (*++endcp) {
-					int noofbkslshs = 0;
-					if (!(endcp = strchr(endcp, ']'))) {
-						// printf("Error [%s:%d]: no closing bracket in module options\n", __FILE__, __LINE__);
-						rc = PSEC_MODULE_OPTS2_ERR; break;
-					}
-{					// check whether quote is back-slashed
-					char *tcp = endcp;
-					while ('\\' == *--tcp) noofbkslshs++;
-}
-					if (0==noofbkslshs%2) break; // non-back-slashed quote
-				}
-				if (0<endcp-cp) {
-					if (!(psmp->psm_opts = calloc(endcp-cp+1, sizeof(char)))) {
-						// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-						rc = PSEC_MEMORY4_ERR; break;
-					}
-					strncpy(psmp->psm_opts, cp, endcp-cp);
-				}
-				cp = endcp;
-}
-				break;
-			default:
-				// ignore unknown options
-				break;
-		}
-		if (rc) break;
-	} while (*++cp);
-} while (0);
-	if (rc) break;
-{	// add the module's data structure to the list
-	_psec_module_t *tmdlslist = NULL;
-	if (!(tmdlslist = realloc(_PSEC_STATE.pss_mdlslist, (_PSEC_STATE.pss_modcnt+1)*sizeof(_psec_module_t)))) {
-		// printf("Error [%s:%d]: realloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = PSEC_MEMORY5_ERR; break;
-	}
-	_PSEC_STATE.pss_mdlslist = tmdlslist;
-}
-	_PSEC_STATE.pss_mdlslist[_PSEC_STATE.pss_modcnt++] = psmp;
-	psmp->psm_stindex = (0xffff&_PSEC_STATE.pss_modcnt)<<16;
-	__add_elem_to_dllist((__dlink_elem_t)psmp, (__dlink_elem_t *)&_PSEC_STATE.pss_modules);
-} while (0);
-	if (rc&&psmp->psm_opts) free(psmp->psm_opts);
-	if (rc&&psmp->psm_name) free(psmp->psm_name);
-} while (0);
-	if (rc) free(psmp->psm_fpath);
-} while (0);
-	if (rc) pthread_mutex_destroy(&psmp->psm_mutex);
-} while (0);
-	if (rc) free(psmp);
-} while (0);
-	pthread_cleanup_pop(1);
-	if (rc) break;
-	tmdlhndl = (0xffff0000&psmp->psm_stindex)>>16;
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-}
-	*mdlhndl = tmdlhndl;
-} while (0);
-	return rc;
-}
-
-int
-psec_get_id_token(
-	unsigned int mdlhndl,
-	char *tname,
-	char *thost,
-	psec_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id token argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// call the module's routine
-	if (rc = ((int(*)(char*, char *, psec_idbuf_t))psmp->psm_symtble[PSM__GET_ID_TOKEN])(tname, thost, idtok)) {
-		// printf("Error [%s:%d]: auth module's get_id_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_verify_id_token(
-	unsigned int mdlhndl,
-	char *uname,
-	psec_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id token argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong 
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// call the module's routine
-	if (rc = ((int(*)(char *, psec_idbuf_t))psmp->psm_symtble[PSM__VERIFY_ID_TOKEN])(uname, idtok)) {
-		// printf("Error [%s:%d]: auth module's verify_id_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_get_id_from_token(
-	unsigned int mdlhndl,
-	psec_idbuf_t idtok,
-	char *usrid,
-	size_t *usridlen)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id token argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	if (!usridlen) {
-		// printf("Error [%s:%d]: invalid id length argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS3_ERR; break;
-	}
-	if ((0!=*usridlen)&&(!usrid)) {
-		// printf("Error [%s:%d]: invalid id argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS2_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// call the module's routine
-	if (rc = ((int(*)(psec_idbuf_t, char*, size_t *))psmp->psm_symtble[PSM__GET_ID_FROM_TOKEN])(idtok, usrid, usridlen)) {
-		// printf("Error [%s:%d]: auth module's get_id_from_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		if (PSM__MEMORY_ERR == rc) { rc = PSEC_MEMORY_ERR; break; }
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_get_key_from_token(
-	unsigned int mdlhndl,
-	char *uname,
-	psec_idbuf_t idtok,
-	char *key,
-	size_t *keylen)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id token argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	if (!keylen) {
-		// printf("Error [%s:%d]: invalid key length argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS3_ERR; break;
-	}
-	if ((0!=*keylen)&&(!key)) {
-		// printf("Error [%s:%d]: invalid key argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS2_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// check whether routine supported by authentication module
-	if (!psmp->psm_symtble[PSM__GET_KEY_FROM_TOKEN]) {
-		// printf("Error [%s:%d]: function not supported\n", __FILE__, __LINE__);
-		rc = PSEC_NOT_SUPPORTED_ERR; break;
-	}
-	// call the module's routine
-	if (rc = ((int(*)(char *, psec_idbuf_t, char *, size_t *))psmp->psm_symtble[PSM__GET_KEY_FROM_TOKEN])(uname, idtok, key, keylen)) {
-		// printf("Error [%s:%d]: auth module's get_key_from_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		if (PSM__MEMORY_ERR == rc) { rc = PSEC_MEMORY_ERR; break; }
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_sign_data(
-	unsigned int mdlhndl,
-	char *key,
-	size_t keylen,
-	struct iovec *in,
-	int cnt,
-	struct iovec *signature)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!key) {
-		// printf("Error [%s:%d]: invalid key argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	if (0==keylen) {
-		// printf("Error [%s:%d]: invalid key length argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS2_ERR; break;
-	}
-	if ((NULL==in)||(0==in->iov_len)||(NULL==in->iov_base)) {
-		// printf("Error [%s:%d]: invalid input data argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS3_ERR; break;
-	}
-	if (NULL==signature) {
-		// printf("Error [%s:%d]: invalid signature argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS4_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// check whether routine is supported by authentication module
-	if (!psmp->psm_symtble[PSM__SIGN_DATA]) {
-		// printf("Error [%s:%d]: function not supported\n", __FILE__, __LINE__);
-		rc = PSEC_NOT_SUPPORTED_ERR; break;
-	}
-	// call the module's routine
-	if (rc = ((int(*)(char*, size_t, struct iovec*, int, struct iovec*))psmp->psm_symtble[PSM__SIGN_DATA])(key, keylen, in, cnt, signature)) {
-		// printf("Error [%s:%d]: auth module's sign_data() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		if (PSM__MEMORY_ERR == rc) { rc = PSEC_MEMORY_ERR; break; }
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_verify_data(
-	unsigned int mdlhndl,
-	char *key,
-	size_t keylen,
-	struct iovec *in,
-	int cnt,
-	struct iovec *signature)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!key) {
-		// printf("Error [%s:%d]: invalid key argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	if (0==keylen) {
-		// printf("Error [%s:%d]: invalid key length argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS2_ERR; break;
-	}
-	if ((NULL==in)||(0==cnt)) {
-		// printf("Error [%s:%d]: invalid input data argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS3_ERR; break;
-	}
-	if ((NULL==signature)||(0==signature->iov_len)||(NULL==signature->iov_base)) {
-		// printf("Error [%s:%d]: invalid signature argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS4_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// check whether routine is supported by authentication module
-	if (!psmp->psm_symtble[PSM__VERIFY_DATA]) {
-		// printf("Error [%s:%d]: function not supported\n", __FILE__, __LINE__);
-		rc = PSEC_NOT_SUPPORTED_ERR; break;
-	}
-	// call the module's routine
-	if (rc = ((int(*)(char*, size_t, struct iovec*, int, struct iovec*))psmp->psm_symtble[PSM__VERIFY_DATA])(key, keylen, in, cnt, signature)) {
-		// printf("Error [%s:%d]: auth module's verify_data() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		if (PSM__MEMORY_ERR == rc) { rc = PSEC_MEMORY_ERR; break; }
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-
-}
-
-int
-psec_free_id_token(
-	unsigned int mdlhndl,
-	psec_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id token argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// call the module's routine
-	if (rc = ((int(*)(psec_idbuf_t))psmp->psm_symtble[PSM__FREE_ID_TOKEN])(idtok)) {
-		// printf("Error [%s:%d]: auth module's free_id_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-int
-psec_free_signature(
-	unsigned int mdlhndl,
-	struct iovec *signature)
-{
-	int rc = 0;
-do {
-	// check arguments
-	if (!signature) {
-		// printf("Error [%s:%d]: invalid signature argument\n", __FILE__, __LINE__);
-		rc = PSEC_ARGS_ERR; break;
-	}
-	// find the authentication module by handle
-	if ((1>mdlhndl)||(_PSEC_STATE.pss_modcnt<mdlhndl)) {
-		// printf("Error [%s:%d]: invalid module handle\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL_ERR; break;
-	}
-{
-	_psec_module_t psmp = _PSEC_STATE.pss_mdlslist[mdlhndl-1];
-	if (!psmp||(mdlhndl!=((0xfff000&psmp->psm_stindex)>>16))) {
-		// this should not happen, something went very wrong
-		// printf("Error [%s:%d]: internal failure: no auth module\n", __FILE__, __LINE__);
-		rc = PSEC_MODULE_HNDL2_ERR; break;
-	}
-	// check the module's state
-	if (!(PSM_STATE_INITED&psmp->psm_stindex)) {
-		if (rc = _psec_load_auth_module(psmp)) {
-			// printf("Error [%s:%d]: failed to load and init auth module (%s)\n", __FILE__, __LINE__, psmp->psm_fpath);
-			break;
-		}
-	}
-	// check whether routine is supported by authentication module
-	if (!psmp->psm_symtble[PSM__FREE_SIGNATURE]) {
-		// printf("Error [%s:%d]: function not supported\n", __FILE__, __LINE__);
-		rc = PSEC_NOT_SUPPORTED_ERR; break;
-	}
-	// call the module's routine
-	if (rc = ((int(*)(psec_idbuf_t))psmp->psm_symtble[PSM__FREE_SIGNATURE])(signature)) {
-		// printf("Error [%s:%d]: auth module's free_id_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = PSEC_MODULE_INTERNAL_ERR; break;
-	}
-}
-} while (0);
-	return rc;
-}
-
-// EOF
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec.h b/tools/sci/org.eclipse.ptp.sci/secmod/psec.h
deleted file mode 100644
index 1b87a8a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec.h
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-#include <stdlib.h>
-#include <sys/uio.h>
-
-#ifndef _H_PSEC_H
-#define _H_PSEC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define PSEC_MEMORY_ERR 1
-#define PSEC_MEMORY2_ERR 2
-#define PSEC_MEMORY3_ERR 3
-#define PSEC_MEMORY4_ERR 4
-#define PSEC_MEMORY5_ERR 5
-#define PSEC_ARGS_ERR 11
-#define PSEC_ARGS2_ERR 12
-#define PSEC_ARGS3_ERR 13
-#define PSEC_ARGS4_ERR 14
-#define PSEC_INTERNAL_ERR 20
-#define PSEC_MUTEX_INIT_ERR 30
-#define PSEC_MODULE_PTR_ERR 101
-#define PSEC_MODULE_PATH_ERR 102
-#define PSEC_MODULE_FILE_ERR 103
-#define PSEC_MODULE_IREG_ERR 104
-#define PSEC_MODULE_SIZE_ERR 105
-#define PSEC_MODULE_INIT_ERR 106
-#define PSEC_MODULE_OPTS_ERR 107
-#define PSEC_MODULE_OPTS2_ERR 108
-#define PSEC_MODULE_INTERNAL_ERR 109
-#define PSEC_MODULE_HNDL_ERR 111
-#define PSEC_MODULE_HNDL2_ERR 112
-#define PSEC_DLOPEN_ERR 120
-#define PSEC_DLSYM_ERR 121
-#define PSEC_DLSYM2_ERR 122
-#define PSEC_DLSYM3_ERR 123
-#define PSEC_DLSYM4_ERR 124
-#define PSEC_DLSYM5_ERR 125
-#define PSEC_DLSYM6_ERR 126
-#define PSEC_NOT_SUPPORTED_ERR 150
-
-typedef struct iovec psec_idbuf_desc, *psec_idbuf_t;
-
-int
-psec_set_auth_module(		/* sets the authentication module params */
-	char *,					/* mnemonic--can be NULL */
-	char *,					/* file full path name */
-	char *,					/* flags--can be NULL */
-	unsigned int *);		/* return handle to the authentication method */
-
-int
-psec_get_id_token(			/* get a client's identity token */
-	unsigned int,			/* handle to the authentication method */
-	char *,					/* target user identity */
-	char *,					/* target host name */
-	psec_idbuf_t);			/* address of identity buffer descriptor */
-
-int
-psec_verify_id_token(		/* verifies a client's identity token */
-	unsigned int,			/* handle to the authentication method */
-	char *,					/* name of target user */
-	psec_idbuf_t);			/* address of identity buffer descriptor */
-
-int
-psec_get_id_from_token(		/* returns a client's identity */
-	unsigned int,			/* handle to the authentication method */
-	psec_idbuf_t,			/* address of id token descriptor */
-	char *,					/* memory for id string */
-	size_t *);				/* provided/required length of id string */
-
-int
-psec_free_id_token(			/* frees memory allocated for id token */
-	unsigned int,			/* handle to the authentication method */
-	psec_idbuf_t);			/* address of id token descriptor */
-
-int
-psec_get_key_from_token(	/* returns session key from id token */
-	unsigned int,			/* handle to the authentication method */
-	char *,					/* name of target user */
-	psec_idbuf_t,			/* address of identity buffer descriptor */
-	char *,					/* memory for key data */
-	size_t *);				/* provided/required length of key data */
-
-int
-psec_sign_data(				/* sign data */
-	unsigned int,			/* handle to the authentication method */
-	char *,					/* key data */
-	size_t,					/* length of key data */
-	struct iovec *,			/* address of input data vector */
-	int,					/* number of vectors */
-	struct iovec *);		/* address of signature buffer */
-
-int
-psec_verify_data(			/* verify signature */
-	unsigned int,			/* handle to the authentication method */
-	char *,					/* key data */
-	size_t,					/* length of key data */
-	struct iovec *,			/* address of input data vector */
-	int,					/* number of vectors */
-	struct iovec *);		/* address of signature buffer */
-
-int
-psec_free_signature(		/* frees memory allocated for signature */
-	unsigned int,			/* handle to the authentication method */
-	struct iovec *);		/* address of signature buffer */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	// _H_PSEC_H
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_lib.h b/tools/sci/org.eclipse.ptp.sci/secmod/psec_lib.h
deleted file mode 100644
index 10be887..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_lib.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-
-#include <pthread.h>
-
-typedef struct __dlink_elem_s {
-	struct __dlink_elem_s *prev;
-	struct __dlink_elem_s *next;
-} __dlink_elem_desc, *__dlink_elem_t;
-
-void __rm_elem_from_dllist(__dlink_elem_t, __dlink_elem_t *);
-void __add_elem_to_dllist(__dlink_elem_t, __dlink_elem_t *);
-void __insert_elem_before_dllist(__dlink_elem_t, __dlink_elem_t *);
-
-typedef struct _psec_module {
-	struct _psec_module *prev;
-	struct _psec_module *next;
-	unsigned int psm_flags;
-	unsigned int psm_stindex;
-#define PSM_STATE_MASK 0x0000ffff
-#define PSM_STATE_LOADED 0x0001
-#define PSM_STATE_INITED 0x0002
-	char *psm_opts;
-	char *psm_name;
-	char *psm_fpath;
-	void *psm_object;
-#define PSM_SYMTBLE_SIZE 10
-	void *psm_symtble[PSM_SYMTBLE_SIZE];
-	pthread_mutex_t psm_mutex;
-} _psec_module_sec, *_psec_module_t;
-
-typedef struct _psec_state {
-	unsigned int pss_state;
-	pthread_mutex_t pss_mutex;
-	int pss_modcnt;
-	_psec_module_t *pss_mdlslist;
-	_psec_module_t pss_modules;
-} _psec_state_desc, *_psec_state_t;
-
-extern _psec_state_desc _PSEC_STATE;
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_mod.h b/tools/sci/org.eclipse.ptp.sci/secmod/psec_mod.h
deleted file mode 100644
index b373271..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_mod.h
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-#include <stdlib.h>
-#include <sys/uio.h>
-
-#ifndef _H_PSM_H
-#define _H_PSM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct iovec psm_idbuf_desc, *psm_idbuf_t;
-
-#define PSM__SUCCESS 0
-#define PSM__MEMORY_ERR 1
-
-int
-psm__init(				/* one time initialization of the module */
-	char *);			/* options */
-
-int
-psm__get_id_token(		/* gets a client's identity token */
-	char *,				/* target user identity */
-	char *,				/* tartet host name */
-	psm_idbuf_t);		/* address of identity buffer descriptor */
-
-int
-psm__verify_id_token(	/* verifies a client's identity token */
-	char *,				/* name of user to authorize as */
-	psm_idbuf_t);		/* address of identity buffer descriptor */
-
-int
-psm__get_id_from_token(	/* returns a client's identity */
-	psm_idbuf_t,		/* address of identity buffer descriptor */
-	char *,				/* memory for id string */
-	size_t *);			/* provided/required length of the id string */
-
-int
-psm__free_id_token(		/* frees memory allocated for id token */
-	psm_idbuf_t);		/* address of identity buffer descriptor */
-
-int
-psm__get_key_from_token(/* gets session key from token */
-	char *,				/* user name */
-	psm_idbuf_t,		/* address of identity buffer descriptor */
-	unsigned char *,	/* memory for key data */
-	size_t *);			/* provided/required length of key data */
-
-int
-psm__sign_data(			/* sign data */
-	unsigned char *,	/* key data */
-	size_t,				/* length of key data */
-	struct iovec *,		/* address of input data vector */
-	int,				/* number of buffers in vector */
-	struct iovec *);	/* address of signature buffer */
-
-int
-psm__verify_data(		/* verify signature */
-	unsigned char *,	/* key data */
-	size_t,				/* length of key data */
-	struct iovec *,		/* address of input data vector */
-	int,				/* number of buffers in vector */
-	struct iovec *);	/* address of signature buffer */
-
-int
-psm__free_signature(	/* deallocates mem. allocated for signature */
-	struct iovec *);	/* address of signature buffer */
-
-void
-psm__cleanup();			/* one time cleanup of the module */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	// _H_PSM_H
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.c b/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.c
deleted file mode 100644
index 430c4af..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.c
+++ /dev/null
@@ -1,1988 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-
-#include <pthread.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <ctype.h>
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-
-#include <openssl/pem.h>
-#include <openssl/bio.h>
-#include <openssl/md5.h>
-#include <openssl/aes.h>
-
-#include "psec_openssh.h"
-
-#define USR_CONFIG_FILE ".ssh/config"
-#define SSH_CONFIG_FILE "/etc/ssh/ssh_config"
-#define SSHD_CONFIG_FILE "/etc/ssh/sshd_config"
-
-#define CONFIG_FILE_MAXSIZE 10*1024
-
-pthread_key_t _prngKey;
-time_t _idtokTTL = 600;
-char *authzkeyfile = NULL;
-char *osslversion = NULL;
-#if defined(_AIX)
-#define _BIO_f_base64 BIO_f_base64
-#define _BIO_free BIO_free
-#define _BIO_free_all BIO_free_all
-#define _BIO_new BIO_new
-#define _BIO_new_mem_buf BIO_new_mem_buf
-#define _BIO_push BIO_push
-#define _BIO_read BIO_read
-#define _BIO_set_flags BIO_set_flags
-#define _BN_bin2bn BN_bin2bn
-#define _BN_dec2bn BN_dec2bn
-#define _BN_free BN_free
-#define _DSA_free DSA_free
-#define _DSA_new DSA_new
-#define _DSA_sign DSA_sign
-#define _DSA_size DSA_size
-#define _DSA_verify DSA_verify
-#define _PEM_read_DSAPrivateKey PEM_read_DSAPrivateKey
-#define _PEM_read_RSAPrivateKey PEM_read_RSAPrivateKey
-#define _RSA_free RSA_free
-#define _RSA_new RSA_new
-#define _RSA_sign RSA_sign
-#define _RSA_size RSA_size
-#define _RSA_verify RSA_verify
-#define _RSA_public_encrypt RSA_public_encrypt
-#define _RSA_private_decrypt RSA_private_decrypt
-#define _SHA1 SHA1
-#define _MD5_Init MD5_Init
-#define _MD5_Update MD5_Update
-#define _MD5_Final MD5_Final
-#define _AES_set_encrypt_key AES_set_encrypt_key
-#define _AES_encrypt AES_encrypt
-#define _BIO_set_flags BIO_set_flags
-#define OSSL_FNCSELECT(name) name
-#elif defined(_LINUX)
-typedef BIO_METHOD *(*_ft_BIO_f_base64)(void);
-typedef int (*_ft_BIO_free)(BIO *);
-typedef void (*_ft_BIO_free_all)(BIO *);
-typedef BIO *(*_ft_BIO_new)(BIO_METHOD *);
-typedef BIO *(*_ft_BIO_new_mem_buf)(void *, int);
-typedef BIO *(*_ft_BIO_push)(BIO *, BIO *);
-typedef int (*_ft_BIO_read)(BIO *, void *, int);
-typedef int (*_ft_BN_dec2bn)(BIGNUM **, const char *);
-typedef BIGNUM *(*_ft_BN_bin2bn)(const unsigned char *,int , BIGNUM *);
-typedef void (*_ft_BN_free)(BIGNUM *);
-typedef void (*_ft_DSA_free)(DSA *);
-typedef DSA *(*_ft_DSA_new)(void);
-typedef int (*_ft_DSA_sign)(int, const unsigned char *, int, unsigned char *, unsigned int *, DSA *);
-typedef int (*_ft_DSA_size)(const DSA *);
-typedef int (*_ft_DSA_verify)(int, const unsigned char *, int, const unsigned char *, int, DSA *);
-typedef DSA *(*_ft_PEM_read_DSAPrivateKey)(FILE *, ...);
-typedef RSA *(*_ft_PEM_read_RSAPrivateKey)(FILE *, ...);
-typedef void (*_ft_RSA_free)(RSA *);
-typedef RSA *(*_ft_RSA_new)(void);
-typedef int (*_ft_RSA_sign)(int, const unsigned char *, unsigned int, unsigned char *, unsigned int *, RSA *);
-typedef int (*_ft_RSA_size)(const RSA *);
-typedef int (*_ft_RSA_verify)(int, const unsigned char *, unsigned int, unsigned char *, unsigned int, RSA *);
-typedef int (*_ft_RSA_public_encrypt)(int, unsigned char *, unsigned char *, RSA *, int);
-typedef int (*_ft_RSA_private_decrypt)(int, unsigned char *, unsigned char *, RSA *, int);
-typedef unsigned char *(*_ft_SHA1)(const unsigned char *, size_t, unsigned char *);
-typedef int (*_ft_MD5_Init)(MD5_CTX *);
-typedef int (*_ft_MD5_Update)(MD5_CTX *, void *, size_t);
-typedef int (*_ft_MD5_Final)(unsigned char *, MD5_CTX *);
-typedef int (*_ft_AES_set_encrypt_key)(const unsigned char *, const int, AES_KEY *);
-typedef void (*_ft_AES_encrypt)(const unsigned char *, unsigned char *, const AES_KEY *);
-#if !defined(BIO_set_flags)
-typedef void (*_ft_BIO_set_flags)(BIO *, int);
-#endif
-
-typedef struct func_doublet_s {
-	char *fncname;
-	void *fncpntr;
-} func_doublet_desc, *func_doublet_t;
-
-#define _fpi_BIO_f_base64 0
-#define _fpi_BIO_free 1
-#define _fpi_BIO_free_all 2
-#define _fpi_BIO_new 3
-#define _fpi_BIO_new_mem_buf 4
-#define _fpi_BIO_push 5
-#define _fpi_BIO_read 6
-#define _fpi_BN_bin2bn 7
-#define _fpi_BN_dec2bn 8
-#define _fpi_BN_free 9
-#define _fpi_DSA_free 10
-#define _fpi_DSA_new 11
-#define _fpi_DSA_sign 12
-#define _fpi_DSA_size 13
-#define _fpi_DSA_verify 14
-#define _fpi_PEM_read_DSAPrivateKey 15
-#define _fpi_PEM_read_RSAPrivateKey 16
-#define _fpi_RSA_free 17
-#define _fpi_RSA_new 18
-#define _fpi_RSA_sign 19
-#define _fpi_RSA_size 20
-#define _fpi_RSA_verify 21
-#define _fpi_RSA_public_encrypt 22
-#define _fpi_RSA_private_decrypt 23
-#define _fpi_SHA1 24
-#define _fpi_MD5_Init 25
-#define _fpi_MD5_Update 26
-#define _fpi_MD5_Final 27
-#define _fpi_AES_set_encrypt_key 28
-#define _fpi_AES_encrypt 29
-#if defined(BIO_set_flags)
-#define OSSL_FNCSTBLE_SIZE 30
-void *_fp_BIO_set_flags = NULL;
-#else
-#define _fpi_BIO_set_flags 30 
-void _fp_BIO_set_flags(BIO *b, int flags) { b->flags |= flags; } 
-#define OSSL_FNCSTBLE_SIZE 31
-#endif
-func_doublet_desc ossl_fncstble[OSSL_FNCSTBLE_SIZE] = {
-	{"BIO_f_base64", NULL},
-	{"BIO_free", NULL},
-	{"BIO_free_all", NULL},
-	{"BIO_new", NULL},
-	{"BIO_new_mem_buf", NULL},
-	{"BIO_push", NULL},
-	{"BIO_read", NULL},
-	{"BN_bin2bn", NULL},
-	{"BN_dec2bn", NULL},
-	{"BN_free", NULL},
-	{"DSA_free", NULL},
-	{"DSA_new", NULL},
-	{"DSA_sign", NULL},
-	{"DSA_size", NULL},
-	{"DSA_verify", NULL},
-	{"PEM_read_DSAPrivateKey", NULL},
-	{"PEM_read_RSAPrivateKey", NULL},
-	{"RSA_free", NULL},
-	{"RSA_new", NULL},
-	{"RSA_sign", NULL},
-	{"RSA_size", NULL},
-	{"RSA_verify", NULL},
-	{"RSA_public_encrypt", NULL},
-	{"RSA_private_decrypt", NULL},
-	{"SHA1", NULL},
-	{"MD5_Init", NULL},
-	{"MD5_Update", NULL},
-	{"MD5_Final", NULL},
-	{"AES_set_encrypt_key", NULL},
-	{"AES_encrypt", NULL}
-#if !defined(BIO_set_flags)
-	, {"BIO_set_flags", NULL}
-#endif
-};
-#define OSSL_FNCSELECT(name) ((_ft##name)(ossl_fncstble[_fpi##name].fncpntr))
-#endif
-
-int
-_read_config_param(
-	char *cfgfile,
-	char *param,
-	char *value)
-{
-	int rc = 0;
-
-do {
-	struct stat cfgstat = {0};
-	if (0>stat(cfgfile, &cfgstat)) {
-		// printf("Error [%s:%d]: stat() failed for %s: errno = %d\n", __FILE__, __LINE__, cfgfile, errno);
-		rc = OSSH_CFGFILE_ERR; break;
-	}
-	if (0==cfgstat.st_size) { rc = OSSH_CFGFILE_SIZE_ERR; break; }
-	if (CONFIG_FILE_MAXSIZE<cfgstat.st_size) { rc = OSSH_CFGFILE_SIZE_ERR; break; }
-{
-	FILE *cfgstrm = NULL;
-	if (NULL==(cfgstrm = fopen(cfgfile, "r"))) {
-		// printf("Error [%s:%d]: fopen() failed for %s: errno = %d\n", __FILE__, __LINE__, cfgfile, errno);
-		rc = OSSH_CFGFILE_OPEN_ERR; break;
- 	}
-	pthread_cleanup_push((void(*)(void *))fclose, (void *)cfgstrm);
-do {
-	char *cfgline = malloc(cfgstat.st_size);
-	if (!cfgline) {
-		// printf("Error [%s:%d]: fopen() failed w/errno = %d (%d)\n", __FILE__, __LINE__, errno, cfgstat.st_size);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, cfgline);
-	do {
-		char *cp = NULL;
-		if (NULL==(cp = fgets(cfgline, cfgstat.st_size, cfgstrm))) {
-			// if (ferror(cfgstrm)) printf("Error [%s:%d]: fgets() failed for %s: errno = %d\n", __FILE__, __LINE__, cfgfile, errno);
-			if (feof(cfgstrm)) break;
-			rc = OSSH_CFGFILE_GETS_ERR; break;
-		}
-		if (('#' == *cp) || ('\n' == *cp)) continue;
-{
-		while (isblank(*cp)) cp++;
-		if (!strncmp(cp, param, strlen(param))) {
-			char *pcp = cp + strlen(param);
-			if (!isblank(*pcp)) continue;
-			while (isblank(*pcp)) pcp++;
-{
-			char *ecp = pcp;
-			while (ispunct(*ecp)||isalnum(*ecp)) ecp++;
-			if (ecp == pcp) { rc = OSSH_CFGFILE_DATA_ERR; break; }
-			if (PATH_MAX-1<ecp-pcp) { rc = OSSH_CFGFILE_DATA_ERR; break; }
-			strncpy(value, pcp, ecp-pcp); value[ecp-pcp] = '\0';
-			break;
-}		
-		}
-}
-	} while (1);
-	pthread_cleanup_pop(1);		// free(cfgline);
-} while (0);
-	pthread_cleanup_pop(1);		// fclose(cfgstrm);
-}
-} while (0);
-	return rc;
-}
-
-void
-_nfree(void *p) { if (p) free(p); }
-
-int
-_get_identity_fname(
-	char *luser,
-	char *ruser,
-	char *rhost,
-	char **idfpath)
-{
-	// ruser and rhost not used at this time
-	int rc = 0;
-	char *usrConfigFile = NULL, *usrHomeDir = NULL;
-
-	pthread_cleanup_push((void(*)(void *))_nfree, usrConfigFile);
-	pthread_cleanup_push((void(*)(void *))_nfree, usrHomeDir);	
-do {
-	char vIdentityFile[PATH_MAX] = "";
-	size_t usrHomeDirLen = 0;
-	// get the user's home directory
-	long pwrbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-	void *pwrbuf = malloc(pwrbufsize);
-	if (!pwrbuf) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, pwrbuf);
-do {
-	struct passwd usrpwd, *usrpwdp = NULL;
-	if (luser&&('\0'!=*luser)) rc = getpwnam_r(luser, &usrpwd, pwrbuf, pwrbufsize, &usrpwdp);
-	else rc = getpwuid_r(geteuid(), &usrpwd, pwrbuf, pwrbufsize, &usrpwdp);
-	if (rc) {
-		// printf("Error [%s:%d]: getpwuid_r() failed: rc = %d\n", __FILE__, __LINE__, rc);
-		rc = OSSH_PWUID_ERR; break;
-	}
-	if (usrpwd.pw_dir&&(usrHomeDirLen = strlen(usrpwd.pw_dir))) {
-		if(!(usrHomeDir = strdup(usrpwd.pw_dir))) {
-			// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_MEMORY_ERR; break;
-		}
-		if (!(usrConfigFile = malloc(usrHomeDirLen+strlen(USR_CONFIG_FILE)+2))) {
-			// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_MEMORY_ERR; break;
-		}
-		sprintf(usrConfigFile, "%s/%s", usrHomeDir, USR_CONFIG_FILE);
-	}
-} while (0);
-	pthread_cleanup_pop(1);		// free(pwrbuf);
-	if (rc) break;
-do {
-	if (!usrConfigFile) { rc = OSSH_CFGFILE_ERR; break; }
-	rc = _read_config_param(usrConfigFile, "IdentityFile", vIdentityFile);
-} while (0);
-	if (rc||('\0'==*vIdentityFile)) {
-		rc = _read_config_param(SSH_CONFIG_FILE, "IdentityFile", vIdentityFile);
-	}
-	if ((!rc)&&('\0' != *vIdentityFile)) {
-		// check the file name
-		if (strchr(vIdentityFile, '%')) {
-			// printf("Error [%s:%d]: invalid format of identity file name: %s\n", __FILE__, __LINE__, vIdentityFile);
-			rc = OSSH_IDFILE_NAME_ERR; break;
-		}
-do {
-		if ('/' == *vIdentityFile) {
-			// absolute file path
-			rc = OSSH_IDFILE_NAME_ERR; break;
-		}
-		// relative file path to user's home directory
-		if (!usrHomeDir) { rc = OSSH_PWUID_HOMEDIR_ERR; break; }
-		if ('~' == *vIdentityFile) {
-			if ('/' != *(vIdentityFile+1)) {
-				// printf("Error [%s:%d]: invalid format of identity file name %s\n", __FILE__, __LINE__, vIdentityFile);
-				rc = OSSH_IDFILE_NAME_ERR; break;
-			}
-			if (PATH_MAX-1<(usrHomeDirLen+strlen(vIdentityFile+1))) {
-				// id file name too long
-				rc = OSSH_IDFILE_PATH_ERR; break;
-			}
-			memmove(&vIdentityFile[usrHomeDirLen], vIdentityFile+1, strlen(vIdentityFile+1));
-		} else {
-			if (PATH_MAX-2<(usrHomeDirLen+strlen(vIdentityFile))) {
-				// id file name too long
-				rc = OSSH_IDFILE_PATH_ERR; break;
-			}
-			memmove(&vIdentityFile[usrHomeDirLen+1], vIdentityFile, strlen(vIdentityFile));
-			vIdentityFile[usrHomeDirLen] = '/';
-		}
-		memcpy(vIdentityFile, usrHomeDir, usrHomeDirLen);
-} while (0);
-		if (rc) break;
-{		// check the identity file
-		struct stat idfstat = {0};
-		if (0>stat(vIdentityFile, &idfstat)) {
-			// printf("Error [%s:%d]: stat() failed for %s: errno = %d\n", __FILE__, __LINE__, idfpath, errno);
-			rc = OSSH_IDFILE_PATH_ERR; break;
-		}
-		if (0==idfstat.st_size) {
-			// printf("Error [%s:%d]: invalid private identity file (size = %d)\n", __FILE__, __LINE__, idfstat.st_size);
-			rc = OSSH_IDFILE_SIZE_ERR; break;
-		}
-}
-	} else {
-		// either error reading config file or no identity file name
-		// try the default file names: identity, id_rsa, id_dsa
-		struct stat idfstat = {0};	
-		strcpy(vIdentityFile, usrHomeDir);
-do {
-		rc = 0;		// reset error code, in case of any
-		strcpy(vIdentityFile+usrHomeDirLen, "/.ssh/id_rsa");
-		if ((0==stat(vIdentityFile, &idfstat))&&(0!=idfstat.st_size)) {
-			// found this default file
-			break;
-		}
-		memset(&idfstat, 0, sizeof(struct stat));
-		strcpy(vIdentityFile+usrHomeDirLen, "/.ssh/id_dsa");
-		if ((0==stat(vIdentityFile, &idfstat))&&(0!=idfstat.st_size)) {
-			// found this default file
-			break;
-		}
-		memset(&idfstat, 0, sizeof(struct stat));
-		strcpy(vIdentityFile+usrHomeDirLen, "/.ssh/identity");
-		if ((0==stat(vIdentityFile, &idfstat))&&(0!=idfstat.st_size)) {
-			// found this default file
-			break;
-		}
-		rc = OSSH_IDFILE_DEFS_ERR;
-} while (0);
-		if (rc) break;
-	}
-	if (!(*idfpath = strdup(vIdentityFile))) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-} while (0);
-	pthread_cleanup_pop(1);		// _nfree(usrHomeDir)
-	pthread_cleanup_pop(1);		// _nfree(usrConfigFile)
-	return rc;
-}
-
-int
-_get_authz_fname(
-	char *luser,
-	char **azfpath)
-{
-	int rc = 0;
-do {
-	int dvAuthorizedFilef = 0, vAuthorizedFileLen = 0;
-	char vAuthorizedFile[PATH_MAX] = "", *dvAuthorizedFilep = ".ssh/authorized_keys";
-	if (!authzkeyfile) _read_config_param(SSHD_CONFIG_FILE, "AuthorizedKeysFile", vAuthorizedFile);
-	else strcpy(vAuthorizedFile, authzkeyfile); 
-do {
-	if ('\0' == *vAuthorizedFile) {
-		// no value found for authorized keys parameter
-		strcpy(vAuthorizedFile, dvAuthorizedFilep);
-		dvAuthorizedFilef++;
-	}
-	if ('/' == *vAuthorizedFile) {
-		// absolute file path
-		rc = OSSH_AUTHZFILE_NAME_ERR; break;
-	}
-	// relative path to user's home directory
-{
-	size_t usrHomeDirLen = 0;
-	long pwrbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-	void *pwrbuf = malloc(pwrbufsize);
-	if (!pwrbuf) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %s\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, pwrbuf);
-do {
-	struct passwd usrpwd, *usrpwdp = NULL;
-	if (luser) rc = getpwnam_r(luser, &usrpwd, pwrbuf, pwrbufsize, &usrpwdp);
-	else rc = getpwuid_r(geteuid(), &usrpwd, pwrbuf, pwrbufsize, &usrpwdp);
-	if (rc) {
-		// printf("Error [%s:%d]: getpwuid_r() failed: rc = %d\n", __FILE__, __LINE__, rc);
-		rc = OSSH_PWUID_ERR; break;
-	}
-	if (!usrpwd.pw_dir|| (0==(usrHomeDirLen = strlen(usrpwd.pw_dir)))) {
-		// printf("Error [%s:%d]: invalid user home directory\n", __FILE__, __LINE__);
-		rc = OSSH_PWUID_HOMEDIR_ERR; break;
-	}
-	if ('~' == *vAuthorizedFile) {
-		if ('/' != *(vAuthorizedFile+1)) {
-			// printf("Error [%s:%d]: invalid format of authorized key file name: %s\n", __FILE__, __LINE__, vAuthorizedFile);
-			rc = OSSH_AUTHZFILE_NAME_ERR; break;
-		}
-		if (PATH_MAX-1<(vAuthorizedFileLen = usrHomeDirLen+strlen(vAuthorizedFile+1))) {
-			// authorized file name too long
-			rc = OSSH_AUTHZFILE_PATH_ERR; break;
-		}
-		memmove(&vAuthorizedFile[usrHomeDirLen], vAuthorizedFile+1, strlen(vAuthorizedFile+1));
-	} else {
-		if (PATH_MAX-2<(vAuthorizedFileLen = usrHomeDirLen+strlen(vAuthorizedFile))) {
-			// authorized file name too long
-			rc = OSSH_AUTHZFILE_PATH_ERR; break;
-		}
-		memmove(&vAuthorizedFile[usrHomeDirLen+1], vAuthorizedFile, strlen(vAuthorizedFile));
-		vAuthorizedFile[usrHomeDirLen] = '/';
-	}
-	memcpy(vAuthorizedFile, usrpwd.pw_dir, usrHomeDirLen);
-} while (0);
-	pthread_cleanup_pop(1);		// free(pwrbuf)
-}
-} while (0);
-	if (rc) break;
-{	// check the authorization file
-	struct stat azfstat = {0};
-	if (0>stat(vAuthorizedFile, &azfstat)) {
-		if ((ENOENT!=errno)||(0==dvAuthorizedFilef)) {
-			// printf("Error [%s:%d]: stat() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_AUTHZFILE_PATH_ERR; break;
-		}
-		// default authorization file does not exist: try the 2 version
-		memset(&azfstat, 0, sizeof(struct stat));
-		if (PATH_MAX-2<vAuthorizedFileLen) {
-			// too long
-			rc = OSSH_AUTHZFILE_PATH_ERR; break;
-		}
-		strcat(vAuthorizedFile, "2");
-		if (0>stat(vAuthorizedFile, &azfstat)) {
-			// printf("Error [%s:%d]: stat() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_AUTHZFILE_PATH_ERR; break;
-		}
-	}
-}
-	if (!(*azfpath = strdup(vAuthorizedFile))) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-} while (0);
-	return rc;
-}
-
-#define KEYTYPE_STR_DSA "ssh-dss"
-
-DSA *
-_read_dsa_public_key(
-	char *s,
-	char **usrid)
-{
-	DSA *dsapub = NULL;
-do {
-	int rc = 0;
-	char *ts = strdup(s);
-	if (!ts) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, ts);
-do {
-	// find the dsa header in the public key data
-	char *cp = strstr(ts, KEYTYPE_STR_DSA);
-	if (!cp) {
-		// not a DSA public key
-		// printf("Error [%s:%d]: invalid DSA public key format\n", __FILE__, __LINE__);
-		rc = OSSH_DSA_INVALID_FORMAT_ERR; break;
-	}
-{	// version 2 DSA public key
-	char *lasts, *buf = NULL; size_t len;
-	// get the base64 key encoding
-	if (!(cp = strtok_r(cp+strlen(KEYTYPE_STR_DSA), " ", &lasts))) {
-		// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-		rc = OSSH_DSA_INVALID_FORMAT_ERR; break;
-	}
-	if (!(buf = malloc(2*(len=strlen(cp)+1)))) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, len);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, buf);
-do {
-{	// decode the base64 encoded public key data
-	BIO *bio, *b64;
-	if (!(bio = OSSL_FNCSELECT(_BIO_new_mem_buf)(cp, -1))) {
-		// printf("Error [%s:%d]: BIO_new_mem_buf() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_BIO_NEW_MEMBUF_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))OSSL_FNCSELECT(_BIO_free_all), bio);
-do {
-	if (!(b64 = OSSL_FNCSELECT(_BIO_new)(OSSL_FNCSELECT(_BIO_f_base64)()))) {
-		// printf("Error [%s:%d]: BIO_new failed...\n", __FILE__, __LINE__);
-		rc = OSSH_BIO_NEW_ERR; break;
-	}
-#if defined(BIO_set_flags)
-	BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-#else
-	OSSL_FNCSELECT(_BIO_set_flags)(b64, BIO_FLAGS_BASE64_NO_NL);
-#endif
-	if (!(bio = OSSL_FNCSELECT(_BIO_push)(b64, bio))) {
-		// printf("Error [%s:%d]: BIO_push() failed...\n", __FILE__, __LINE__);
-		OSSL_FNCSELECT(_BIO_free)(b64);
-		rc = OSSH_BIO_PUSH_ERR; break;
-	}
-	if (0>=(len = OSSL_FNCSELECT(_BIO_read)(bio, buf, len))) {
-		// printf("Error [%s:%d]: BIO_read() failed\n", __FILE__, __LINE__);
-		rc = OSSH_BIO_READ_ERR; break;
-	}
-} while (0);
-	pthread_cleanup_pop(1);		// BIO_free_all(bio);
-}
-	if (rc) break;
-{	// make sense of the public key data
-	BIGNUM *p = NULL, *q = NULL, *g = NULL, *y= NULL;
-	char *cp = buf;
-	// 1st field should be key type
-	int len = ntohl(*((int *)cp));
-	if (strncmp(cp+=sizeof(int), KEYTYPE_STR_DSA, len)) {
-		// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-		rc = OSSH_DSA_INVALID_FORMAT_ERR; break;
-	} else cp += len;
-	// the subsequent fields for DSA should be the p, q, g and y parameters
-	len = ntohl(*((int *)cp)); cp += sizeof(int);
-do {
-	// read the p parameter 
-	if (!(p = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for the p parameter...\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += len;
-	len = ntohl(*((int *)cp)); cp += sizeof(int);
-	// read the q parameter
-	if (!(q = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for q parameter...\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += len;
-	len = ntohl(*((int *)cp)); cp += sizeof(int);
-	// read the g parameter
-	if (!(g = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for the g parameter...\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += len;
-	len = ntohl(*((int *)cp)); cp += sizeof(int);
-	// read the y parameter
-	if (!(y = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for the y parameter...\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	}
-	if (!(dsapub = OSSL_FNCSELECT(_DSA_new)())) {
-		// printf("Error [%s:%d]: DSA_new() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_DSA_NEW_ERR; break;
-	}
-	dsapub->p = p; dsapub->q = q; dsapub->g = g; dsapub->pub_key = y;
-} while (0);
-	if (rc) {
-		if (p) OSSL_FNCSELECT(_BN_free)(p);
-		if (q) OSSL_FNCSELECT(_BN_free)(q);
-		if (g) OSSL_FNCSELECT(_BN_free)(g);
-		if (y) OSSL_FNCSELECT(_BN_free)(y);
-	}
-}
-} while (0);
-	pthread_cleanup_pop(1);		// free(buf)
-	if (rc) break;
-	if (usrid&&(cp = strtok_r(NULL, " \n", &lasts))) *usrid = strdup(cp);
-}
-} while (0);
-	pthread_cleanup_pop(1);		// free (ts);
-} while (0);
-	return dsapub;
-}
-
-#define KEYTYPE_STR_RSA "ssh-rsa"
-
-RSA *
-_read_rsa_public_key(
-	char *s,
-	char **usrid)
-{
-	// this routine reads a public RSA key from either an openSSH v1 or v2
-	// formatted public key identity file
-	// the v1 format appears to be as follows: options, key length, public
-	// exponent, modulus, comments; the fields are separated by white
-	// spaces
-	// the v2 format appears to be as follows: options, key type, key
-	// value, comment; the fields are separated by one blank space
-	// in both versions options are optional; the comment field is not used
-	RSA *rsapub = NULL;
-do {
-	int rc = 0;
-	char *ts = strdup(s);
-	if (!ts) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, ts);
-do {
-	// if rsa header, then RSA v2 key
-	char *cp = strstr(ts, KEYTYPE_STR_RSA);
-	if (!cp) {
-		// possibly a v1 RSA public key 	
-		// split the input string in tokens separated by blank spaces
-		int noofquotes = 0; char *lasts, *cp = strtok_r(ts, " ", &lasts); 
-		if (!cp) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (!isdigit(*cp)) {
-			// this must be a comment
-			int quotesclosed = 0;
-			while (!quotesclosed) {
-{				// check whether a blank space whithin quotes
-				char *cp2 = cp-1;
-				while (cp2 = strchr(cp2+1, '"')) noofquotes++;
-				if (!(noofquotes%2)) quotesclosed++;
-				if (!(cp = strtok_r(NULL, " ", &lasts))) {
-					// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-					rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-				} 
-}
-			}
-			if (!isdigit(*cp)) {
-				// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-				rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-			}
-		}
-		// version 1 public key; get the key length
-		BIGNUM *e = NULL, *n = NULL;
-		long keylen;
-		if ((0==(errno = 0, keylen=atol(cp)))&&(EINVAL==errno)) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (((LONG_MAX==keylen)||(LONG_MIN==keylen))&&(ERANGE==errno)) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (0>=keylen) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		// get the public exponent
-		if (!(cp = strtok_r(NULL, " ", &lasts))) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (!(OSSL_FNCSELECT(_BN_dec2bn)(&e, cp))) {
-			// printf("Error [%s:%d]: BN_dec2bn() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_BN_DEC2BN_ERR; break;
-		}
-do {
-		// get the modulus
-		if (!(cp = strtok_r(NULL, " ", &lasts))) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (!(OSSL_FNCSELECT(_BN_dec2bn)(&n, cp))) {
-			// printf("Error [%s:%d]: BN_dec2bn() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_BN_DEC2BN_ERR; break;
-		}
-do {
-		if (!(rsapub = OSSL_FNCSELECT(_RSA_new)())) {
-			// printf("Error [%s:%d]: RSA_new() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_NEW_ERR; break;
-		}
-		rsapub->n = n; rsapub->e = e;
-} while (0);
-		if (rc) { OSSL_FNCSELECT(_BN_free)(n); break; }
-} while (0);
-		if (rc) { OSSL_FNCSELECT(_BN_free)(e); break; }
-		// get the user id, if any--normally, there should be a
-		// user@hostname id
-		if (usrid&&(cp = strtok_r(NULL, " \n", &lasts))) *usrid = strdup(cp);
-	} else {
-		// version 2 public key
-		char *lasts, *buf = NULL; size_t len;
-		// get the base64 key encoding
-		if (!(cp = strtok_r(cp+strlen(KEYTYPE_STR_RSA), " ", &lasts))) {
-			// printf("Error [%s:%d]: invalid RSA public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		}
-		if (!(buf = malloc(2*(len=strlen(cp)+1)))) {
-			// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, len);
-			rc = OSSH_MEMORY_ERR; break;
-		}
-		pthread_cleanup_push((void(*)(void *))free, buf);
-do {
-{		// decode the base64 encoded public key data
-		BIO *bio, *b64;
-		if (!(bio = OSSL_FNCSELECT(_BIO_new_mem_buf)(cp, -1))) {
-			// printf("Error [%s:%d]: BIO_new_mem_buf() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_BIO_NEW_MEMBUF_ERR; break;
-		}
-		pthread_cleanup_push((void(*)(void *))OSSL_FNCSELECT(_BIO_free_all), bio);
-do {
-		if (!(b64 = OSSL_FNCSELECT(_BIO_new)(OSSL_FNCSELECT(_BIO_f_base64)()))) {
-			// printf("Error [%s:%d]: BIO_new failed...\n", __FILE__, __LINE__);
-			rc = OSSH_BIO_NEW_ERR; break;
-		}
-#if defined(BIO_set_flags)
-		BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-#else
-		OSSL_FNCSELECT(_BIO_set_flags)(b64, BIO_FLAGS_BASE64_NO_NL);
-#endif
-		if (!(bio = OSSL_FNCSELECT(_BIO_push)(b64, bio))) {
-			// printf("Error [%s:%d]: BIO_push() failed...\n", __FILE__, __LINE__);
-			OSSL_FNCSELECT(_BIO_free)(b64);
-			rc = OSSH_BIO_PUSH_ERR; break;
-		}
-		if (0>=(len = OSSL_FNCSELECT(_BIO_read)(bio, buf, len))) {
-			// printf("Error [%s:%d]: BIO_read() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_BIO_READ_ERR; break;
-		}
-} while (0);
-		pthread_cleanup_pop(1);		// BIO_free_all(bio);
-}
-		if (rc) break;
-{		// make sense of the public key data
-		BIGNUM *e = NULL, *n = NULL;
-		char *cp = buf;
-		// check the key type
-		int len = ntohl(*((int *)cp));
-		if (strncmp(cp+=sizeof(int), KEYTYPE_STR_RSA, len)) {
-			// printf("Error [%s:%d]: invalid public key format\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_INVALID_FORMAT_ERR; break;
-		} else cp += len;
-do {
-		// read the public exponent
-		len = ntohl(*((int *)cp)); cp += sizeof(int);
-		if (!(e = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-			// printf("Error [%s:%d]: BN_bin2bn() failed for the public exponent...\n", __FILE__, __LINE__);
-			rc = OSSH_BN_BIN2BN_ERR; break;
-		}
-		cp += len;
-		// read the modulus
-		len = ntohl(*((int *)cp));
-		cp += sizeof(int);
-		// read the modulus
-		if (!(n = OSSL_FNCSELECT(_BN_bin2bn)(cp, len, NULL))) {
-			// printf("Error [%s:%d]: BN_bin2bn() failed for modulus...\n", __FILE__, __LINE__);
-			rc = OSSH_BN_BIN2BN_ERR; break;
-		}
-		if (!(rsapub = OSSL_FNCSELECT(_RSA_new)())) {
-			// printf("Error [%s:%d]: RSA_new() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_RSA_NEW_ERR; break;
-		}
-		rsapub->n = n; rsapub->e = e;
-} while (0);
-		if (rc) {
-			if (e) OSSL_FNCSELECT(_BN_free)(e);
-			if (n) OSSL_FNCSELECT(_BN_free)(n);
-		}
-}
-} while (0);
-		pthread_cleanup_pop(1);		// free(buf);
-		if (rc) break;
-		if (usrid&&(cp = strtok_r(NULL, " \n", &lasts))) *usrid = strdup(cp);
-	}
-} while (0);
-	pthread_cleanup_pop(1);		// free(ts);
-} while (0);
-	return rsapub;
-}
-
-#define SSHRSA1_FILE_IDSTR	"SSH PRIVATE KEY FILE FORMAT 1.1\n"
-RSA *
-_read_rsa1_private_key(
-	FILE *strm)
-{
-	RSA *rsaprv = NULL;
-do {
-	// get the file desriptor number and check the size of the private key
-	// file
-	int strmfsize = 0; char *strmfbuf;
-	int strmfd = fileno(strm);
-	if (0>strmfd) {
-		// printf("Error [%s:%d]: fileno() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		break;
-	}
-{
-	struct stat strmstat = {0};
-	if (0>fstat(strmfd, &strmstat)) {
-		// printf("Error [%s:%d]: fstat() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		break;
-	}
-	if ((0==(strmfsize = strmstat.st_size))||(1024*1024<strmfsize)) {
-		// printf("Error [%s:%d]: private key file out of range (%d bytes)\n", __FILE__, __LINE__, strmfsize);
-		break;
-	}
-}
-	// allocate memory for the private key file content
-	if(!(strmfbuf = malloc(strmfsize))) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, strmfbuf);
-do {
-	// read the private key file
-	size_t nbytes;
-	if (0>(nbytes = read(strmfd, strmfbuf, strmfsize))) {
-		// printf("Error [%s:%d]: read() failed w/errno = %d\n", __FILE__, __LINE__, nbytes);
-		break;
-	}
-	if (nbytes != strmfsize) {
-		// printf("Error [%s:%d]: failed to read the entire private key file\n", __FILE__, __LINE__);
-		break;
-	}
-{
-	// check the private key file contents
-	char *cp = strmfbuf;
-	if (strcmp(SSHRSA1_FILE_IDSTR, cp)) {
-		// printf("Error [%s:%d]: not an RSA1 private key file\n", __FILE__, __LINE__);
-		break;
-	}
-	cp += strlen(SSHRSA1_FILE_IDSTR)+1;
-	// check the cipher type
-	if (0!=cp[0]) {
-		// printf("Error [%s:%d]: no support for passphrase protected private key files\n", __FILE__, __LINE__);
-		break;
-	} else cp++;
-	// skip the reserved data
-	cp += sizeof(int);
-{
-	int rc = 0;
-	BIGNUM *n = NULL, *e = NULL, *d = NULL, *iqmp = NULL, *p = NULL, *q = NULL;
-do {
-	// next is the public key
-	int pkeysize; short bnsize; size_t bnbytes;
-	// the key size -- not really used
-	pkeysize = ntohl(*((unsigned int *)cp)); cp += sizeof(unsigned int);
-	// the modulus
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize +7)/8;
-	if (!(n = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for modulus\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += bnbytes;
-	// the public exponent
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize+7)/8;
-	if (!(e = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for public exponent\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += bnbytes;
-	// skip the comment
-	bnbytes = ntohl(*((unsigned int *)cp)); cp += sizeof(unsigned int);
-	cp += bnbytes;
-	// check the cipher verification data
-	if ((cp[0]!=cp[2])||(cp[1]!=cp[3])) {
-		// printf("Error [%s:%d]: cipher verification failure\n", __FILE__, __LINE__);
-		rc = OSSH_CIPHER_VERIF_ERR; break;
-	} else cp += sizeof(unsigned int);
-	// get private key
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize+7)/8;
-	if (!(d = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for private key\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += bnbytes;
-	// get (q^-1)mod(p)
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize+7)/8;
-	if (!(iqmp = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for (q^-1)mod(p)\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += bnbytes;
-	// get prime factors
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize+7)/8;
-	if (!(q = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for prime factor q\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	} else cp += bnbytes;
-	bnsize = ntohs(*((unsigned short int *)cp)); cp += sizeof(unsigned short int);
-	bnbytes = (bnsize+7)/8;
-	if (!(p = OSSL_FNCSELECT(_BN_bin2bn)(cp, bnbytes, NULL))) {
-		// printf("Error [%s:%d]: BN_bin2bn() failed for prime factor p\n", __FILE__, __LINE__);
-		rc = OSSH_BN_BIN2BN_ERR; break;
-	}
-	// create an RSA key and fill it in
-	if (!(rsaprv = OSSL_FNCSELECT(_RSA_new)())) {
-		// printf("Error [%s:%d]: RSA_new() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_RSA_NEW_ERR; break;
-	}
-	rsaprv->n = n; rsaprv->e = e; rsaprv->d = d;
-	rsaprv->p = p; rsaprv->q = q; rsaprv->iqmp = iqmp;
-} while (0);
-	if (rc) {
-		if (n) OSSL_FNCSELECT(_BN_free)(n);
-		if (e) OSSL_FNCSELECT(_BN_free)(e);
-		if (d) OSSL_FNCSELECT(_BN_free)(d);
-		if (iqmp) OSSL_FNCSELECT(_BN_free)(iqmp);
-		if (p) OSSL_FNCSELECT(_BN_free)(p);
-		if (q) OSSL_FNCSELECT(_BN_free)(q);
-	}
-}
-}
-} while (0);
-	pthread_cleanup_pop(1);		// free(strmfbuf);
-} while (0);
-	return rsaprv;
-}
-
-#include <time.h>
-
-int
-_prng_random(unsigned int *prn)
-{
-	int rc = 0;
-	unsigned int *_prngData;
-do {
-	// get the thread specific data for the PRNG
-	if (!(_prngData = pthread_getspecific(_prngKey))) {
-		// allocate memory for the thread specific PRNG data
-		if (!(_prngData = calloc(1, sizeof(unsigned int)))) {
-			// printf("Error [%s:%d]: calloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_MEMORY_ERR; break;
-		}
-{		// seed the PRNG data
-#ifdef _AIX
-		struct timespec ts = {0};
-		clock_gettime(CLOCK_REALTIME, &ts);
-		*_prngData = (unsigned int)(ts.tv_sec^ts.tv_nsec);
-#else
-		struct timeval tv = {0};
-		gettimeofday(&tv, NULL);
-		*_prngData = (unsigned int)(tv.tv_sec^tv.tv_usec);
-#endif
-}
-		// set the PRNG data
-		if (rc = pthread_setspecific(_prngKey, _prngData)) {
-			// printf("Error [%s:%d]: pthread_setspecific() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-			rc = OSSH_PTHRD_SETSPECIFIC_ERR; break;
-		}
-	}
-{	// mangle the _prngData
-#ifdef _AIX
-	struct timespec ts = {0};
-	clock_gettime(CLOCK_REALTIME, &ts);
-	*_prngData |= (unsigned int)(ts.tv_sec^ts.tv_nsec);
-#else
-	struct timeval tv = {0};
-	gettimeofday(&tv, NULL);
-	*_prngData |= (unsigned int)(tv.tv_sec^tv.tv_usec);
-#endif
-}
-	*prn = rand_r(_prngData); 
-} while (0);
-	return rc;
-}
-
-int
-_generate_session_key(
-	RSA *pub,
-	unsigned char *key,
-	size_t *keylen)
-{
-	// this routine generates a 128bit AES key and encrypts it with the
-	// RSA public key provided
-	// will not check the arguments because I control how this routine
-	// is called
-	int rc = 0;
-	unsigned char rawkey[16]; size_t tkeylen;
-do {
-	// generate the key
-	int i = 0; for(;i<4; i++) if (rc = _prng_random((unsigned int *)((void *)rawkey+i*sizeof(unsigned int)))) break;
-	if (rc) break;
-	// encrypt the key
-	if (0>(tkeylen = OSSL_FNCSELECT(_RSA_public_encrypt)(16, rawkey, key, pub, RSA_PKCS1_PADDING))) {
-		// printf("Error [%s:%d]: RSA_public_encrypt() failed for session key\n", __FILE__, __LINE__);
-		rc = OSSH_RSA_PUBLIC_ENCRYPT_ERR; break;
-	}
-	*keylen = tkeylen;
-} while (0);
-	return rc;
-}
-
-int
-_recover_session_key(
-	RSA *prv,
-	unsigned char *ekey,
-	size_t ekeylen,
-	unsigned char *key,
-	size_t *keylen)
-{
-	// this routine recovers the key data from the encrypted key
-	// material in the identity token; the encrypted material was
-	// generated by encrypting a raw 128bit AES key with the user's
-	// OpenSSH RSA public key; therefore, the recovery of the session
-	// key uses the user's OpenSSH RSA private key to decrypt the
-	// encrypted key material
-	// it assumes valid arguments
-	int rc = 0;
-	unsigned char *tbuf;
-do {
-	if (16>*keylen) {
-		// not enough memory to store the return session key
-		// printf("Error [%s:%d]: not enough memory for the session key; bytes required: 16\n", __FILE__, __LINE__):
-		*keylen=16; rc = OSSH_MEMORY_ERR; break;
-	}
-	// allocate memory for a temporary buffer
-	if (!(tbuf = malloc(OSSL_FNCSELECT(_RSA_size)(prv)))) {
-		// unable to allocate memory for the encrypted key
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		*keylen = 0; rc = OSSH_MEMORY_ERR; break;
-	}
-do {
-	// decrypt the encrypted key
-	if (16 != OSSL_FNCSELECT(_RSA_private_decrypt)(ekeylen, ekey, tbuf, prv, RSA_PKCS1_PADDING)) {
-		rc = OSSH_RSA_PRIVATE_DECRYPT_ERR; break;
-	}
-	memcpy(key, tbuf, *keylen=16); 
-} while (0);
-	free(tbuf);
-} while (0);
-	return rc;
-}
-
-int
-psm__init(
-	char *opts)
-{
-	int rc = 0;
-do {
-	// create a pthread key for the pseudo-random specific data
-	if (rc = pthread_key_create(&_prngKey, free)) {
-		// printf("Error [%s:%d]: pthread_key_create() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = OSSH_PTHRD_KEYCREATE_ERR; break;
-	}
-	if (!opts||('\0'==opts)) break;
-{	char *tcp, *lasts, *cp = strdup(opts);
-	if (!cp) {
-		// printf("Error [%s:%d]: strdup() failed w/errno = %s\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-do {
-	tcp = strtok_r(cp, ",", &lasts);
-	do {
-		switch (*tcp) {
-			case 't':
-				if ('='!=*++tcp) break;
-{				time_t tidtokTTL; if (0==(tidtokTTL = strtol(++tcp, NULL, 10))) {
-					// printf("Error [%s:%d]: TTL value must be a positive number\n", __FILE__, __LINE__);
-					break;
-				}
-				if (0>tidtokTTL) _idtokTTL = 0;
-				else _idtokTTL = tidtokTTL;
-}
-				break;
-			case 'v':
-				if ('='!=*++tcp) break;
-				if (PATH_MAX-25<strlen(++tcp)) {
-					// printf("Error [%s:%d]: Version must have a valid format for openssl\n", __FILE__, __LINE__);
-					break;
-				}
-				osslversion = strdup(tcp);
-				break;
-			case 'z':
-				if ('='!=*++tcp) break;
-				if (PATH_MAX-1<strlen(++tcp)) {
-					// printf("Error [%s:%d]: Authorized keys file must be a valid file name\n", __FILE__, __LINE__);
-					break;
-				}
-				authzkeyfile = strdup(tcp);
-				break;
-			default:
-				// skip unknown options
-				break;
-		}
-	} while (tcp = strtok_r(NULL, ",", &lasts));
-} while (0);
-	free(cp);
-}
-{	// open the libcrypto.so library and resolve required symbols
-	char osslcryptolib[PATH_MAX+1] = "", *errmsg = NULL; int i; void *p;
-#if defined(_LINUX)
-#if defined(__64BIT__)
-	strcpy(osslcryptolib, "/usr/lib64/libcrypto.so");
-#else
-	strcpy(osslcryptolib, "/usr/lib/libcrypto.so");
-#endif
-	if (osslversion) {
-		strcat(osslcryptolib, ".");
-		strcat(osslcryptolib, osslversion);
-	}
-	p = dlopen(osslcryptolib, RTLD_NOW);
-	if (!p) {
-		char *errmsg = dlerror();
-		// printf("Error [%s:%d]: dlopen() failed: %s\n", __FILE__, __LINE__, errmsg?errmsg:"<no error message>");
-		rc = OSSH_DLOPEN_ERR; break;
-	}
-	for (i=0; i<OSSL_FNCSTBLE_SIZE; i++) {
-		if (!(ossl_fncstble[i].fncpntr = dlsym(p, ossl_fncstble[i].fncname))) {
-			if (!strcmp(ossl_fncstble[i].fncname, "BIO_set_flags")) {
-				ossl_fncstble[i].fncpntr = _fp_BIO_set_flags;
-				continue;
-			}
-			errmsg = dlerror();
-			// printf("Error [%s:%d]: dlsym() failed for %s: %s\n", __FILE__, __LINE__, ossl_fncstble[i].fncname, errmsg?errmsg:"<no error message>");
-			rc = OSSH_DLSYM_ERR; break;
-		}
-	}
-	if (rc) break;
-#elif !defined(_AIX)
-	rc = OSSH_DLOPEN_ERR; break;
-#endif
-}
-} while (0);
-	return rc;
-}
-
-void
-psm__cleanup()
-{
-do {
-	// nothing to do
-} while (0);
-	return;
-}
-
-typedef union {
-	u_int64_t l;
-	u_int32_t i[2];
-	u_int16_t s[4];
-	u_int8_t  c[8];
-} Uu_int64_t;
-
-#define IDTOK_LEN_MIN 32
-#define IDTOK_LEN (4*1024)
-int
-_increase_tknsize(
-	size_t len,
-	void **p,
-	size_t *nlen) 
-{
-	int rc = 0;
-do {
-	void *tp = NULL; size_t tlen = (len/IDTOK_LEN+1)*IDTOK_LEN;
-	if (!(tp = realloc(*p, tlen))) {
-		// printf("Error [%s:d]: realloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	*p = tp; *nlen = tlen;
-} while (0);
-	return rc;
-}
-
-int
-psm__get_id_token(
-	char *ruser,
-	char *rhost,
-	psm_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	if (!idtok) {
-		// printf("Error [%s:%d]: invalid id buffer descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-{
-	char *idfpath = NULL, *pubidfpath = NULL;
-	if (rc = _get_identity_fname(NULL, ruser, rhost, &idfpath)) break;
-	pthread_cleanup_push((void(*)(void *))free, idfpath);
-do {
-	if (!(pubidfpath = malloc(strlen(idfpath)+strlen(".pub")+1))) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, pubidfpath);
-do {
-	strcpy(pubidfpath, idfpath);
-	strcat(pubidfpath, ".pub");
-{
-	struct stat idfstat = {0};
-	if (0>stat(pubidfpath, &idfstat)) {
-		// printf("Error [%s:%d]: stat() failed for %s: errno = %d\n", __FILE__, __LINE__, pubidfpath, errno);
-		rc = OSSH_PIDFILE_PATH_ERR; break;
-	}
-	if (0==idfstat.st_size) {
-		// printf("Error [%s:%d]: invalid public identity file (size = %d)\n", __FILE__, __LINE__, idfstat.st_size);
-		rc = OSSH_PIDFILE_SIZE_ERR; break;
-	}
-}
-{	// read the keys
-	RSA *rsaprv = NULL, *rsapub = NULL;
-	DSA *dsaprv = NULL, *dsapub = NULL;
-	char usridstr[1024] = ""; int usridstrlen = strlen(usridstr);
-do {
-{	// open the private identity file
-	FILE *idfstrm = fopen(idfpath, "r");
-	if (!idfstrm) {
-		// printf("Error [%s:%d]: fopen() failed for %s: errno = %d\n", __FILE__, __LINE__, idfpath, errno);
-		rc = OSSH_IDFILE_OPEN_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))fclose, idfstrm);
-do {
-	// read the private key
-	if (rsaprv = _read_rsa1_private_key(idfstrm)) break;
-	// rewind the stream to the beginning
-	fseek(idfstrm, 0, SEEK_SET);
-	if (rsaprv = OSSL_FNCSELECT(_PEM_read_RSAPrivateKey)(idfstrm, NULL, NULL, "")) break;
-	// rewind the stream to the beginning
-	fseek(idfstrm, 0, SEEK_SET);
-	if (dsaprv = OSSL_FNCSELECT(_PEM_read_DSAPrivateKey)(idfstrm, NULL, NULL, "")) break;
-	// printf("Error [%s:%d]: unable to read user's private key\n", __FILE__, __LINE__);
-	rc = OSSH_IDFILE_READ_ERR; break;
-} while (0);
-	pthread_cleanup_pop(1);		// fclose(idfstrm);
-	if (rc) break;
-}
-	// the type of key in the public identity file can be derived from
-	// the type of the private key; if the private key is a DSA key,
-	// the public key must be also a DSA key; if the private key is an
-	// RSA key, the public identity file may containe either an SSH-1
-	// or an SSH-2 formatted RSA public key
-{	// open the public identity file
-	char *usrid = NULL; FILE *idfstrm = NULL;
-	pthread_cleanup_push((void(*)(void *))_nfree, usrid);
-do {
-	if (!(idfstrm=fopen(pubidfpath, "r"))) {
-		// printf("Error [%s:%d]: fopen() failed for %s: errno = %d\n", __FILE__, __LINE__, pubidfpath, errno);
-		rc = OSSH_PIDFILE_OPEN_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))fclose, idfstrm);
-do {
-	char *cp, pubkeydata[8*1024] = "";
-	if (!(cp = fgets(pubkeydata, 8*1024, idfstrm))) {
-		// printf("Error [%s:%d]: fgets() failed or EOF\n", __FILE__, __LINE__);
-		rc = OSSH_PIDFILE_GETS_ERR; break;
-	}
-	if (dsaprv) {
-		// this must be a DSA public key file
-		if (!(dsapub = _read_dsa_public_key(cp, &usrid))) rc = OSSH_DSA_INVALID_FORMAT_ERR;
-		break;
-	}
-	if (!(rsapub = _read_rsa_public_key(cp, &usrid))) { rc = OSSH_RSA_INVALID_FORMAT_ERR; break; }
-} while (0);
-	pthread_cleanup_pop(1);		// fclose(idfstrm);
-	if (rc) break;
-{
-	// build the id token and sign it; start w/a 4k buffer and realloc if
-	// necessary
-	// the id token's structure is as follows:
-	//	4 bytes: magic - "ossh"
-#define IDTOK_OFFST_STATVER 4
-	//	1 byte: status (high nibble) and version (low nibble)
-#define IDTOK_OFFST_KEYTYPE 5
-	//	1 byte: key type - 1 for DSA, 2 for RSA
-#define IDTOK_OFFST_NONCE 6
-	//	8 bytes: nonce
-#define IDTOK_OFFST_TMSTAMP 14
-	//	8 bytes: time stamp
-#define IDTOK_OFFST_IDDATA 22
-	//	2 bytes: length of target user name - N bytes
-	//	N bytes: target user name
-	//	2 bytes: length of target host name - M bytes
-	//	M bytes: target host name
-	//	2 bytes: length of user name - P bytes
-	//	P bytes: user name
-	//  2 bytes: length of encrypted session key - Q bytes
-	//  Q bytes: encrypted session key
-	//	2 bytes: length of id token signature - R bytes
-	//	R bytes: id token signature
-	//	minimum length of the id token is 34 bytes, including a minimum
-	//  1 byte for the user id and a minimum 1 byte for the signature
-#define IDTOK_OFFST_MINLEN 32
-
-#define IDTOK_MAGIC "ossh"
-	size_t idtoklen = IDTOK_LEN, cidlen = 0;
-	char *idtokbuf = (char *)malloc(IDTOK_LEN);
-	if (!idtokbuf) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-do {	// no cancellations points in this loop
-	// write the magic, version and key type
-	sprintf(idtokbuf, "%s", IDTOK_MAGIC); cidlen += strlen(IDTOK_MAGIC);
-	*((unsigned char *)(idtokbuf+cidlen)) = 0x02; cidlen += sizeof(unsigned char);
-	*((unsigned char *)(idtokbuf+cidlen)) = dsaprv?0x01:0x02; cidlen += sizeof(unsigned char);
-{	// write the nonce...
-	Uu_int64_t nonce;
-	_prng_random((unsigned int *)&nonce.i[0]); _prng_random((unsigned int *)&nonce.i[1]);
-	*((u_int32_t *)(idtokbuf+cidlen)) = htonl(nonce.i[0]); cidlen += sizeof(nonce.i[0]);
-	*((u_int32_t *)(idtokbuf+cidlen)) = htonl(nonce.i[1]); cidlen += sizeof(nonce.i[0]);
-	// ...and skip the time stamp--will do that later
-	cidlen += sizeof(Uu_int64_t);
-}
-{	// write the remote user id
-	unsigned short ruserlen = ruser?strlen(ruser):0;
-	if (idtoklen<(cidlen+sizeof(unsigned long)+ruserlen)) {
-		// not enough space in the allocated id token buffer--need to
-		// reallocate
-		if (rc = _increase_tknsize(cidlen+sizeof(unsigned long)+ruserlen, (void **)&idtokbuf, &idtoklen)) break;
-	}
-	// write the remote user id length... 
-	*((unsigned short *)(idtokbuf+cidlen)) = htons(ruserlen); cidlen += sizeof(unsigned short);
-	// ...and the remote user id
-	if (ruserlen) { sprintf(idtokbuf+cidlen, "%s", ruser); cidlen += ruserlen; }
-}
-{	// write the remote host name
-	unsigned short rhostlen = rhost?strlen(rhost):0;
-	if (idtoklen<(cidlen+sizeof(unsigned long)+rhostlen)) {
-		// not enough space in the allocated id token buffer--need to
-		// reallocate
-		if (rc = _increase_tknsize(cidlen+sizeof(unsigned long)+rhostlen, (void **)&idtokbuf, &idtoklen)) break;
-	}
-	// write the remote user id length... 
-	*((unsigned short *)(idtokbuf+cidlen)) = htons(rhostlen); cidlen += sizeof(unsigned short);
-	// ...and the remote user id
-	if (rhostlen) { sprintf(idtokbuf+cidlen, "%s", rhost); cidlen += rhostlen; }
-}
-	// write the user id (len and value)
-	if (!usrid) {
-		/* build a user id, but for the time being return an error */
-		// printf("Error [%s:%d]: no user id\n", __FILE__, __LINE__);
-		rc = OSSH_NOUSERID_ERR; break;
-	}
-{	size_t usridlen = strlen(usrid);
-	if (SHRT_MAX < usridlen) {
-		// printf("Error [%s:%d]: userid too long\n", __FILE__, __LINE__);
-		rc = OSSH_USERID_LEN_ERR; break;
-	}
-	if (idtoklen<(cidlen+sizeof(unsigned short)+usridlen)) {
-		// not enough space in the allocated id token buffer--need to
-		// reallocate
-		if (rc = _increase_tknsize(cidlen+sizeof(unsigned short)+usridlen, (void **)&idtokbuf, &idtoklen)) break;
-	}
-	// write the user id length... 
-	*((unsigned short *)(idtokbuf+cidlen)) =  htons((unsigned short)usridlen); cidlen += sizeof(unsigned short);
-	// ...and the user id
-	sprintf(idtokbuf+cidlen, "%s", usrid); cidlen += usridlen;
-}
-{	// generate an encrypted, 128bit AES session key; this will be done
-	// only for RSA identity keys;
-	// the whole idea with generating a session key is based on how
-	// customers use such a large system like an HPC cluster; usually,
-	// the user's home directory is mounted on the compute nodes, so
-	// the application has access to the user's ~/.ssh subdir; when end
-	// users setup key-based login, they add the OpenSSH public key to
-	// their own authorized keys file and, on the compute node, they
-	// use the public key from their own authorized keys file to login
-	// as themselves on the compute node; however, in addition to the
-	// authorized keys file, users also have access to their own
-	// private key file, and that is what I am trying to exploit here;
-	// of course, in the grand schema of things, there is still the
-	// question of the network file system services accessing the end
-	// user's home directory (and their private key, respectively)--if
-	// that is not secure and the private key can be sniffed off the
-	// network, what's the point having this key distibution mechanism?
-	// one could ask;  the answer lays in what we try to protect here,
-	// and that is separating users from each others and ensureing that
-	// one end-user does not submit jobs as another end-user;
-	// in addition to user's home directory setup, this mechanism
-	// requires RSA keys;  to keep the key distribution simple and
-	// scalable, the authn/authz mechanism employs a 1-to-many
-	// communication path, i.e. one client to many servers;
-	// consequentely, there is no negotiation between the client and
-	// the server;  the server uses whatever the client sends, in one
-	// shot, and that's it; all servers receive the same identity token
-	// from the client; so the key is generated on the client side and
-	// sent to the servers encrypted with the user's public key; the
-	// servers decrypt the session key with the users's private key and
-	// subsequently use it; the encryption and decryption with the
-	// user's public and private key requires a key type that supports
-	// such operations and the DSA standard does not support encryption
-	// and decryption (that's not to say that one cannot use elliptic
-	// keys to encrypt and decrypt data); consequently, the session key
-	// can be distributed only if the user's identity file contains an
-	// RSA key (i.e. it is either an SSH-1 or SSH-2 RSA identity file);
-	size_t skeylen = 0; unsigned char *keybuf = NULL;
-do {
-	if (rsapub) {
-		if (!(keybuf = malloc(2*(skeylen=OSSL_FNCSELECT(_RSA_size)(rsapub))))) {
-			// unable to allocate memory for the encrypted key
-			// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = OSSH_MEMORY_ERR; break;
-		}
-		if (rc = _generate_session_key(rsapub, keybuf, &skeylen)) break;
-	}
-	// write the encrypted key and its length
-	if (idtoklen<(cidlen+sizeof(unsigned short)+skeylen)) {
-		// not enough space in the allocated id token buffer--need to
-		// reallocate
-		if (rc = _increase_tknsize(cidlen+sizeof(unsigned short)+skeylen, (void **)&idtokbuf, &idtoklen)) break;
-	}
-	*((unsigned short *)(idtokbuf+cidlen)) = htons((unsigned short)skeylen); cidlen += sizeof(unsigned short);
-	if (skeylen) {
-		memcpy((void *)(idtokbuf+cidlen), (void *)keybuf, skeylen);
-		cidlen += skeylen;
-	}
-} while (0);
-	if (keybuf) free(keybuf);
-	if (rc) break;
-}
-{	// time stamp the id token
-	Uu_int64_t tmstamp;
-	tmstamp.l = time(NULL);
-#if BYTE_ORDER == LITTLE_ENDIAN
-	*((u_int32_t *)(idtokbuf+IDTOK_OFFST_TMSTAMP)) = htonl(tmstamp.i[1]);
-	*((u_int32_t *)(idtokbuf+IDTOK_OFFST_TMSTAMP+sizeof(tmstamp.i[1]))) = htonl(tmstamp.i[0]);
-#elif BYTE_ORDER == BIG_ENDIAN
-	*((u_int32_t *)(idtokbuf+IDTOK_OFFST_TMSTAMP)) = htonl(tmstamp.i[0]);
-	*((u_int32_t *)(idtokbuf+IDTOK_OFFST_TMSTAMP+sizeof(tmstamp.i[0]))) = htonl(tmstamp.i[1]);
-#else
-#error BYTE_ORDER must be either BIG_ENDIAN or LITTLE_ENDIAN
-#endif
-}
-{	// sign the id token
-	char idtoksha1[20] = "";
-	unsigned int idtoksiglen = dsaprv?OSSL_FNCSELECT(_DSA_size)(dsaprv):OSSL_FNCSELECT(_RSA_size)(rsaprv);
-	if (0==idtoksiglen) {
-		// printf("Error [%s:%d]: invalid public key size...\n", __FILE__, __LINE__);
-		rc = OSSH_DRSA_SIZE_ERR; break;
-	}
-	if (!OSSL_FNCSELECT(_SHA1)(idtokbuf, cidlen, idtoksha1)) {
-		// printf("Error [%s:%d]: SHA1() failed for id token\n", __FILE__, __LINE__);
-		rc = OSSH_SHA1_ERR; break;
-	}
-	if (idtoklen<cidlen+sizeof(unsigned short)+idtoksiglen) {
-		// not enough space in the allocated id token buffer--need to
-		// reallocate
-		if (rc = _increase_tknsize(cidlen+sizeof(unsigned short)+idtoksiglen, (void **)&idtokbuf, &idtoklen)) break;
-	}
-	cidlen += sizeof(unsigned short);
-	// write the signature...
-	if (!(dsaprv?OSSL_FNCSELECT(_DSA_sign)(NID_sha1, idtoksha1, 20, (char *)(idtokbuf+cidlen), &idtoksiglen, dsaprv): OSSL_FNCSELECT(_RSA_sign)(NID_sha1, idtoksha1, 20, (char *)(idtokbuf+cidlen), &idtoksiglen, rsaprv))) {
-		// printf("Error [%s:%d]: DSA/RSA_sign() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_DRSA_SIGN_ERR; break;
-	}
-	// ...and the signature length
-	*((unsigned short *)(idtokbuf+cidlen-sizeof(unsigned short))) = htons((unsigned short)idtoksiglen); cidlen += idtoksiglen;
-	// scale back the memory allocated for the id token buf. if need be
-	if (cidlen<idtoklen) idtokbuf = realloc(idtokbuf, cidlen);
-	idtok->iov_base = idtokbuf; idtok->iov_len = cidlen;
-}
-} while (0);
-	if (rc) { memset(idtokbuf, 0, idtoklen); free(idtokbuf); }
-}
-} while (0);
-	pthread_cleanup_pop(1);		// _nfree(usrid)
-}
-} while (0);
-	// cleanup the public keys
-	if (rsaprv) OSSL_FNCSELECT(_RSA_free)(rsaprv); if (rsapub) OSSL_FNCSELECT(_RSA_free)(rsapub);
-	if (dsaprv) OSSL_FNCSELECT(_DSA_free)(dsaprv); if (dsapub) OSSL_FNCSELECT(_DSA_free)(dsapub);
-}
-} while (0);
-	pthread_cleanup_pop(1);		// free(pubidfpath);
-} while (0);
-	pthread_cleanup_pop(1);		// free(idfpath);
-}
-} while (0);
-	return rc;
-}
-
-#define IDTOK_STAT_VRFIED 0x80
-#define IDTOK_STAT_ISVRFIED(idtok) \
-	(IDTOK_STAT_VRFIED&(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER))))
-#define IDTOK_STAT_SETVRFIED(idtok) \
-	(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER)) |= IDTOK_STAT_VRFIED)
-#define IDTOK_STAT_CLRVRFIED(idtok) \
-	(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER)) &= ~IDTOK_STAT_VRFIED)
-#define IDTOK_STAT_SKEY 0x40
-#define IDTOK_STAT_HASKEY(idtok) \
-	(IDTOK_STAT_SKEY&(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER))))
-#define IDTOK_STAT_SETSKEY(idtok) \
-	(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER)) |= IDTOK_STAT_SKEY)
-#define IDTOK_STAT_CLRSKEY(idtok) \
-	(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER)) &= ~IDTOK_STAT_SKEY)
-int
-psm__verify_id_token(
-	char *uname,
-	psm_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	if (!idtok || !idtok->iov_base || (IDTOK_LEN_MIN>=idtok->iov_len)) {
-		// printf("Error [%s:%d]: invalid id buffer descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (!uname||('\0'==uname[0])) {
-		// printf("Error [%s:%d]: invalid user name\n", __FILE__, __LINE__);
-		rc = OSSH_UNAME_INVALID_ERR; break;
-	}
-{	// check the id token
-	size_t idtokbuflen = 0; unsigned char keytype = 0;
-	char *cp = idtok->iov_base; int idtokver = 0;
-	if (strncmp(cp, "ossh", strlen("ossh"))) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	} else cp += strlen("ossh");
-	if ((1!=(idtokver=0x0f&(*((unsigned char *)cp))))&&(2!=idtokver)) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	} else cp += sizeof(unsigned char);
-	if ((0x01!=(keytype = *cp))&&(0x02!=keytype)) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	} else cp += sizeof(unsigned char);
-	// skip the nonce
-	cp += sizeof(Uu_int64_t);
-{	// check the time against the skew
-	time_t ltime = time(NULL);
-	Uu_int64_t tmstamp = {0};
-#if BYTE_ORDER == LITTLE_ENDIAN
-	tmstamp.i[1] = ntohl(*((u_int32_t *)cp)); cp += sizeof(tmstamp.i[1]);
-	tmstamp.i[0] = ntohl(*((u_int32_t *)cp)); cp += sizeof(tmstamp.i[0]);
-#elif BYTE_ORDER == BIG_ENDIAN
-	tmstamp.i[0] = ntohl(*((u_int32_t *)cp)); cp += sizeof(tmstamp.i[0]);
-	tmstamp.i[1] = ntohl(*((u_int32_t *)cp)); cp += sizeof(tmstamp.i[1]);
-#endif
-	if (_idtokTTL&&(ltime>(time_t)tmstamp.l+_idtokTTL)) {
-		// printf("Error [%s:%d]: id token skew too big\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_SKEW_ERR; break;
-	}
-}
-{	// check the remote user id
-	unsigned short tuserlen = ntohs(*((unsigned short *)cp)); cp += sizeof(unsigned short);
-	if (tuserlen&&((tuserlen!=strlen(uname))||strncmp(uname, cp, tuserlen))) {
-		// printf("Error [%s:%d]: id token not valid for target user %s\n", __FILE__, __LINE__, uname);
-		rc = OSSH_IDTOK_USER_ERR; break;
-	}
-	cp += tuserlen;
-}
-{	// skip the host -- we'll come back to it, if need be
-	unsigned short thostlen = ntohs(*((unsigned short *)cp)); cp += sizeof(unsigned short);
-	cp += thostlen;
-}
-{
-	char *rusrnid, idtoksha1[20] = "";
-	unsigned short rusrnidlen = ntohs(*((unsigned short *)cp)); cp += sizeof(unsigned short);
-	if (!rusrnidlen) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (idtok->iov_len<((void *)cp-idtok->iov_base+rusrnidlen)) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (!(rusrnid = malloc(rusrnidlen+1))) {
-		// printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, rusrnid);
-do {
-	strncpy(rusrnid, cp, rusrnidlen); rusrnid[rusrnidlen] = '\0';
-	// skip the target user id
-	cp += rusrnidlen;
-	// skip the session key, if any
-	if (1<idtokver) {
-		// id tokens version 2 and above have a session key field
-		unsigned short skeylen = ntohs(*((unsigned short *)cp));
-		cp += sizeof(unsigned short)+skeylen;
-	}
-	idtokbuflen = (size_t)((void *)cp-idtok->iov_base);
-	// calculate the SHA1 digest
-	if (!(OSSL_FNCSELECT(_SHA1)(idtok->iov_base, idtokbuflen, idtoksha1))) {
-		// printf("Error [%s:%d]: SHA1() failed for id token\n", __FILE__, __LINE__);
-		rc = OSSH_SHA1_ERR; break;
-	}
-{	// get the signature and its length
-	unsigned short idtoksiglen = ntohs(*((unsigned short *)cp));
-	unsigned char *idtoksig = (unsigned char *)(cp+=sizeof(unsigned short));
-	if (!idtoksiglen) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (idtok->iov_len<((void *)cp-idtok->iov_base+idtoksiglen)) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-{	// get the name of the authorized key file
-	char *azfpath = NULL;
-	if (rc = _get_authz_fname(uname, &azfpath)) {
-		// printf("Error [%s:%d]: invalid authorized key file\n", __FILE__, __LINE__);
-		break;
-	}
-	pthread_cleanup_push((void(*)(void *))free, azfpath);
-do {
-	// open the authorized keys file and read it, one line at a time
-	FILE *azfstrm = NULL;
-	if (!(azfstrm=fopen(azfpath, "r"))) {
-		// printf("Error [%s:%d]: fopen() failed for %s: errno = %d\n", __FILE__, __LINE__, azfpath, errno);
-		rc = OSSH_AUTHZFILE_OPEN_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))fclose, azfstrm);
-do {
-	char *cp, pubkeydata[8*1024] = "";
-	do {
-		if (!(cp = fgets(pubkeydata, 8*1024, azfstrm))) {
-			// printf("Error [%s:%d]: fgets() failed or EOF\n", __FILE__, __LINE__);
-			rc = OSSH_AUTHZFILE_GETS_ERR; break;
-		}
-		if ('#' != *cp) {
-			DSA *dsapub = NULL; RSA *rsapub = NULL; char *usrid = NULL;
-			// try to read the key data as RSA
-			if (0x01==keytype) {
-				if (!(dsapub = _read_dsa_public_key(cp, &usrid))) continue;
-				if (usrid&&strcmp(usrid, rusrnid)) {
-					// user ids don't match
-					OSSL_FNCSELECT(_DSA_free)(dsapub); free(usrid); continue;
-				}
-				rc = OSSL_FNCSELECT(_DSA_verify)(NID_sha1, idtoksha1, 20, idtoksig, idtoksiglen, dsapub); OSSL_FNCSELECT(_DSA_free)(dsapub);
-				if (!rc||(0>rc)) {
-					rc = OSSH_DSA_VERIFY_ERR;
-					// printf("Error [%s:%d]: DSA_verify() failed...\n", __FILE__, __LINE__);
-					// there is no user id associated w/this key, so
-					// I'll continue searching for another DSA key
-					continue;
-				} else rc = 0;
-				if (usrid) free(usrid);
-				break;
-			}
-			if (0x02==keytype) {
-				if (!(rsapub = _read_rsa_public_key(cp, &usrid))) continue;
-				if (usrid&&strcmp(usrid, rusrnid)) {
-					// user ids don't match
-					OSSL_FNCSELECT(_RSA_free)(rsapub); free(usrid); continue;
-				}
-				rc = OSSL_FNCSELECT(_RSA_verify)(NID_sha1, idtoksha1, 20, idtoksig, idtoksiglen, rsapub); OSSL_FNCSELECT(_RSA_free)(rsapub);
-				if (!rc||(0>rc)) {
-					rc = OSSH_RSA_VERIFY_ERR;
-					// printf("Error [%s:%d]: RSA_verify() failed...\n", __FILE__, __LINE__);
-					// there is no user id associated w/this key, so
-					// I'll continue searching for another RSA key
-					continue;
-				} else rc = 0;
-				if (usrid) free(usrid);
-				break;
-			}
-		}
-	} while (1);
-	if (rc) {
-		// just to make sure the verified bit is not on
-		IDTOK_STAT_CLRVRFIED(idtok);
-		break;
-	} else IDTOK_STAT_SETVRFIED(idtok);
-} while (0);
-	pthread_cleanup_pop(1);		// fclose(azfstrm);
-} while (0);
-	pthread_cleanup_pop(1);		// free(azfpath);
-}
-}
-} while (0);
-	pthread_cleanup_pop(1);		// free(rusrnid);
-}
-}
-} while (0);
-	return rc;
-}
-
-int
-psm__free_id_token(
-	psm_idbuf_t idtok)
-{
-	int rc = 0;
-do {
-	if (!idtok || !idtok->iov_base || (0==idtok->iov_len)) {
-		// printf("Error [%s:%d]: invalid id buffer descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	free(idtok->iov_base);
-	idtok->iov_base = (void *)NULL; idtok->iov_len = 0;
-} while (0);
-	return rc;
-}
-
-int
-psm__get_id_from_token(
-	psm_idbuf_t idtok,
-	char *usrnid,
-	size_t *usrnidlen)
-{
-	int rc = 0;
-do {
-	if (!idtok || !idtok->iov_base || (0==idtok->iov_len)) {
-		// printf("Error [%s:%d]: invalid id buffer descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (!usrnidlen) {
-		// printf("Error [%s:%d]: invalid userid buffer length\n", __FILE__, __LINE__);
-		rc = OSSH_ARG_ERR; break;
-	}
-	if (!IDTOK_STAT_ISVRFIED(idtok)) {
-		// printf("Error [%s:%d]: identity token is not verified\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_NOTVERIFD_ERR; break;
-	}
-{	size_t tusrnidlen; char *tusrnid;
-	size_t nidoffset = IDTOK_OFFST_IDDATA;
-	// skip the target user name
-	nidoffset += ntohs(*((unsigned short *)(idtok->iov_base+nidoffset)))+sizeof(unsigned short);
-	// skip the target host name
-	nidoffset += ntohs(*((unsigned short *)(idtok->iov_base+nidoffset)))+sizeof(unsigned short);
-	// get the user name (i.e. the client's name)
-	tusrnidlen = ntohs(*((unsigned short *)(idtok->iov_base+nidoffset)))+1;
-	if ((*usrnidlen<tusrnidlen)||(!usrnid)) { *usrnidlen = tusrnidlen; rc = PSM__MEMORY_ERR; break; }
-	tusrnid = (char *)(idtok->iov_base+nidoffset+sizeof(unsigned short)); \
-	strncpy(usrnid, tusrnid, tusrnidlen-1); usrnid[tusrnidlen-1] = '\0';
-	*usrnidlen = tusrnidlen;
-}
-} while (0);
-	return rc;
-}
-
-int
-psm__get_key_from_token(
-	char *uname,
-	psm_idbuf_t idtok,
-	unsigned char *keybuf,
-	size_t *keylen)
-{
-	int rc = 0;
-do {
-	if (!idtok || (NULL==idtok->iov_base) || (IDTOK_LEN_MIN>idtok->iov_len)) {
-		// printf("Error [%s:%d]: invalid id buffer descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-	if (!keylen) {
-		// printf("Error [%s:%d]: invalid key buffer length\n", __FILE__, __LINE__);
-		rc = OSSH_ARG_ERR; break;
-	}
-	if (!keybuf || (16>*keylen)) {
-		// printf("Error [%s:%d]: not enough memory for the session key\n", __FILE__, __LINE__);
-		*keylen = 16; rc = PSM__MEMORY_ERR; break;
-	}
-	// if user argument is provided, then I expect the token to have
-	// been verified first
-	if (uname && ('\0'!=*uname) && !IDTOK_STAT_ISVRFIED(idtok)) {
-		// printf("Error [%s:%d]: identity token is not verified\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_NOTVERIFD_ERR; break;
-	}
-	// check the identity token
-	if (strncmp((char *)idtok->iov_base, "ossh", strlen("ossh"))) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-{	unsigned char idtokver = 0x0f&(*((unsigned char *)(idtok->iov_base+IDTOK_OFFST_STATVER)));
-	if (2!=idtokver) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_IDTOK_INVALID_ERR; break;
-	}
-}
-{	unsigned char keytype = *((unsigned char *)(idtok->iov_base+IDTOK_OFFST_KEYTYPE));
-	if (0x02!=keytype) {
-		// printf("Error [%s:%d]: invalid id token\n", __FILE__, __LINE__);
-		rc = OSSH_SKEY_NOTRSA_ERR; break;
-	}
-}
-{	// check the user name, if provided
-	char *cp = idtok->iov_base+IDTOK_OFFST_IDDATA;
-{	size_t tuserlen = ntohs(*((unsigned short *)cp)); cp += sizeof(unsigned short);
-	if (uname && ('\0' != *uname)) {
-		// make sure it's the same as the remote user in the id token
-		if (tuserlen&&((tuserlen!=strlen(uname))||strncmp(uname, cp-sizeof(unsigned short), tuserlen))) {
-			// printf("Error [%s:%d]: id token not valid for target user %s\n", __FILE__, __LINE__, uname);
-			rc = OSSH_IDTOK_USER_ERR; break;
-		}
-	}
-	cp += tuserlen;
-}
-	// skip the host name
-	cp += ntohs(*((unsigned short *)cp)) + sizeof(unsigned short);
-	// skip the remote user network id
-	cp += ntohs(*((unsigned short *)cp)) + sizeof(unsigned short);
-{	// check whether there is a session key
-	// the public key used is RSA and there is a session key
-	// get the user's identity file and try to de decrypt the
-	// session key; if the user's identity file matches the public
-	// keys used to initially encrypt the session key, then we can
-	// decrypt the session key and will replace it w/the decrypted
-	// value;  this should work as the session key should be a
-	// 128bit AES key, which is smaller than its encrypted version
-	// (which is the size of the RSA key, at least 512bits);
-	// any error encountered in this code path will not result
-	// in invalidating the identity token, because the token has
-	// already been verified; however, it will rezult in no session
-	// key and no subsequent message authentication services
-	size_t ekeylen = ntohs(*((unsigned short *)cp));
-	if (0 == ekeylen) {
-		// printf("Error [%s:%d]: no session key in id token\n", __FILE__, __LINE__);
-		rc = OSSH_SKEY_NOKEY_ERR; break;
-	}
-	cp += sizeof(unsigned short);
-{	char *idfpath = NULL; RSA *rsaprv = NULL;
-	if (rc = _get_identity_fname(uname, NULL, NULL, &idfpath)) break;
-	pthread_cleanup_push((void(*)(void *))free, idfpath);
-do {	// open the private identity file
-	FILE *idfstrm = fopen(idfpath, "r");
-	if (!idfstrm) {
-		// printf("Error [%s:%d]: fopen() failed for %s: errno = %d\n", __FILE__, __LINE__, idfpath, errno);
-		rc = OSSH_IDFILE_OPEN_ERR; break;
-	}
-	pthread_cleanup_push((void(*)(void *))fclose, idfstrm);
-do {	// read the private key
-	if (rsaprv = _read_rsa1_private_key(idfstrm)) break;
-	// rewind the stream to the beginning
-	fseek(idfstrm, 0, SEEK_SET);
-	if (rsaprv = OSSL_FNCSELECT(_PEM_read_RSAPrivateKey)(idfstrm, NULL, NULL, "")) break;
-	// printf("Error [%s:%d]: unable to read user's private key\n", __FILE__, __LINE__);
-	rc = OSSH_IDFILE_READ_ERR; break;
-} while (0);
-	pthread_cleanup_pop(1);		// fclose(idfstrm);
-} while (0);
-	pthread_cleanup_pop(1);		// free(idfpath);
-	if (rc) break;
-	pthread_cleanup_push((void(*)(void *))OSSL_FNCSELECT(_RSA_free), rsaprv);
-do {	// now that I have the private key, decrypt the session key
-	if (rc = _recover_session_key(rsaprv, cp, ekeylen, keybuf, keylen)) break;
-} while (0);
-	pthread_cleanup_pop(1);		// OSSL_FNCSELECT(_RSA_free)
-}
-}
-}
-} while (0);
-	return rc;
-}
-
-int
-_generate_md5_digest(
-	struct iovec *in,
-	int cnt,
-	unsigned char *digest)
-{
-	// assumes valid arguments
-	int rc = 0;
-	struct iovec *tdata = in;
-do {
-	MD5_CTX md5ctx = {0};
-	// initialize the MD5 engine
-	if (1 != OSSL_FNCSELECT(_MD5_Init)(&md5ctx)) {
-		// printf("Error [%s:%d]: MD5_Init() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_MD5_INIT_ERR; break;
-	}
-	while (cnt--) {
-		if (1 != OSSL_FNCSELECT(_MD5_Update)(&md5ctx, tdata->iov_base, tdata->iov_len)) {
-			// printf("Error [%s:%d]: MD5_Update() failed...\n", __FILE__, __LINE__);
-			rc = OSSH_MD5_UPDATE_ERR; break;
-		}
-		tdata++;
-	}
-	if (rc) break;
-	if (1 != OSSL_FNCSELECT(_MD5_Final)(digest, &md5ctx)) {
-		// printf("Error [%s:%d]: MD5_Final() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_MD5_FINAL_ERR; break;
-	}
-} while (0);
-	return rc;
-}
-
-int
-psm__sign_data(
-	unsigned char *key,
-	size_t keylen,
-	struct iovec *in,
-	int cnt,
-	struct iovec *sig)
-{
-	// generate an MD5 digest of the messages received and then encrypt
-	// the digest w/the 128bit AES key
-	// data points to a NULL-terminated array of struct iovec scalars
-	int rc = 0;
-do {
-	if (!in || (0 == cnt)) {
-		// printf("Error [%s:%d]: invalid data vector\n", __FILE__, __LINE__);
-		rc = OSSH_DATA_INVALID_ERR; break;
-	}
-{
-	// generate the md5 digest
-	unsigned char md5digest[MD5_DIGEST_LENGTH];
-	if (rc = _generate_md5_digest(in, cnt, md5digest)) break;
-{	// sign the digest w/the AES key
-	AES_KEY keysched = {0};
-	unsigned char *aescipher = malloc(AES_BLOCK_SIZE);
-	if (!aescipher) {
-		// printf("Error [%s:%d]: malloc() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_MEMORY_ERR; break;
-	}
-	if (rc = OSSL_FNCSELECT(_AES_set_encrypt_key)(key, 8*keylen, &keysched)) {
-		// printf("Error [%s:%d]: AES_set_encrypt_key() failed...\n", __FILE__, __LINE__);
-		rc = OSSH_AES_KEYSCHED_ERR; break;
-	}
-	OSSL_FNCSELECT(_AES_encrypt)(md5digest, aescipher, &keysched);
-	sig->iov_base = aescipher; sig->iov_len = AES_BLOCK_SIZE;
-}
-}
-} while (0);
-	return rc;
-}
-
-int
-psm__verify_data(
-	unsigned char *key,
-	size_t keylen,
-	struct iovec *in,
-	int cnt,
-	struct iovec *sig)
-{
-	int rc = 0;
-do {
-	if (!sig||(!sig->iov_base)||(16!=sig->iov_len)) {
-		// printf("Error [%s:%d]: signature is not valid\n", __FILE__, __LINE__);
-		rc = OSSH_SIG_INVALID_ERR; break;
-	}
-{	struct iovec tsig = {0};
-	if (rc = psm__sign_data(key, keylen, in, cnt, &tsig)) break;
-	if ((tsig.iov_len!=sig->iov_len)||memcmp(tsig.iov_base, sig->iov_base, tsig.iov_len)) {
-		// printf("Error [%s:%d]: signature verification failed\n", __FILE__, __LINE__);
-		rc = OSSH_SIG_SIGNATURE_ERR;
-	}
-	psm__free_signature(&tsig);
-}
-} while (0);
-	return rc;
-}
-
-int
-psm__free_signature(
-	struct iovec *sig)
-{
-	int rc = 0;
-do {
-	if (!sig || (0==sig->iov_len) || (!sig->iov_base)) {
-		// printf("Error [%s:%d]: invalid signature descriptor\n", __FILE__, __LINE__);
-		rc = OSSH_SIG_INVALID_ERR; break;
-	}
-	free(sig->iov_base);
-	sig->iov_base = (void *)NULL; sig->iov_len = 0;
-} while (0);
-	return rc;
-}
-
-// EOF
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.h b/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.h
deleted file mode 100644
index 37c6d39..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_openssh.h
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "psec_mod.h"
-
-#ifndef _H_PSEC_OSSH_H
-#define _H_PSEC_OSSH_H
-
-#define OSSH_MEMORY_ERR 1
-#define OSSH_PWUID_ERR 2
-#define OSSH_PWUID_HOMEDIR_ERR 3
-#define OSSH_IDTOK_INVALID_ERR 4
-#define OSSH_IDTOK_NOTVERIFD_ERR 5
-#define OSSH_IDTOK_SKEW_ERR 6
-#define OSSH_IDTOK_USER_ERR 7
-#define OSSH_UNAME_INVALID_ERR 8
-#define OSSH_DSA_INVALID_FORMAT_ERR 9
-#define OSSH_RSA_INVALID_FORMAT_ERR 10
-#define OSSH_CIPHER_VERIF_ERR 11
-#define OSSH_NOUSERID_ERR 12
-#define OSSH_USERID_LEN_ERR 13
-#define OSSH_ARG_ERR 14
-#define OSSH_IDTOK_NOSKEY_ERR 15
-
-#define OSSH_CFGFILE_ERR 20
-#define OSSH_CFGFILE_SIZE_ERR 21
-#define OSSH_CFGFILE_DATA_ERR 22
-#define OSSH_CFGFILE_OPEN_ERR 23
-#define OSSH_CFGFILE_GETS_ERR 24
-#define OSSH_IDFILE_NAME_ERR 25
-#define OSSH_IDFILE_PATH_ERR 26
-#define OSSH_IDFILE_SIZE_ERR 27
-#define OSSH_IDFILE_OPEN_ERR 28
-#define OSSH_IDFILE_READ_ERR 29
-#define OSSH_IDFILE_DEFS_ERR 30
-#define OSSH_PIDFILE_PATH_ERR 31
-#define OSSH_PIDFILE_SIZE_ERR 32
-#define OSSH_PIDFILE_OPEN_ERR 33
-#define OSSH_PIDFILE_GETS_ERR 34
-#define OSSH_AUTHZFILE_NAME_ERR 35
-#define OSSH_AUTHZFILE_PATH_ERR 36
-#define OSSH_AUTHZFILE_OPEN_ERR 37
-#define OSSH_AUTHZFILE_GETS_ERR 38
-
-#define OSSH_DSA_NEW_ERR 40
-#define OSSH_RSA_NEW_ERR 41
-#define OSSH_DRSA_SIZE_ERR 42
-#define OSSH_DRSA_SIGN_ERR 43
-#define OSSH_DSA_VERIFY_ERR 44
-#define OSSH_RSA_VERIFY_ERR 45
-#define OSSH_SHA1_ERR 46
-#define OSSH_BIO_NEW_MEMBUF_ERR 47
-#define OSSH_BIO_NEW_ERR 48
-#define OSSH_BIO_PUSH_ERR 49
-#define OSSH_BIO_READ_ERR 50
-#define OSSH_BN_BIN2BN_ERR 51 
-#define OSSH_BN_DEC2BN_ERR 52
-#define OSSH_RSA_PUBLIC_ENCRYPT_ERR 53
-#define OSSH_RSA_PRIVATE_DECRYPT_ERR 54
-#define OSSH_SIG_INVALID_ERR 55
-#define OSSH_DATA_INVALID_ERR 56
-#define OSSH_MD5_INIT_ERR 57
-#define OSSH_MD5_UPDATE_ERR 57
-#define OSSH_MD5_FINAL_ERR 58
-
-#define OSSH_PTHRD_SETSPECIFIC_ERR 60
-#define OSSH_PTHRD_KEYCREATE_ERR 61
-#define OSSH_DLSYM_ERR 62
-#define OSSH_DLOPEN_ERR 63
-
-#define OSSH_SKEY_NOTRSA_ERR 70
-#define OSSH_SKEY_NOKEY_ERR 71
-#define OSSH_AES_KEYSCHED_ERR 72
-#define OSSH_AES_ENCRYPT_ERR 73
-#define OSSH_SIG_SIGNATURE_ERR 74
-
-#endif	// _H_PSEC_OSSH_H
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_test.c b/tools/sci/org.eclipse.ptp.sci/secmod/psec_test.c
deleted file mode 100644
index 214ad32..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_test.c
+++ /dev/null
@@ -1,279 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <pwd.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-
-#include "psec.h"
-
-unsigned char testdata[] = {
-0xde, 0xad, 0xbe, 0xef, 0x15, 0x04, 0x16, 0x89, 0x92, 0x73, 0x30, 0x68,
-0x19, 0xa7, 0xb7, 0x2d, 0xde, 0xbe, 0xff, 0x00, 0x79, 0xc8, 0x8f, 0x5b,
-0x30, 0x50, 0x67, 0x58, 0xdf, 0x11, 0x94, 0xe3, 0x8b, 0x39, 0x33, 0x94,
-0x93, 0x83, 0xaa, 0x93, 0xa9, 0x93, 0xf2, 0x3d, 0x3e, 0x0d, 0x83, 0xf8,
-0x38, 0x47, 0xd3, 0x8a, 0x85, 0x78, 0x82, 0x58, 0x56, 0xa9, 0x9a, 0x67,
-0x01, 0x47, 0xab, 0xe7, 0x23, 0xc0, 0xf1, 0x38, 0xa7, 0xf0, 0x91, 0xc8};
-struct iovec testvector[3] = {{(void *)testdata, 13}, {(void *)testdata+17, 23}, {(void *)testdata+50, 6}};
-
-int
-main(int argc, char *argv[])
-{
-	int rc = 0;
-	unsigned int amdlhndl = 0;
-	char amfpath[PATH_MAX] = "", idtokfpath[PATH_MAX] = "", *cp, *progname = ((cp=strrchr(argv[0], '/'))?cp++:argv[0]);
-	int creatver = 0;
-	struct iovec signature = {0};
-	char *username = NULL;
-do {
-	if ((2!=argc)&&(4!=argc)&&(5!=argc)) {
-		printf("Error [%s:%d]: invalid number of arguments\n", __FILE__, __LINE__);
-		printf("Usage:\n	%s <auth module file>\n", progname);
-		printf("or\n	%s <auth module file> [create|verify] <id token file>\n", progname);
-		printf("or\n	%s {<auth module file>} verify <id token file> <user name>\n", progname);
-		printf("\nwhere\n""	<auth module file> is relative to current directory\n""	<id token file> is relative to current directory\n""<user name> is the target user\n");
-		rc = -1; break;
-	}
-	if (2<argc) {
-do {
-		if (('c'==*(argv[2]))&&(strstr("create", argv[2]))) {
-			creatver = 1; break;
-		}
-		if (('v'==*(argv[2]))&&(strstr("verify", argv[2]))) {
-			creatver = 2; break;
-		}
-		printf("Error [%s:%d]: invalid action: %s\n", __FILE__, __LINE__, argv[2]);
-		rc = -1;
-} while (0);
-		if (rc) break;
-	}
-	if ((5==argc)&&(2==creatver)) username = argv[4];
-	// get current directory
-	if (0>getcwd(amfpath, PATH_MAX)) {
-		printf("Error [%s:%d]: getcwd() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = -1; break;
-	}
-	if ('/' != amfpath[strlen(amfpath)]) strcat(amfpath, "/");
-	strcpy(idtokfpath, amfpath);
-	strcat(amfpath, argv[1]);
-	if (rc = psec_set_auth_module(NULL, amfpath, "m[t=-1]", &amdlhndl)) {
-		printf("Error [%s:%d]: psec_set_auth_module() failed\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-{
-	psec_idbuf_desc idbufd = {0};
-	if (2!=creatver) {
-		// we need to get an id token
-		if (rc = psec_get_id_token(amdlhndl, NULL, NULL, &idbufd)) {
-			printf("Error [%s:%d]: psec_get_id_token() failed with rc = %d\n", __FILE__, __LINE__, rc);
-			rc = -1; break;
-		}
-		if (1==creatver) {
-			// save the id token in the file provided and exit
-			strcat(idtokfpath, argv[3]);
-{
-			int idtokfd = -1; size_t nbytes = -1;
-			if (0>(idtokfd = open(idtokfpath, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR))) {
-				printf("Error [%s:%d]: open() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-				rc = -1; break;
-			}
-do {
-			if (0>(nbytes=write(idtokfd, idbufd.iov_base, idbufd.iov_len))) {
-				printf("Error [%s:%d]: write() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-				rc = -1; break;
-			}
-			if (nbytes!=idbufd.iov_len) {
-				printf("Error [%s:%d]: failure to write entire id token to file\n", __FILE__, __LINE__);
-				rc = -1; break;
-			}
-} while (0);
-			close(idtokfd);
-}
-			break;
-		} else {
-			// get the session key
-			unsigned char skey[10], *skeyp = skey; size_t skeylen = 10;
-do {
-do {
-			if (!(rc = psec_get_key_from_token(amdlhndl, NULL, &idbufd, skeyp, &skeylen))) break; 
-			if (PSEC_MEMORY_ERR!=rc) {
-				printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-				break;
-			}
-			if (!skeylen) {
-				printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-				break;
-			}
-			skeyp = malloc(skeylen); assert(skeyp);
-			if (rc = psec_get_key_from_token(amdlhndl, NULL, &idbufd, skeyp, &skeylen)) {
-				printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-				break;
-			}
-} while (0);
-			if (rc) break;
-			// use some test data to sign
-			if (rc = psec_sign_data(amdlhndl, skeyp, skeylen, testvector, 3, &signature)) {
-				printf("Error [%s:%d]: psec_sign_data() failed: rc = %d\n", __FILE__, __LINE__);
-				break;
-			}
-{			// one more time, for consistency
-			struct iovec sig2 = {0};
-			if (rc = psec_sign_data(amdlhndl, skeyp, skeylen, testvector, 3, &sig2)) {
-				printf("Error [%s:%d]: psec_sign_data() failed: rc = %d\n", __FILE__, __LINE__);
-				break;
-			}
-			if (memcmp(sig2.iov_base, signature.iov_base, sig2.iov_len)) {
-				printf("Error [%s:%d]: psec_sign_data() failed with inconsistent results\n", __FILE__, __LINE__);
-				rc = -1; break;
-			}
-}
-} while (0);
-			if (skeyp != skey) free (skeyp);
-			if (rc) break;
-		}
-	}
-do {
-	// get the current user name
-	long pwrbufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-	void *pwrbuf = malloc(pwrbufsize); assert(pwrbuf);
-do {
-	struct passwd usrpwd, *usrpwdp = NULL;
-	if (rc = getpwuid_r(geteuid(), &usrpwd, pwrbuf, pwrbufsize, &usrpwdp)) {
-		printf("Error [%s:%d]: getpwuid_r() failed: rc = %d\n", __FILE__, __LINE__, rc);
- 		rc = -1; break;
-	}
-	if (!usrpwd.pw_name) {
-		printf("Error: [%s:%d]: no user name available\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-	if (2==creatver) {
-		// read the id token from file
-		strcat(idtokfpath, argv[3]);
-{
-		size_t nbytes; int idtokfd = -1; struct stat idtokfstat = {0};
-		if (0>stat(idtokfpath, &idtokfstat)) {
-			printf("Error [%s:%d]: stat() failed w/errno = %d for %s\n", __FILE__, __LINE__, errno, idtokfpath);
-			rc = -1; break;
-		}
-		if (!idtokfstat.st_size) {
-			printf("Error [%s:%d]: invalid id token file: %s\n", __FILE__, __LINE__, idtokfpath);
-			rc = -1; break;
-		}
-		if (0>(idtokfd = open(idtokfpath, O_RDONLY))) {
-			printf("Error [%s:%d]: open() failed w/errno = %d for %s\n", __FILE__, __LINE__, errno, idtokfpath);
-			rc = -1; break;
-		}
-do {
-		if (!(idbufd.iov_base = malloc(idbufd.iov_len = idtokfstat.st_size))) {
-			printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-			rc = -1; break;
-		}
-		if (0>(nbytes = read(idtokfd, idbufd.iov_base, idbufd.iov_len))) {
-			printf("Error [%s:%d]: read() failed w/errno = %d for %s\n", __FILE__, __LINE__, errno, idtokfpath);
-			rc = -1; break;
-		}
-		if (nbytes!=idbufd.iov_len) {
-			printf("Error [%s:%d]: failed to read entire id token from %s\n", __FILE__, __LINE__, idtokfpath);
-			rc = -1; break;
-		}
-} while (0);
-		close(idtokfd);
-		if (rc) break;
-}
-	}
-	if (rc = psec_verify_id_token(amdlhndl, username?username:usrpwd.pw_name, &idbufd)) {
-		printf("Error [%s:%d]: psec_verify_id_token() failed\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-	printf("Info [%s:%d]: id token verified :-)\n", __FILE__, __LINE__);
-{	// get the user's NID from the id token
-	char usrnid[10] = "", *cp = usrnid; size_t usrnidlen = 10;
-	int freeusrnid = 0;
-do {
-	if (!(rc = psec_get_id_from_token(amdlhndl, &idbufd, cp, &usrnidlen))) break;
-	if ((PSEC_MEMORY_ERR!=rc)||(0==usrnidlen)) {
-		// memory error; break out of here
-		rc = -1; break;
-	}
-	// not enough memory provided for the user NID
-	// usrnidlen should have the size of memory we need to allocate
-	if (!(cp = malloc(usrnidlen))) {
-		printf("Error [%s:%d]: malloc() failed w/errno = %d\n", __FILE__, __LINE__, errno);
-		rc = -1; break;
-	}
-	freeusrnid++;
-	if (rc = psec_get_id_from_token(amdlhndl, &idbufd, cp, &usrnidlen)) {
-		printf("Error [%s:%d]: psec_get_id_from_token() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-		rc = -1; break;
-	}
-} while (0);
-	if (!rc) printf("Info [%s:%d]: user NID = %s\n", __FILE__, __LINE__, cp);
-	if (freeusrnid) free(cp);
-}
-{	// get the session key from the token and verify the signature
-	unsigned char skey[20], *skeyp = skey; size_t skeylen = 20;
-do {
-	if (!(rc = psec_get_key_from_token(amdlhndl, username?username:usrpwd.pw_name, &idbufd, skeyp, &skeylen))) break;
-	if (PSEC_MEMORY_ERR!=rc) {
-		printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-	if (!skeylen) {
-		printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-	skeyp = malloc(skeylen); assert(skeyp);
-	if (rc = psec_get_key_from_token(amdlhndl, username?username:usrpwd.pw_name, &idbufd, skeyp, &skeylen)) {
-		printf("Error [%s:%d]: psec_get_key_from_token() failed: rc = %d\n", __FILE__, __LINE__);
-		rc = -1; break;
-	}
-} while (0);
-	if (rc) break;
-	if (2!=creatver) {
-		// verify signature
-		if (rc = psec_verify_data(amdlhndl, skeyp, skeylen, testvector, 3,  &signature)) {
-			printf("Error [%s:%d]: psec_verify_data() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-			rc = -1; break;
-		}
-	}
-}
-} while (0);
-	free(pwrbuf);
-} while (0);
-	if ((2==creatver)&&idbufd.iov_base) free(idbufd.iov_base);
-	else psec_free_id_token(amdlhndl, &idbufd);
-}
-} while (0);
-	if (rc = psec_free_signature(amdlhndl, &signature)) {
-		printf("Error [%s:%d]: psec_free_signature() failed w/rc = %d\n", __FILE__, __LINE__, rc);
-	}
-	return rc;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/secmod/psec_utils.c b/tools/sci/org.eclipse.ptp.sci/secmod/psec_utils.c
deleted file mode 100644
index 1308847..0000000
--- a/tools/sci/org.eclipse.ptp.sci/secmod/psec_utils.c
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Description: psec functions from poe
-   
- Author: Serban Maerean
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 serban      Initial code (D153875)
-
-****************************************************************************/
-
-#include "psec_lib.h"
-
-/*- Double linked list routines -------------------------------------*/
-
-void
-__rm_elem_from_dllist(
-	__dlink_elem_t elem,
-	__dlink_elem_t *queue)
-{
-	/* assumes elem and queue are valid */
-	if (elem->next) {
-		if (elem->prev) {
-			/* somewhere in the middle */
-			elem->prev->next = elem->next;
-			elem->next->prev = elem->prev;
-		} else {
-			/* the first one */
-			*queue = elem->next;
-			elem->next->prev = NULL;
-		}
-	} else {
-		if (elem->prev) {
-			/* the last one */
-			elem->prev->next = NULL;
-		} else {
-			/* the only one */
-			*queue = NULL;
-		}
-	}
-	/* reset next and prev pointer */
-	elem->prev = elem->next = NULL;
-}
-
-void
-__add_elem_to_dllist(
-	__dlink_elem_t elem,
-	__dlink_elem_t *queue)
-{
-	/* assumes elem is valid */
-	elem->next = *queue; elem->prev = NULL;
-	if (*queue) (*queue)->prev = elem;
-	*queue = elem;
-}
-
-void
-__insert_elem_before_dllist(
-	__dlink_elem_t elem,
-	__dlink_elem_t *queue)
-{
-	/* assumes elem and queue are valid */
-	__dlink_elem_t tmp = (*queue)->prev;
-	if (tmp) {
-		tmp->next = elem;
-		elem->next = *queue; elem->prev = tmp;
-		(*queue)->prev = elem;
-	} else {
-		elem->next = *queue; elem->prev = NULL;
-		(*queue)->prev = elem; *queue = elem;
-	}
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/spec/sci_32bit.spec b/tools/sci/org.eclipse.ptp.sci/spec/sci_32bit.spec
deleted file mode 100644
index 7350ce5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/spec/sci_32bit.spec
+++ /dev/null
@@ -1,65 +0,0 @@
-Summary: SCI 32bit Run Time Library 
-Name: sci_32bit
-Version: 2
-Release: 0.0.0
-Group: IBM HPC
-License: IBM Corp.
-Packager: IBM
-URL: http://www.ibm.com
-Conflicts: N/A
-Vendor: IBM Corp.
-Source0: N/A
-NoSource: 0
-AutoReqProv: no
-
-%description
-IBM SCI 32bit Run Time Library 
-This package contains header files, shared libraries and executables.
-
-%undefine  __check_files
-
-%install
-
-%build
-
-%files
-# Library, header files, message catalog and README files.
-%attr( 755, bin, bin ) %dir /opt/sci
-
-# Header files
-%attr( 755, bin, bin ) %dir /opt/sci/include
-%attr( 644, bin, bin ) /opt/sci/include/sci.h
-
-# Libraries.
-%attr( 755, bin, bin ) %dir /opt/sci/lib
-%attr( 644, bin, bin ) /opt/sci/lib/libsci.so
-%attr( 644, bin, bin ) /opt/sci/lib/libsci.so.0
-%attr( 644, bin, bin ) /opt/sci/lib/libsci.so.0.0.0
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec.so
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec.so.0
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec.so.0.0.0
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec_ossh.so
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec_ossh.so.0
-%attr( 644, bin, bin ) /opt/sci/lib/libpsec_ossh.so.0.0.0
-
-# Executables
-%attr( 755, bin, bin ) %dir /opt/sci/bin
-%attr( 755, bin, bin ) /opt/sci/bin/scia
-%attr( 755, bin, bin ) %dir /opt/sci/sbin
-%attr( 755, bin, bin ) /opt/sci/sbin/scidv1
-
-# Pre-install script
-%pre
-
-# Post-install script
-%post
-/sbin/ldconfig
-
-# Pre-uninstall script
-%preun
-
-# Post-uninstall script
-# Run the following ONLY when performing uninstall (rpm -e),
-# skip if it is an upgrape (rpm -U).
-%postun
-
diff --git a/tools/sci/org.eclipse.ptp.sci/spec/sci_64bit.spec b/tools/sci/org.eclipse.ptp.sci/spec/sci_64bit.spec
deleted file mode 100644
index 2e39434..0000000
--- a/tools/sci/org.eclipse.ptp.sci/spec/sci_64bit.spec
+++ /dev/null
@@ -1,65 +0,0 @@
-Summary: SCI 64bit Run Time Library
-Name: sci_64bit
-Version: 2
-Release: 0.0.0
-Group: IBM HPC
-License: IBM Corp.
-Packager: IBM
-URL: http://www.ibm.com
-Conflicts: N/A
-Vendor: IBM Corp.
-Source0: N/A
-NoSource: 0
-AutoReqProv: no
-
-%description
-IBM SCI 64bit Run Time Library
-This package contains header files, shared libraries and executables.
-
-%undefine  __check_files
-
-%install
-
-%build
-
-%files
-# Library, header files, message catalog and README files.
-%attr( 755, bin, bin ) %dir /opt/sci
-
-# Header files
-%attr( 755, bin, bin ) %dir /opt/sci/include
-%attr( 644, bin, bin ) /opt/sci/include/sci.h
-
-# Libraries.
-%attr( 755, bin, bin ) %dir /opt/sci/lib64
-%attr( 644, bin, bin ) /opt/sci/lib64/libsci.so
-%attr( 644, bin, bin ) /opt/sci/lib64/libsci.so.0
-%attr( 644, bin, bin ) /opt/sci/lib64/libsci.so.0.0.0
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec.so
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec.so.0
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec.so.0.0.0
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec_ossh.so
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec_ossh.so.0
-%attr( 644, bin, bin ) /opt/sci/lib64/libpsec_ossh.so.0.0.0
-
-# Executables
-%attr( 755, bin, bin ) %dir /opt/sci/bin
-%attr( 755, bin, bin ) /opt/sci/bin/scia64
-%attr( 755, bin, bin ) %dir /opt/sci/sbin
-%attr( 755, bin, bin ) /opt/sci/sbin/scidv1
-
-# Pre-install script
-%pre
-
-# Post-install script
-%post
-/sbin/ldconfig
-
-# Pre-uninstall script
-%preun
-
-# Post-uninstall script
-# Run the following ONLY when performing uninstall (rpm -e),
-# skip if it is an upgrape (rpm -U).
-%postun
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/.cvsignore b/tools/sci/org.eclipse.ptp.sci/usecase/.cvsignore
deleted file mode 100644
index f3c7a7c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.am b/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.am
deleted file mode 100644
index f299d2b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.am
+++ /dev/null
@@ -1 +0,0 @@
-SUBDIRS = dsh dsh_2 dsh_filter dsh_filter2
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.in b/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.in
deleted file mode 100644
index 84d65b0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/Makefile.in
+++ /dev/null
@@ -1,554 +0,0 @@
-# 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@
-subdir = usecase
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_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
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-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"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-SUBDIRS = dsh dsh_2 dsh_filter dsh_filter2
-all: all-recursive
-
-.SUFFIXES:
-$(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) --gnu usecase/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu usecase/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):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# 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)
-	@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
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-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)
-
-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 mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic 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 Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: 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 check check-am clean clean-generic clean-libtool \
-	ctags ctags-recursive distclean distclean-generic \
-	distclean-libtool 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 installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/usecase/dsh/.cvsignore b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/.cvsignore
deleted file mode 100644
index 2696bd3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-gdsh_fe
-edsh_fe
-dsh_be
-dsh_fe
-ddsh_fe
-Makefile
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix
deleted file mode 100644
index 155a5a7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix
+++ /dev/null
@@ -1,49 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-
-all_32: dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-ddsh_fe: ddsh_fe.c
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ ddsh_fe.c $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-ddsh_fe64: ddsh_fe.c
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ ddsh_fe.c $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-	
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.am b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.am
deleted file mode 100644
index 42c977d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.am
+++ /dev/null
@@ -1,77 +0,0 @@
-dsh_fe64_SOURCES = dsh_fe.c
-edsh_fe64_SOURCES = edsh_fe.cpp
-gdsh_fe64_SOURCES = gdsh_fe.cpp
-ddsh_fe64_SOURCES = ddsh_fe.c
-dsh_be64_SOURCES = dsh_be.c
-dsh_fe_SOURCES = dsh_fe.c
-edsh_fe_SOURCES = edsh_fe.cpp
-gdsh_fe_SOURCES = gdsh_fe.cpp
-ddsh_fe_SOURCES = ddsh_fe.c
-dsh_be_SOURCES = dsh_be.c
-if SYSTEM_AIX
-if BIT64
-bin_PROGRAMS = dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
-dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-edsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-edsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-gdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-gdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-ddsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-ddsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-edsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-gdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-ddsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-ddsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-endif
-endif
-if SYSTEM_DARWIN
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-dsh_fe_CPPFLAGS = -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-edsh_fe_CPPFLAGS = -I../../common -I../../include
-edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-gdsh_fe_CPPFLAGS = -I../../common -I../../include
-gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-ddsh_fe_CPPFLAGS = -I../../common -I../../include
-ddsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_be_CPPFLAGS = -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-endif
-if SYSTEM_LINUX
-if BIT64
-bin_PROGRAMS = dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
-dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-edsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-edsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-gdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-gdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-ddsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-ddsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-edsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-edsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-gdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-gdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-ddsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-ddsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.in b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.in
deleted file mode 100644
index 3dcc53a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.in
+++ /dev/null
@@ -1,857 +0,0 @@
-# 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@
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	edsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	gdsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	ddsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be$(EXEEXT)
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	edsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	gdsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	ddsh_fe$(EXEEXT) dsh_be$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	edsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	gdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	ddsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be64$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	edsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	gdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	ddsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	dsh_be64$(EXEEXT)
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	edsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	gdsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	ddsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	dsh_be$(EXEEXT)
-subdir = usecase/dsh
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-am_ddsh_fe_OBJECTS = ddsh_fe-ddsh_fe.$(OBJEXT)
-ddsh_fe_OBJECTS = $(am_ddsh_fe_OBJECTS)
-ddsh_fe_LDADD = $(LDADD)
-ddsh_fe_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ddsh_fe_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_ddsh_fe64_OBJECTS = ddsh_fe64-ddsh_fe.$(OBJEXT)
-ddsh_fe64_OBJECTS = $(am_ddsh_fe64_OBJECTS)
-ddsh_fe64_LDADD = $(LDADD)
-ddsh_fe64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(ddsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_be_OBJECTS = dsh_be-dsh_be.$(OBJEXT)
-dsh_be_OBJECTS = $(am_dsh_be_OBJECTS)
-dsh_be_LDADD = $(LDADD)
-dsh_be_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_be64_OBJECTS = dsh_be64-dsh_be.$(OBJEXT)
-dsh_be64_OBJECTS = $(am_dsh_be64_OBJECTS)
-dsh_be64_LDADD = $(LDADD)
-dsh_be64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe_OBJECTS = dsh_fe-dsh_fe.$(OBJEXT)
-dsh_fe_OBJECTS = $(am_dsh_fe_OBJECTS)
-dsh_fe_LDADD = $(LDADD)
-dsh_fe_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe64_OBJECTS = dsh_fe64-dsh_fe.$(OBJEXT)
-dsh_fe64_OBJECTS = $(am_dsh_fe64_OBJECTS)
-dsh_fe64_LDADD = $(LDADD)
-dsh_fe64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_edsh_fe_OBJECTS = edsh_fe-edsh_fe.$(OBJEXT)
-edsh_fe_OBJECTS = $(am_edsh_fe_OBJECTS)
-edsh_fe_LDADD = $(LDADD)
-edsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(edsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_edsh_fe64_OBJECTS = edsh_fe64-edsh_fe.$(OBJEXT)
-edsh_fe64_OBJECTS = $(am_edsh_fe64_OBJECTS)
-edsh_fe64_LDADD = $(LDADD)
-edsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(edsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-am_gdsh_fe_OBJECTS = gdsh_fe-gdsh_fe.$(OBJEXT)
-gdsh_fe_OBJECTS = $(am_gdsh_fe_OBJECTS)
-gdsh_fe_LDADD = $(LDADD)
-gdsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(gdsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_gdsh_fe64_OBJECTS = gdsh_fe64-gdsh_fe.$(OBJEXT)
-gdsh_fe64_OBJECTS = $(am_gdsh_fe64_OBJECTS)
-gdsh_fe64_LDADD = $(LDADD)
-gdsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(gdsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-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 $@
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(ddsh_fe_SOURCES) $(ddsh_fe64_SOURCES) $(dsh_be_SOURCES) \
-	$(dsh_be64_SOURCES) $(dsh_fe_SOURCES) $(dsh_fe64_SOURCES) \
-	$(edsh_fe_SOURCES) $(edsh_fe64_SOURCES) $(gdsh_fe_SOURCES) \
-	$(gdsh_fe64_SOURCES)
-DIST_SOURCES = $(ddsh_fe_SOURCES) $(ddsh_fe64_SOURCES) \
-	$(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES) $(edsh_fe_SOURCES) $(edsh_fe64_SOURCES) \
-	$(gdsh_fe_SOURCES) $(gdsh_fe64_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-dsh_fe64_SOURCES = dsh_fe.c
-edsh_fe64_SOURCES = edsh_fe.cpp
-gdsh_fe64_SOURCES = gdsh_fe.cpp
-ddsh_fe64_SOURCES = ddsh_fe.c
-dsh_be64_SOURCES = dsh_be.c
-dsh_fe_SOURCES = dsh_fe.c
-edsh_fe_SOURCES = edsh_fe.cpp
-gdsh_fe_SOURCES = gdsh_fe.cpp
-ddsh_fe_SOURCES = ddsh_fe.c
-dsh_be_SOURCES = dsh_be.c
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@edsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@edsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@edsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@edsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@gdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@gdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@gdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@gdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@ddsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@ddsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@ddsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@ddsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@edsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@edsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@edsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@edsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@gdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@gdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@gdsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@gdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@ddsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@ddsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@ddsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@ddsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@ddsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@ddsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_be_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .cpp .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) --gnu usecase/dsh/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu usecase/dsh/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):
-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
-ddsh_fe$(EXEEXT): $(ddsh_fe_OBJECTS) $(ddsh_fe_DEPENDENCIES) 
-	@rm -f ddsh_fe$(EXEEXT)
-	$(ddsh_fe_LINK) $(ddsh_fe_OBJECTS) $(ddsh_fe_LDADD) $(LIBS)
-ddsh_fe64$(EXEEXT): $(ddsh_fe64_OBJECTS) $(ddsh_fe64_DEPENDENCIES) 
-	@rm -f ddsh_fe64$(EXEEXT)
-	$(ddsh_fe64_LINK) $(ddsh_fe64_OBJECTS) $(ddsh_fe64_LDADD) $(LIBS)
-dsh_be$(EXEEXT): $(dsh_be_OBJECTS) $(dsh_be_DEPENDENCIES) 
-	@rm -f dsh_be$(EXEEXT)
-	$(dsh_be_LINK) $(dsh_be_OBJECTS) $(dsh_be_LDADD) $(LIBS)
-dsh_be64$(EXEEXT): $(dsh_be64_OBJECTS) $(dsh_be64_DEPENDENCIES) 
-	@rm -f dsh_be64$(EXEEXT)
-	$(dsh_be64_LINK) $(dsh_be64_OBJECTS) $(dsh_be64_LDADD) $(LIBS)
-dsh_fe$(EXEEXT): $(dsh_fe_OBJECTS) $(dsh_fe_DEPENDENCIES) 
-	@rm -f dsh_fe$(EXEEXT)
-	$(dsh_fe_LINK) $(dsh_fe_OBJECTS) $(dsh_fe_LDADD) $(LIBS)
-dsh_fe64$(EXEEXT): $(dsh_fe64_OBJECTS) $(dsh_fe64_DEPENDENCIES) 
-	@rm -f dsh_fe64$(EXEEXT)
-	$(dsh_fe64_LINK) $(dsh_fe64_OBJECTS) $(dsh_fe64_LDADD) $(LIBS)
-edsh_fe$(EXEEXT): $(edsh_fe_OBJECTS) $(edsh_fe_DEPENDENCIES) 
-	@rm -f edsh_fe$(EXEEXT)
-	$(edsh_fe_LINK) $(edsh_fe_OBJECTS) $(edsh_fe_LDADD) $(LIBS)
-edsh_fe64$(EXEEXT): $(edsh_fe64_OBJECTS) $(edsh_fe64_DEPENDENCIES) 
-	@rm -f edsh_fe64$(EXEEXT)
-	$(edsh_fe64_LINK) $(edsh_fe64_OBJECTS) $(edsh_fe64_LDADD) $(LIBS)
-gdsh_fe$(EXEEXT): $(gdsh_fe_OBJECTS) $(gdsh_fe_DEPENDENCIES) 
-	@rm -f gdsh_fe$(EXEEXT)
-	$(gdsh_fe_LINK) $(gdsh_fe_OBJECTS) $(gdsh_fe_LDADD) $(LIBS)
-gdsh_fe64$(EXEEXT): $(gdsh_fe64_OBJECTS) $(gdsh_fe64_DEPENDENCIES) 
-	@rm -f gdsh_fe64$(EXEEXT)
-	$(gdsh_fe64_LINK) $(gdsh_fe64_OBJECTS) $(gdsh_fe64_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddsh_fe-ddsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddsh_fe64-ddsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edsh_fe-edsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edsh_fe64-edsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdsh_fe-gdsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdsh_fe64-gdsh_fe.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-ddsh_fe-ddsh_fe.o: ddsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ddsh_fe-ddsh_fe.o -MD -MP -MF $(DEPDIR)/ddsh_fe-ddsh_fe.Tpo -c -o ddsh_fe-ddsh_fe.o `test -f 'ddsh_fe.c' || echo '$(srcdir)/'`ddsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/ddsh_fe-ddsh_fe.Tpo $(DEPDIR)/ddsh_fe-ddsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ddsh_fe.c' object='ddsh_fe-ddsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ddsh_fe-ddsh_fe.o `test -f 'ddsh_fe.c' || echo '$(srcdir)/'`ddsh_fe.c
-
-ddsh_fe-ddsh_fe.obj: ddsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ddsh_fe-ddsh_fe.obj -MD -MP -MF $(DEPDIR)/ddsh_fe-ddsh_fe.Tpo -c -o ddsh_fe-ddsh_fe.obj `if test -f 'ddsh_fe.c'; then $(CYGPATH_W) 'ddsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/ddsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/ddsh_fe-ddsh_fe.Tpo $(DEPDIR)/ddsh_fe-ddsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ddsh_fe.c' object='ddsh_fe-ddsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ddsh_fe-ddsh_fe.obj `if test -f 'ddsh_fe.c'; then $(CYGPATH_W) 'ddsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/ddsh_fe.c'; fi`
-
-ddsh_fe64-ddsh_fe.o: ddsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ddsh_fe64-ddsh_fe.o -MD -MP -MF $(DEPDIR)/ddsh_fe64-ddsh_fe.Tpo -c -o ddsh_fe64-ddsh_fe.o `test -f 'ddsh_fe.c' || echo '$(srcdir)/'`ddsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/ddsh_fe64-ddsh_fe.Tpo $(DEPDIR)/ddsh_fe64-ddsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ddsh_fe.c' object='ddsh_fe64-ddsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ddsh_fe64-ddsh_fe.o `test -f 'ddsh_fe.c' || echo '$(srcdir)/'`ddsh_fe.c
-
-ddsh_fe64-ddsh_fe.obj: ddsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ddsh_fe64-ddsh_fe.obj -MD -MP -MF $(DEPDIR)/ddsh_fe64-ddsh_fe.Tpo -c -o ddsh_fe64-ddsh_fe.obj `if test -f 'ddsh_fe.c'; then $(CYGPATH_W) 'ddsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/ddsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/ddsh_fe64-ddsh_fe.Tpo $(DEPDIR)/ddsh_fe64-ddsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ddsh_fe.c' object='ddsh_fe64-ddsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ddsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ddsh_fe64-ddsh_fe.obj `if test -f 'ddsh_fe.c'; then $(CYGPATH_W) 'ddsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/ddsh_fe.c'; fi`
-
-dsh_be-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_be64-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be64-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_fe-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-dsh_fe64-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe64-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-edsh_fe-edsh_fe.o: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe-edsh_fe.o -MD -MP -MF $(DEPDIR)/edsh_fe-edsh_fe.Tpo -c -o edsh_fe-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe-edsh_fe.Tpo $(DEPDIR)/edsh_fe-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe-edsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-
-edsh_fe-edsh_fe.obj: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe-edsh_fe.obj -MD -MP -MF $(DEPDIR)/edsh_fe-edsh_fe.Tpo -c -o edsh_fe-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe-edsh_fe.Tpo $(DEPDIR)/edsh_fe-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe-edsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-
-edsh_fe64-edsh_fe.o: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe64-edsh_fe.o -MD -MP -MF $(DEPDIR)/edsh_fe64-edsh_fe.Tpo -c -o edsh_fe64-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe64-edsh_fe.Tpo $(DEPDIR)/edsh_fe64-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe64-edsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe64-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-
-edsh_fe64-edsh_fe.obj: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe64-edsh_fe.obj -MD -MP -MF $(DEPDIR)/edsh_fe64-edsh_fe.Tpo -c -o edsh_fe64-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe64-edsh_fe.Tpo $(DEPDIR)/edsh_fe64-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe64-edsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe64-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-
-gdsh_fe-gdsh_fe.o: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe-gdsh_fe.o -MD -MP -MF $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo -c -o gdsh_fe-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe-gdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-
-gdsh_fe-gdsh_fe.obj: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe-gdsh_fe.obj -MD -MP -MF $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo -c -o gdsh_fe-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe-gdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-
-gdsh_fe64-gdsh_fe.o: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe64-gdsh_fe.o -MD -MP -MF $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo -c -o gdsh_fe64-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe64-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe64-gdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe64-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-
-gdsh_fe64-gdsh_fe.obj: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe64-gdsh_fe.obj -MD -MP -MF $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo -c -o gdsh_fe64-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe64-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe64-gdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe64-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-
-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:
-	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-binPROGRAMS
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libtool ctags distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir 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-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 \
-	uninstall-binPROGRAMS
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c
deleted file mode 100644
index 320f9bb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-    sci_be_t be;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256], hostname[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    gethostname(hostname, sizeof(hostname));
-
-    be.id = num_bes;
-    be.hostname = hostname;
-    rc = SCI_BE_add(&be);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes + 1) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c
deleted file mode 100644
index f8d2aff..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(SCI_FILTER_NULL, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_INTERRUPT;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-	// sleep(20);
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c
deleted file mode 100644
index 23987ef..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp
deleted file mode 100644
index d50db1b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/22/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < exp_resp) {
-            usleep(500);
-        } 
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp
deleted file mode 100644
index 8981f15..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/13/09 chensuih        Initial code
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    //=========odd list===================
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    int odd_list_benum;
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER_NUM, &odd_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of odd list is: %d\r\n", odd_list_benum);
-    
-    int* oddlist_query_res = (int *)malloc(sizeof(int)*odd_list_benum);
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER, oddlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<odd_list_benum; i++)
-    {
-        printf("the group member %d of oddlist_query_res is: %d\r\n", i, oddlist_query_res[i]);
-    }
-    //===========even list====================
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    int even_list_benum;
-    rc = SCI_Group_query(even_group, GROUP_MEMBER_NUM, &even_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of even list is: %d\r\n", even_list_benum);
-
-    int* evenlist_query_res = (int *)malloc(sizeof(int)*even_list_benum);
-    rc = SCI_Group_query(even_group, GROUP_MEMBER, evenlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<even_list_benum; i++)
-    {
-        printf("the group member %d of evenlist_query_res is: %d\r\n", i, evenlist_query_res[i]);
-    }
-    //=====================================
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < exp_resp) {
-            usleep(500);
-        } 
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    free(oddlist_query_res);
-    free(evenlist_query_res);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher
deleted file mode 100755
index b5ffd90..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/perl -w
-
-my $hostlist = `cat ./host.list`;
-chomp($hostlist);
-my $key = `echo \$RANDOM`;
-chomp($key);
-
-print "Start back ends ...\n";
-
-my @hosts = split(/\n/, $hostlist);
-my $id = 0;
-foreach my $host (@hosts) {
-    print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be64\n";
-    system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be64 &");
-    $id = $id + 1;
-}
-
-print "Wait 5 seconds ...\n";
-#sleep(5);
-
-print "Start front end ...\n";
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./dsh_fe64\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./dsh_fe64");
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2 b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2
deleted file mode 100755
index 11d7e76..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/perl -w
-
-my $hostlist = `cat ./host.list`;
-chomp($hostlist);
-my $key = `echo \$RANDOM`;
-chomp($key);
-
-print "Start back ends ...\n";
-
-my @hosts = split(/\n/, $hostlist);
-my $id = 0;
-foreach my $host (@hosts) {
-    print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be\n";
-    system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be &");
-    $id = $id + 1;
-}
-
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be &");
-
-print "Wait 5 seconds ...\n";
-sleep(5);
-
-print "Start front end ...\n";
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./ddsh_fe\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./ddsh_fe");
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/.cvsignore b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/.cvsignore
deleted file mode 100644
index a289abf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.deps
-.libs
-edsh_fe
-gdsh_fe
-dsh_fe
-dsh_be
-sdsh_fe
-Makefile
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix
deleted file mode 100644
index 045f967..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix
+++ /dev/null
@@ -1,49 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-
-all_32: dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-sdsh_fe: sdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ sdsh_fe.cpp $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-sdsh_fe64: sdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ sdsh_fe.cpp $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-	
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.am b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.am
deleted file mode 100644
index b26f82a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.am
+++ /dev/null
@@ -1,77 +0,0 @@
-dsh_fe64_SOURCES = dsh_fe.c
-edsh_fe64_SOURCES = edsh_fe.cpp
-gdsh_fe64_SOURCES = gdsh_fe.cpp
-sdsh_fe64_SOURCES = sdsh_fe.cpp
-dsh_be64_SOURCES = dsh_be.c
-dsh_fe_SOURCES = dsh_fe.c
-edsh_fe_SOURCES = edsh_fe.cpp
-gdsh_fe_SOURCES = gdsh_fe.cpp
-sdsh_fe_SOURCES = sdsh_fe.cpp
-dsh_be_SOURCES = dsh_be.c
-if SYSTEM_AIX
-if BIT64
-bin_PROGRAMS = dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
-dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-edsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-edsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-gdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-gdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-sdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-sdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-edsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-gdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-sdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-sdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-endif
-endif
-if SYSTEM_DARWIN
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-dsh_fe_CPPFLAGS = -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-edsh_fe_CPPFLAGS = -I../../common -I../../include
-edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-gdsh_fe_CPPFLAGS = -I../../common -I../../include
-gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-sdsh_fe_CPPFLAGS = -I../../common -I../../include
-sdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_be_CPPFLAGS = -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-endif
-if SYSTEM_LINUX
-if BIT64
-bin_PROGRAMS = dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
-dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-edsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-edsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-gdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-gdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-sdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-sdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-edsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-edsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-gdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-gdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-sdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-sdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.in b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.in
deleted file mode 100644
index 09f85db..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.in
+++ /dev/null
@@ -1,857 +0,0 @@
-# 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@
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	edsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	gdsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	sdsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be$(EXEEXT)
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	edsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	gdsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	sdsh_fe$(EXEEXT) dsh_be$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	edsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	gdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	sdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be64$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	edsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	gdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	sdsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	dsh_be64$(EXEEXT)
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	edsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	gdsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	sdsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	dsh_be$(EXEEXT)
-subdir = usecase/dsh_2
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-PROGRAMS = $(bin_PROGRAMS)
-am_dsh_be_OBJECTS = dsh_be-dsh_be.$(OBJEXT)
-dsh_be_OBJECTS = $(am_dsh_be_OBJECTS)
-dsh_be_LDADD = $(LDADD)
-dsh_be_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_be64_OBJECTS = dsh_be64-dsh_be.$(OBJEXT)
-dsh_be64_OBJECTS = $(am_dsh_be64_OBJECTS)
-dsh_be64_LDADD = $(LDADD)
-dsh_be64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe_OBJECTS = dsh_fe-dsh_fe.$(OBJEXT)
-dsh_fe_OBJECTS = $(am_dsh_fe_OBJECTS)
-dsh_fe_LDADD = $(LDADD)
-dsh_fe_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe64_OBJECTS = dsh_fe64-dsh_fe.$(OBJEXT)
-dsh_fe64_OBJECTS = $(am_dsh_fe64_OBJECTS)
-dsh_fe64_LDADD = $(LDADD)
-dsh_fe64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_edsh_fe_OBJECTS = edsh_fe-edsh_fe.$(OBJEXT)
-edsh_fe_OBJECTS = $(am_edsh_fe_OBJECTS)
-edsh_fe_LDADD = $(LDADD)
-edsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(edsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_edsh_fe64_OBJECTS = edsh_fe64-edsh_fe.$(OBJEXT)
-edsh_fe64_OBJECTS = $(am_edsh_fe64_OBJECTS)
-edsh_fe64_LDADD = $(LDADD)
-edsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(edsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-am_gdsh_fe_OBJECTS = gdsh_fe-gdsh_fe.$(OBJEXT)
-gdsh_fe_OBJECTS = $(am_gdsh_fe_OBJECTS)
-gdsh_fe_LDADD = $(LDADD)
-gdsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(gdsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_gdsh_fe64_OBJECTS = gdsh_fe64-gdsh_fe.$(OBJEXT)
-gdsh_fe64_OBJECTS = $(am_gdsh_fe64_OBJECTS)
-gdsh_fe64_LDADD = $(LDADD)
-gdsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(gdsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-am_sdsh_fe_OBJECTS = sdsh_fe-sdsh_fe.$(OBJEXT)
-sdsh_fe_OBJECTS = $(am_sdsh_fe_OBJECTS)
-sdsh_fe_LDADD = $(LDADD)
-sdsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(sdsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_sdsh_fe64_OBJECTS = sdsh_fe64-sdsh_fe.$(OBJEXT)
-sdsh_fe64_OBJECTS = $(am_sdsh_fe64_OBJECTS)
-sdsh_fe64_LDADD = $(LDADD)
-sdsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(sdsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-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 $@
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES) $(edsh_fe_SOURCES) $(edsh_fe64_SOURCES) \
-	$(gdsh_fe_SOURCES) $(gdsh_fe64_SOURCES) $(sdsh_fe_SOURCES) \
-	$(sdsh_fe64_SOURCES)
-DIST_SOURCES = $(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES) $(edsh_fe_SOURCES) $(edsh_fe64_SOURCES) \
-	$(gdsh_fe_SOURCES) $(gdsh_fe64_SOURCES) $(sdsh_fe_SOURCES) \
-	$(sdsh_fe64_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-dsh_fe64_SOURCES = dsh_fe.c
-edsh_fe64_SOURCES = edsh_fe.cpp
-gdsh_fe64_SOURCES = gdsh_fe.cpp
-sdsh_fe64_SOURCES = sdsh_fe.cpp
-dsh_be64_SOURCES = dsh_be.c
-dsh_fe_SOURCES = dsh_fe.c
-edsh_fe_SOURCES = edsh_fe.cpp
-gdsh_fe_SOURCES = gdsh_fe.cpp
-sdsh_fe_SOURCES = sdsh_fe.cpp
-dsh_be_SOURCES = dsh_be.c
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@edsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@edsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@edsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@edsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@gdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@gdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@gdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@gdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@sdsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@sdsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@sdsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@sdsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@edsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@edsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@edsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@edsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@edsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@gdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@gdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@gdsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@gdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@gdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@sdsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@sdsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@sdsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@sdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@sdsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@sdsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_be_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .cpp .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) --gnu usecase/dsh_2/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu usecase/dsh_2/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):
-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
-dsh_be$(EXEEXT): $(dsh_be_OBJECTS) $(dsh_be_DEPENDENCIES) 
-	@rm -f dsh_be$(EXEEXT)
-	$(dsh_be_LINK) $(dsh_be_OBJECTS) $(dsh_be_LDADD) $(LIBS)
-dsh_be64$(EXEEXT): $(dsh_be64_OBJECTS) $(dsh_be64_DEPENDENCIES) 
-	@rm -f dsh_be64$(EXEEXT)
-	$(dsh_be64_LINK) $(dsh_be64_OBJECTS) $(dsh_be64_LDADD) $(LIBS)
-dsh_fe$(EXEEXT): $(dsh_fe_OBJECTS) $(dsh_fe_DEPENDENCIES) 
-	@rm -f dsh_fe$(EXEEXT)
-	$(dsh_fe_LINK) $(dsh_fe_OBJECTS) $(dsh_fe_LDADD) $(LIBS)
-dsh_fe64$(EXEEXT): $(dsh_fe64_OBJECTS) $(dsh_fe64_DEPENDENCIES) 
-	@rm -f dsh_fe64$(EXEEXT)
-	$(dsh_fe64_LINK) $(dsh_fe64_OBJECTS) $(dsh_fe64_LDADD) $(LIBS)
-edsh_fe$(EXEEXT): $(edsh_fe_OBJECTS) $(edsh_fe_DEPENDENCIES) 
-	@rm -f edsh_fe$(EXEEXT)
-	$(edsh_fe_LINK) $(edsh_fe_OBJECTS) $(edsh_fe_LDADD) $(LIBS)
-edsh_fe64$(EXEEXT): $(edsh_fe64_OBJECTS) $(edsh_fe64_DEPENDENCIES) 
-	@rm -f edsh_fe64$(EXEEXT)
-	$(edsh_fe64_LINK) $(edsh_fe64_OBJECTS) $(edsh_fe64_LDADD) $(LIBS)
-gdsh_fe$(EXEEXT): $(gdsh_fe_OBJECTS) $(gdsh_fe_DEPENDENCIES) 
-	@rm -f gdsh_fe$(EXEEXT)
-	$(gdsh_fe_LINK) $(gdsh_fe_OBJECTS) $(gdsh_fe_LDADD) $(LIBS)
-gdsh_fe64$(EXEEXT): $(gdsh_fe64_OBJECTS) $(gdsh_fe64_DEPENDENCIES) 
-	@rm -f gdsh_fe64$(EXEEXT)
-	$(gdsh_fe64_LINK) $(gdsh_fe64_OBJECTS) $(gdsh_fe64_LDADD) $(LIBS)
-sdsh_fe$(EXEEXT): $(sdsh_fe_OBJECTS) $(sdsh_fe_DEPENDENCIES) 
-	@rm -f sdsh_fe$(EXEEXT)
-	$(sdsh_fe_LINK) $(sdsh_fe_OBJECTS) $(sdsh_fe_LDADD) $(LIBS)
-sdsh_fe64$(EXEEXT): $(sdsh_fe64_OBJECTS) $(sdsh_fe64_DEPENDENCIES) 
-	@rm -f sdsh_fe64$(EXEEXT)
-	$(sdsh_fe64_LINK) $(sdsh_fe64_OBJECTS) $(sdsh_fe64_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edsh_fe-edsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edsh_fe64-edsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdsh_fe-gdsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdsh_fe64-gdsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdsh_fe-sdsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdsh_fe64-sdsh_fe.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-dsh_be-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_be64-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be64-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_fe-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-dsh_fe64-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe64-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-edsh_fe-edsh_fe.o: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe-edsh_fe.o -MD -MP -MF $(DEPDIR)/edsh_fe-edsh_fe.Tpo -c -o edsh_fe-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe-edsh_fe.Tpo $(DEPDIR)/edsh_fe-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe-edsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-
-edsh_fe-edsh_fe.obj: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe-edsh_fe.obj -MD -MP -MF $(DEPDIR)/edsh_fe-edsh_fe.Tpo -c -o edsh_fe-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe-edsh_fe.Tpo $(DEPDIR)/edsh_fe-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe-edsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-
-edsh_fe64-edsh_fe.o: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe64-edsh_fe.o -MD -MP -MF $(DEPDIR)/edsh_fe64-edsh_fe.Tpo -c -o edsh_fe64-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe64-edsh_fe.Tpo $(DEPDIR)/edsh_fe64-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe64-edsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe64-edsh_fe.o `test -f 'edsh_fe.cpp' || echo '$(srcdir)/'`edsh_fe.cpp
-
-edsh_fe64-edsh_fe.obj: edsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edsh_fe64-edsh_fe.obj -MD -MP -MF $(DEPDIR)/edsh_fe64-edsh_fe.Tpo -c -o edsh_fe64-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/edsh_fe64-edsh_fe.Tpo $(DEPDIR)/edsh_fe64-edsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='edsh_fe.cpp' object='edsh_fe64-edsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edsh_fe64-edsh_fe.obj `if test -f 'edsh_fe.cpp'; then $(CYGPATH_W) 'edsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/edsh_fe.cpp'; fi`
-
-gdsh_fe-gdsh_fe.o: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe-gdsh_fe.o -MD -MP -MF $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo -c -o gdsh_fe-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe-gdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-
-gdsh_fe-gdsh_fe.obj: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe-gdsh_fe.obj -MD -MP -MF $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo -c -o gdsh_fe-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe-gdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-
-gdsh_fe64-gdsh_fe.o: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe64-gdsh_fe.o -MD -MP -MF $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo -c -o gdsh_fe64-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe64-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe64-gdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe64-gdsh_fe.o `test -f 'gdsh_fe.cpp' || echo '$(srcdir)/'`gdsh_fe.cpp
-
-gdsh_fe64-gdsh_fe.obj: gdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gdsh_fe64-gdsh_fe.obj -MD -MP -MF $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo -c -o gdsh_fe64-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/gdsh_fe64-gdsh_fe.Tpo $(DEPDIR)/gdsh_fe64-gdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='gdsh_fe.cpp' object='gdsh_fe64-gdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gdsh_fe64-gdsh_fe.obj `if test -f 'gdsh_fe.cpp'; then $(CYGPATH_W) 'gdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/gdsh_fe.cpp'; fi`
-
-sdsh_fe-sdsh_fe.o: sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sdsh_fe-sdsh_fe.o -MD -MP -MF $(DEPDIR)/sdsh_fe-sdsh_fe.Tpo -c -o sdsh_fe-sdsh_fe.o `test -f 'sdsh_fe.cpp' || echo '$(srcdir)/'`sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/sdsh_fe-sdsh_fe.Tpo $(DEPDIR)/sdsh_fe-sdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sdsh_fe.cpp' object='sdsh_fe-sdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sdsh_fe-sdsh_fe.o `test -f 'sdsh_fe.cpp' || echo '$(srcdir)/'`sdsh_fe.cpp
-
-sdsh_fe-sdsh_fe.obj: sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sdsh_fe-sdsh_fe.obj -MD -MP -MF $(DEPDIR)/sdsh_fe-sdsh_fe.Tpo -c -o sdsh_fe-sdsh_fe.obj `if test -f 'sdsh_fe.cpp'; then $(CYGPATH_W) 'sdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/sdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/sdsh_fe-sdsh_fe.Tpo $(DEPDIR)/sdsh_fe-sdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sdsh_fe.cpp' object='sdsh_fe-sdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sdsh_fe-sdsh_fe.obj `if test -f 'sdsh_fe.cpp'; then $(CYGPATH_W) 'sdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/sdsh_fe.cpp'; fi`
-
-sdsh_fe64-sdsh_fe.o: sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sdsh_fe64-sdsh_fe.o -MD -MP -MF $(DEPDIR)/sdsh_fe64-sdsh_fe.Tpo -c -o sdsh_fe64-sdsh_fe.o `test -f 'sdsh_fe.cpp' || echo '$(srcdir)/'`sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/sdsh_fe64-sdsh_fe.Tpo $(DEPDIR)/sdsh_fe64-sdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sdsh_fe.cpp' object='sdsh_fe64-sdsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sdsh_fe64-sdsh_fe.o `test -f 'sdsh_fe.cpp' || echo '$(srcdir)/'`sdsh_fe.cpp
-
-sdsh_fe64-sdsh_fe.obj: sdsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sdsh_fe64-sdsh_fe.obj -MD -MP -MF $(DEPDIR)/sdsh_fe64-sdsh_fe.Tpo -c -o sdsh_fe64-sdsh_fe.obj `if test -f 'sdsh_fe.cpp'; then $(CYGPATH_W) 'sdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/sdsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/sdsh_fe64-sdsh_fe.Tpo $(DEPDIR)/sdsh_fe64-sdsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='sdsh_fe.cpp' object='sdsh_fe64-sdsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sdsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sdsh_fe64-sdsh_fe.obj `if test -f 'sdsh_fe.cpp'; then $(CYGPATH_W) 'sdsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/sdsh_fe.cpp'; fi`
-
-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:
-	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-binPROGRAMS
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libtool ctags distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir 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-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 \
-	uninstall-binPROGRAMS
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit
deleted file mode 100755
index 667621c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make clean
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c
deleted file mode 100644
index 6e85222..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(SCI_FILTER_NULL, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_POLLING;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    do {
-        rc = SCI_Poll(-1);
-    } while (rc == SCI_SUCCESS);
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c
deleted file mode 100644
index d7f29e4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (rc != SCI_SUCCESS) {
-                break;
-            }
-        } while (num_resp < num_bes);
-
-        if (rc != SCI_SUCCESS) {
-            break;
-        }
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp
deleted file mode 100644
index 234440d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/22/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (num_resp >= exp_resp) {
-                break;
-            }
-        } while (rc == SCI_SUCCESS);
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp
deleted file mode 100644
index eb2e024..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/13/08  chensuih        Initial code
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    //=============odd list===============
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    int odd_list_benum;
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER_NUM, &odd_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of odd list is: %d\r\n", odd_list_benum);
-    
-    int* oddlist_query_res = (int *)malloc(sizeof(int)*odd_list_benum);
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER, oddlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<odd_list_benum; i++)
-    {
-        printf("the group member %d of oddlist_query_res is: %d\r\n", i, oddlist_query_res[i]);
-    }
-    //===============even list ============
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    int even_list_benum;
-    rc = SCI_Group_query(even_group, GROUP_MEMBER_NUM, &even_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of even list is: %d\r\n", even_list_benum);
-
-    int* evenlist_query_res = (int *)malloc(sizeof(int)*even_list_benum);
-    rc = SCI_Group_query(even_group, GROUP_MEMBER, evenlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<even_list_benum; i++)
-    {
-        printf("the group member %d of evenlist_query_res is: %d\r\n", i, evenlist_query_res[i]);
-    }
-    //===============================
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (num_resp >= exp_resp) {
-                break;
-            }
-        } while (rc == SCI_SUCCESS);
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    free(oddlist_query_res);
-    free(evenlist_query_res);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp
deleted file mode 100644
index 7b2f2f4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    int pollfd;
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    fd_set  fdSet;
-    
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(POLLING_FD, &pollfd);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    FD_ZERO(&fdSet);
-    FD_SET(pollfd, &fdSet);
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        do {
-            int rc = ::select(pollfd+1, &fdSet, 0, 0, NULL);
-            if (rc > 0) {
-                SCI_Poll(-1);
-            }
-        } while (num_resp < num_bes);
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/.cvsignore b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/.cvsignore
deleted file mode 100644
index a6418df..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-*.lo
-dsh_tests
-dsh_fe
-dsh_be
-.libs
-.deps
-*.la
-Makefile
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix
deleted file mode 100644
index 953ca23..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix
+++ /dev/null
@@ -1,43 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS =
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be dsh_filter.so dsh_tests
-
-all_64: dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
-
-dsh_fe: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -qmkshrobj -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter64.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -qmkshrobj -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests64: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be dsh_filter.so dsh_tests
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.am b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.am
deleted file mode 100644
index b373193..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.am
+++ /dev/null
@@ -1,70 +0,0 @@
-dsh_fe64_SOURCES = dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_be64_SOURCES = dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_tests64_SOURCES = dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_filter64_la_SOURCES = dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_fe_SOURCES = dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_be_SOURCES = dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_tests_SOURCES = dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_filter_la_SOURCES = dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-if SYSTEM_AIX
-if BIT64
-bin_PROGRAMS = dsh_fe64 dsh_be64 dsh_tests64
-pkglib_LTLIBRARIES = dsh_filter64.la
-dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_tests64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_tests64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_filter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_filter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe dsh_be dsh_tests
-pkglib_LTLIBRARIES = dsh_filter.la
-dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_tests_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_tests_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_filter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_filter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-endif
-endif
-if SYSTEM_DARWIN
-bin_PROGRAMS = dsh_fe dsh_be dsh_tests
-pkglib_LTLIBRARIES = dsh_filter.la
-dsh_fe_CPPFLAGS = -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_be_CPPFLAGS = -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_tests_CPPFLAGS = -I../../common -I../../include
-dsh_tests_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_filter_la_CPPFLAGS = -I../../common -I../../include
-dsh_filter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-endif
-if SYSTEM_LINUX
-if BIT64
-bin_PROGRAMS = dsh_fe64 dsh_be64 dsh_tests64
-pkglib_LTLIBRARIES = dsh_filter64.la
-dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_tests64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_tests64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_filter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_filter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe dsh_be dsh_tests
-pkglib_LTLIBRARIES = dsh_filter.la
-dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_tests_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_tests_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_filter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_filter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.in b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.in
deleted file mode 100644
index f798146..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.in
+++ /dev/null
@@ -1,1042 +0,0 @@
-# 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@
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_tests$(EXEEXT)
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	dsh_be$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	dsh_tests$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_tests64$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	dsh_be64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	dsh_tests64$(EXEEXT)
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	dsh_be$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	dsh_tests$(EXEEXT)
-subdir = usecase/dsh_filter
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-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'
-am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)"
-LTLIBRARIES = $(pkglib_LTLIBRARIES)
-dsh_filter_la_LIBADD =
-am_dsh_filter_la_OBJECTS = dsh_filter_la-dsh_filter.lo \
-	dsh_filter_la-levenshtein.lo dsh_filter_la-dsh_packer.lo
-dsh_filter_la_OBJECTS = $(am_dsh_filter_la_OBJECTS)
-dsh_filter_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_filter_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@am_dsh_filter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@am_dsh_filter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-@SYSTEM_DARWIN_TRUE@am_dsh_filter_la_rpath = -rpath $(pkglibdir)
-dsh_filter64_la_LIBADD =
-am_dsh_filter64_la_OBJECTS = dsh_filter64_la-dsh_filter.lo \
-	dsh_filter64_la-levenshtein.lo dsh_filter64_la-dsh_packer.lo
-dsh_filter64_la_OBJECTS = $(am_dsh_filter64_la_OBJECTS)
-dsh_filter64_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_filter64_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@am_dsh_filter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am_dsh_filter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-PROGRAMS = $(bin_PROGRAMS)
-am_dsh_be_OBJECTS = dsh_be-dsh_be.$(OBJEXT) \
-	dsh_be-levenshtein.$(OBJEXT) dsh_be-dsh_packer.$(OBJEXT)
-dsh_be_OBJECTS = $(am_dsh_be_OBJECTS)
-dsh_be_LDADD = $(LDADD)
-dsh_be_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(dsh_be_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_be64_OBJECTS = dsh_be64-dsh_be.$(OBJEXT) \
-	dsh_be64-levenshtein.$(OBJEXT) dsh_be64-dsh_packer.$(OBJEXT)
-dsh_be64_OBJECTS = $(am_dsh_be64_OBJECTS)
-dsh_be64_LDADD = $(LDADD)
-dsh_be64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_be64_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_fe_OBJECTS = dsh_fe-dsh_fe.$(OBJEXT) \
-	dsh_fe-levenshtein.$(OBJEXT) dsh_fe-dsh_packer.$(OBJEXT)
-dsh_fe_OBJECTS = $(am_dsh_fe_OBJECTS)
-dsh_fe_LDADD = $(LDADD)
-dsh_fe_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
-	$(dsh_fe_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_fe64_OBJECTS = dsh_fe64-dsh_fe.$(OBJEXT) \
-	dsh_fe64-levenshtein.$(OBJEXT) dsh_fe64-dsh_packer.$(OBJEXT)
-dsh_fe64_OBJECTS = $(am_dsh_fe64_OBJECTS)
-dsh_fe64_LDADD = $(LDADD)
-dsh_fe64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_fe64_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_tests_OBJECTS = dsh_tests-dsh_tests.$(OBJEXT) \
-	dsh_tests-levenshtein.$(OBJEXT) dsh_tests-dsh_packer.$(OBJEXT)
-dsh_tests_OBJECTS = $(am_dsh_tests_OBJECTS)
-dsh_tests_LDADD = $(LDADD)
-dsh_tests_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_tests_LDFLAGS) $(LDFLAGS) -o $@
-am_dsh_tests64_OBJECTS = dsh_tests64-dsh_tests.$(OBJEXT) \
-	dsh_tests64-levenshtein.$(OBJEXT) \
-	dsh_tests64-dsh_packer.$(OBJEXT)
-dsh_tests64_OBJECTS = $(am_dsh_tests64_OBJECTS)
-dsh_tests64_LDADD = $(LDADD)
-dsh_tests64_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(dsh_tests64_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-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 = $(dsh_filter_la_SOURCES) $(dsh_filter64_la_SOURCES) \
-	$(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES) $(dsh_tests_SOURCES) \
-	$(dsh_tests64_SOURCES)
-DIST_SOURCES = $(dsh_filter_la_SOURCES) $(dsh_filter64_la_SOURCES) \
-	$(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES) $(dsh_tests_SOURCES) \
-	$(dsh_tests64_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-dsh_fe64_SOURCES = dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_be64_SOURCES = dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_tests64_SOURCES = dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_filter64_la_SOURCES = dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_fe_SOURCES = dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_be_SOURCES = dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_tests_SOURCES = dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-dsh_filter_la_SOURCES = dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@pkglib_LTLIBRARIES = dsh_filter.la
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@pkglib_LTLIBRARIES = dsh_filter.la
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@pkglib_LTLIBRARIES = dsh_filter64.la
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@pkglib_LTLIBRARIES = dsh_filter64.la
-@SYSTEM_DARWIN_TRUE@pkglib_LTLIBRARIES = dsh_filter.la
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_tests64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_tests64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_tests64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_tests64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_filter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_filter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_filter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_filter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_be_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_tests_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_tests_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_tests_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_tests_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_tests_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_tests_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_filter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_filter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_filter_la_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_filter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_filter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_filter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .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) --gnu usecase/dsh_filter/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu usecase/dsh_filter/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):
-install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
-	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
-	}
-
-uninstall-pkglibLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
-	done
-
-clean-pkglibLTLIBRARIES:
-	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
-	@list='$(pkglib_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
-dsh_filter.la: $(dsh_filter_la_OBJECTS) $(dsh_filter_la_DEPENDENCIES) 
-	$(dsh_filter_la_LINK) $(am_dsh_filter_la_rpath) $(dsh_filter_la_OBJECTS) $(dsh_filter_la_LIBADD) $(LIBS)
-dsh_filter64.la: $(dsh_filter64_la_OBJECTS) $(dsh_filter64_la_DEPENDENCIES) 
-	$(dsh_filter64_la_LINK) $(am_dsh_filter64_la_rpath) $(dsh_filter64_la_OBJECTS) $(dsh_filter64_la_LIBADD) $(LIBS)
-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
-dsh_be$(EXEEXT): $(dsh_be_OBJECTS) $(dsh_be_DEPENDENCIES) 
-	@rm -f dsh_be$(EXEEXT)
-	$(dsh_be_LINK) $(dsh_be_OBJECTS) $(dsh_be_LDADD) $(LIBS)
-dsh_be64$(EXEEXT): $(dsh_be64_OBJECTS) $(dsh_be64_DEPENDENCIES) 
-	@rm -f dsh_be64$(EXEEXT)
-	$(dsh_be64_LINK) $(dsh_be64_OBJECTS) $(dsh_be64_LDADD) $(LIBS)
-dsh_fe$(EXEEXT): $(dsh_fe_OBJECTS) $(dsh_fe_DEPENDENCIES) 
-	@rm -f dsh_fe$(EXEEXT)
-	$(dsh_fe_LINK) $(dsh_fe_OBJECTS) $(dsh_fe_LDADD) $(LIBS)
-dsh_fe64$(EXEEXT): $(dsh_fe64_OBJECTS) $(dsh_fe64_DEPENDENCIES) 
-	@rm -f dsh_fe64$(EXEEXT)
-	$(dsh_fe64_LINK) $(dsh_fe64_OBJECTS) $(dsh_fe64_LDADD) $(LIBS)
-dsh_tests$(EXEEXT): $(dsh_tests_OBJECTS) $(dsh_tests_DEPENDENCIES) 
-	@rm -f dsh_tests$(EXEEXT)
-	$(dsh_tests_LINK) $(dsh_tests_OBJECTS) $(dsh_tests_LDADD) $(LIBS)
-dsh_tests64$(EXEEXT): $(dsh_tests64_OBJECTS) $(dsh_tests64_DEPENDENCIES) 
-	@rm -f dsh_tests64$(EXEEXT)
-	$(dsh_tests64_LINK) $(dsh_tests64_OBJECTS) $(dsh_tests64_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-levenshtein.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-levenshtein.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-levenshtein.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-levenshtein.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter64_la-dsh_filter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter64_la-dsh_packer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter64_la-levenshtein.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter_la-dsh_filter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter_la-dsh_packer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_filter_la-levenshtein.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests-dsh_tests.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests-levenshtein.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests64-dsh_packer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests64-dsh_tests.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_tests64-levenshtein.Po@am__quote@
-
-.cpp.o:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
-@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
-@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-dsh_filter_la-dsh_filter.lo: dsh_filter.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter_la-dsh_filter.lo -MD -MP -MF $(DEPDIR)/dsh_filter_la-dsh_filter.Tpo -c -o dsh_filter_la-dsh_filter.lo `test -f 'dsh_filter.cpp' || echo '$(srcdir)/'`dsh_filter.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter_la-dsh_filter.Tpo $(DEPDIR)/dsh_filter_la-dsh_filter.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_filter.cpp' object='dsh_filter_la-dsh_filter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter_la-dsh_filter.lo `test -f 'dsh_filter.cpp' || echo '$(srcdir)/'`dsh_filter.cpp
-
-dsh_filter_la-levenshtein.lo: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter_la-levenshtein.lo -MD -MP -MF $(DEPDIR)/dsh_filter_la-levenshtein.Tpo -c -o dsh_filter_la-levenshtein.lo `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter_la-levenshtein.Tpo $(DEPDIR)/dsh_filter_la-levenshtein.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_filter_la-levenshtein.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter_la-levenshtein.lo `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_filter_la-dsh_packer.lo: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter_la-dsh_packer.lo -MD -MP -MF $(DEPDIR)/dsh_filter_la-dsh_packer.Tpo -c -o dsh_filter_la-dsh_packer.lo `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter_la-dsh_packer.Tpo $(DEPDIR)/dsh_filter_la-dsh_packer.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_filter_la-dsh_packer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter_la-dsh_packer.lo `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_filter64_la-dsh_filter.lo: dsh_filter.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter64_la-dsh_filter.lo -MD -MP -MF $(DEPDIR)/dsh_filter64_la-dsh_filter.Tpo -c -o dsh_filter64_la-dsh_filter.lo `test -f 'dsh_filter.cpp' || echo '$(srcdir)/'`dsh_filter.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter64_la-dsh_filter.Tpo $(DEPDIR)/dsh_filter64_la-dsh_filter.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_filter.cpp' object='dsh_filter64_la-dsh_filter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter64_la-dsh_filter.lo `test -f 'dsh_filter.cpp' || echo '$(srcdir)/'`dsh_filter.cpp
-
-dsh_filter64_la-levenshtein.lo: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter64_la-levenshtein.lo -MD -MP -MF $(DEPDIR)/dsh_filter64_la-levenshtein.Tpo -c -o dsh_filter64_la-levenshtein.lo `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter64_la-levenshtein.Tpo $(DEPDIR)/dsh_filter64_la-levenshtein.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_filter64_la-levenshtein.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter64_la-levenshtein.lo `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_filter64_la-dsh_packer.lo: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_filter64_la-dsh_packer.lo -MD -MP -MF $(DEPDIR)/dsh_filter64_la-dsh_packer.Tpo -c -o dsh_filter64_la-dsh_packer.lo `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_filter64_la-dsh_packer.Tpo $(DEPDIR)/dsh_filter64_la-dsh_packer.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_filter64_la-dsh_packer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_filter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_filter64_la-dsh_packer.lo `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_be-dsh_be.o: dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.o `test -f 'dsh_be.cpp' || echo '$(srcdir)/'`dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_be.cpp' object='dsh_be-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-dsh_be.o `test -f 'dsh_be.cpp' || echo '$(srcdir)/'`dsh_be.cpp
-
-dsh_be-dsh_be.obj: dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.cpp'; then $(CYGPATH_W) 'dsh_be.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_be.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_be.cpp' object='dsh_be-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.cpp'; then $(CYGPATH_W) 'dsh_be.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_be.cpp'; fi`
-
-dsh_be-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_be-levenshtein.Tpo -c -o dsh_be-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-levenshtein.Tpo $(DEPDIR)/dsh_be-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_be-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_be-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_be-levenshtein.Tpo -c -o dsh_be-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-levenshtein.Tpo $(DEPDIR)/dsh_be-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_be-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_be-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_be-dsh_packer.Tpo -c -o dsh_be-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_packer.Tpo $(DEPDIR)/dsh_be-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_be-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_be-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_be-dsh_packer.Tpo -c -o dsh_be-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_packer.Tpo $(DEPDIR)/dsh_be-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_be-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-dsh_be64-dsh_be.o: dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.cpp' || echo '$(srcdir)/'`dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_be.cpp' object='dsh_be64-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.cpp' || echo '$(srcdir)/'`dsh_be.cpp
-
-dsh_be64-dsh_be.obj: dsh_be.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.cpp'; then $(CYGPATH_W) 'dsh_be.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_be.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_be.cpp' object='dsh_be64-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.cpp'; then $(CYGPATH_W) 'dsh_be.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_be.cpp'; fi`
-
-dsh_be64-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_be64-levenshtein.Tpo -c -o dsh_be64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-levenshtein.Tpo $(DEPDIR)/dsh_be64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_be64-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_be64-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_be64-levenshtein.Tpo -c -o dsh_be64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-levenshtein.Tpo $(DEPDIR)/dsh_be64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_be64-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_be64-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_packer.Tpo -c -o dsh_be64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_packer.Tpo $(DEPDIR)/dsh_be64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_be64-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_be64-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_be64-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_packer.Tpo -c -o dsh_be64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_packer.Tpo $(DEPDIR)/dsh_be64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_be64-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_be64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-dsh_fe-dsh_fe.o: dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.cpp' || echo '$(srcdir)/'`dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_fe.cpp' object='dsh_fe-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.cpp' || echo '$(srcdir)/'`dsh_fe.cpp
-
-dsh_fe-dsh_fe.obj: dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.cpp'; then $(CYGPATH_W) 'dsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_fe.cpp' object='dsh_fe-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.cpp'; then $(CYGPATH_W) 'dsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.cpp'; fi`
-
-dsh_fe-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_fe-levenshtein.Tpo -c -o dsh_fe-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-levenshtein.Tpo $(DEPDIR)/dsh_fe-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_fe-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_fe-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_fe-levenshtein.Tpo -c -o dsh_fe-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-levenshtein.Tpo $(DEPDIR)/dsh_fe-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_fe-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_fe-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_packer.Tpo -c -o dsh_fe-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_packer.Tpo $(DEPDIR)/dsh_fe-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_fe-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_fe-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_packer.Tpo -c -o dsh_fe-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_packer.Tpo $(DEPDIR)/dsh_fe-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_fe-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-dsh_fe64-dsh_fe.o: dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.cpp' || echo '$(srcdir)/'`dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_fe.cpp' object='dsh_fe64-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.cpp' || echo '$(srcdir)/'`dsh_fe.cpp
-
-dsh_fe64-dsh_fe.obj: dsh_fe.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.cpp'; then $(CYGPATH_W) 'dsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_fe.cpp' object='dsh_fe64-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.cpp'; then $(CYGPATH_W) 'dsh_fe.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.cpp'; fi`
-
-dsh_fe64-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_fe64-levenshtein.Tpo -c -o dsh_fe64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-levenshtein.Tpo $(DEPDIR)/dsh_fe64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_fe64-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_fe64-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-levenshtein.Tpo -c -o dsh_fe64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-levenshtein.Tpo $(DEPDIR)/dsh_fe64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_fe64-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_fe64-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_packer.Tpo -c -o dsh_fe64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_packer.Tpo $(DEPDIR)/dsh_fe64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_fe64-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_fe64-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_fe64-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_packer.Tpo -c -o dsh_fe64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_packer.Tpo $(DEPDIR)/dsh_fe64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_fe64-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_fe64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-dsh_tests-dsh_tests.o: dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-dsh_tests.o -MD -MP -MF $(DEPDIR)/dsh_tests-dsh_tests.Tpo -c -o dsh_tests-dsh_tests.o `test -f 'dsh_tests.cpp' || echo '$(srcdir)/'`dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-dsh_tests.Tpo $(DEPDIR)/dsh_tests-dsh_tests.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_tests.cpp' object='dsh_tests-dsh_tests.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-dsh_tests.o `test -f 'dsh_tests.cpp' || echo '$(srcdir)/'`dsh_tests.cpp
-
-dsh_tests-dsh_tests.obj: dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-dsh_tests.obj -MD -MP -MF $(DEPDIR)/dsh_tests-dsh_tests.Tpo -c -o dsh_tests-dsh_tests.obj `if test -f 'dsh_tests.cpp'; then $(CYGPATH_W) 'dsh_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_tests.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-dsh_tests.Tpo $(DEPDIR)/dsh_tests-dsh_tests.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_tests.cpp' object='dsh_tests-dsh_tests.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-dsh_tests.obj `if test -f 'dsh_tests.cpp'; then $(CYGPATH_W) 'dsh_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_tests.cpp'; fi`
-
-dsh_tests-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_tests-levenshtein.Tpo -c -o dsh_tests-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-levenshtein.Tpo $(DEPDIR)/dsh_tests-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_tests-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_tests-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_tests-levenshtein.Tpo -c -o dsh_tests-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-levenshtein.Tpo $(DEPDIR)/dsh_tests-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_tests-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_tests-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_tests-dsh_packer.Tpo -c -o dsh_tests-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-dsh_packer.Tpo $(DEPDIR)/dsh_tests-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_tests-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_tests-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_tests-dsh_packer.Tpo -c -o dsh_tests-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests-dsh_packer.Tpo $(DEPDIR)/dsh_tests-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_tests-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-dsh_tests64-dsh_tests.o: dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-dsh_tests.o -MD -MP -MF $(DEPDIR)/dsh_tests64-dsh_tests.Tpo -c -o dsh_tests64-dsh_tests.o `test -f 'dsh_tests.cpp' || echo '$(srcdir)/'`dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-dsh_tests.Tpo $(DEPDIR)/dsh_tests64-dsh_tests.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_tests.cpp' object='dsh_tests64-dsh_tests.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-dsh_tests.o `test -f 'dsh_tests.cpp' || echo '$(srcdir)/'`dsh_tests.cpp
-
-dsh_tests64-dsh_tests.obj: dsh_tests.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-dsh_tests.obj -MD -MP -MF $(DEPDIR)/dsh_tests64-dsh_tests.Tpo -c -o dsh_tests64-dsh_tests.obj `if test -f 'dsh_tests.cpp'; then $(CYGPATH_W) 'dsh_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_tests.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-dsh_tests.Tpo $(DEPDIR)/dsh_tests64-dsh_tests.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_tests.cpp' object='dsh_tests64-dsh_tests.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-dsh_tests.obj `if test -f 'dsh_tests.cpp'; then $(CYGPATH_W) 'dsh_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_tests.cpp'; fi`
-
-dsh_tests64-levenshtein.o: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-levenshtein.o -MD -MP -MF $(DEPDIR)/dsh_tests64-levenshtein.Tpo -c -o dsh_tests64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-levenshtein.Tpo $(DEPDIR)/dsh_tests64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_tests64-levenshtein.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-levenshtein.o `test -f 'levenshtein.cpp' || echo '$(srcdir)/'`levenshtein.cpp
-
-dsh_tests64-levenshtein.obj: levenshtein.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-levenshtein.obj -MD -MP -MF $(DEPDIR)/dsh_tests64-levenshtein.Tpo -c -o dsh_tests64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-levenshtein.Tpo $(DEPDIR)/dsh_tests64-levenshtein.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='levenshtein.cpp' object='dsh_tests64-levenshtein.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-levenshtein.obj `if test -f 'levenshtein.cpp'; then $(CYGPATH_W) 'levenshtein.cpp'; else $(CYGPATH_W) '$(srcdir)/levenshtein.cpp'; fi`
-
-dsh_tests64-dsh_packer.o: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-dsh_packer.o -MD -MP -MF $(DEPDIR)/dsh_tests64-dsh_packer.Tpo -c -o dsh_tests64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-dsh_packer.Tpo $(DEPDIR)/dsh_tests64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_tests64-dsh_packer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-dsh_packer.o `test -f 'dsh_packer.cpp' || echo '$(srcdir)/'`dsh_packer.cpp
-
-dsh_tests64-dsh_packer.obj: dsh_packer.cpp
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dsh_tests64-dsh_packer.obj -MD -MP -MF $(DEPDIR)/dsh_tests64-dsh_packer.Tpo -c -o dsh_tests64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/dsh_tests64-dsh_packer.Tpo $(DEPDIR)/dsh_tests64-dsh_packer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='dsh_packer.cpp' object='dsh_tests64-dsh_packer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_tests64_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dsh_tests64-dsh_packer.obj `if test -f 'dsh_packer.cpp'; then $(CYGPATH_W) 'dsh_packer.cpp'; else $(CYGPATH_W) '$(srcdir)/dsh_packer.cpp'; fi`
-
-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 $(LTLIBRARIES) $(PROGRAMS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-binPROGRAMS clean-generic clean-libtool \
-	clean-pkglibLTLIBRARIES mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-binPROGRAMS install-pkglibLTLIBRARIES
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-binPROGRAMS uninstall-pkglibLTLIBRARIES
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir 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-pdf \
-	install-pdf-am install-pkglibLTLIBRARIES 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 uninstall-binPROGRAMS uninstall-pkglibLTLIBRARIES
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp
deleted file mode 100644
index a3bbbd8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp
+++ /dev/null
@@ -1,227 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshAggregator
-
- Description: Aggregation functions.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHAGGREGATOR_HPP
-#define _DSHAGGREGATOR_HPP
-
-#include <stdio.h>
-#include <assert.h>
-
-#include "dsh_header.hpp"
-#include "levenshtein.hpp"
-
-#include <string>
-#include <vector>
-#include <algorithm>
-
-using namespace std;
-
-class DshAggregator
-{
-    private:
-        vector<DshMessage*> messages;
-        
-    public:        
-        void addMsg(DshMessage *msg) {
-            assert(msg);
-
-            messages.push_back(msg);
-        }
-
-        void deleteAll() {
-            messages.clear();
-        }
-
-        void freeMemory(bool incStr = false) {
-            for (int i=0; i<messages.size(); i++) {
-                if (messages[i]) {
-                    messages[i]->freeMemory(incStr);
-                }
-            }
-            deleteAll();
-        }
-
-        DshMessage * getAggregatedMsg() {
-            if (messages.size() == 0)
-                return NULL;
-
-            DshMessage *msg = new DshMessage(messages[0]->getSeqNo());
-            for (int i=0; i<messages.size(); i++) {
-                aggregateMsg(msg, messages[i]);
-            }
-
-            calcMsgState(msg);
-
-            return msg;
-        }
-
-        int numOfBEs() {
-            int num = 0;
-            for (int i=0; i<messages.size(); i++) {
-                num += messages[i]->getMaxLineSize();
-            }
-            return num;
-        }
-
-    private:
-        void aggregateMsg(DshMessage *base_msg, DshMessage *new_msg) {
-            assert((base_msg!=NULL) && (new_msg!=NULL));
-            assert(base_msg->getSeqNo() == new_msg->getSeqNo());
-
-            int newly = 0, base = 0;
-            while ((base < base_msg->getSize()) && (newly < new_msg->getSize())) {
-                DshLine *base_line = base_msg->getLine(base);
-                DshLine *new_line = new_msg->getLine(newly);
-
-                if (base_line->getLineNo() < new_line->getLineNo()) {
-                    base++;
-                    continue;
-                }
-
-                if (base_line->getLineNo() > new_line->getLineNo()) {
-                    base_msg->addLine(new_line);
-                    base++;
-                } else {
-                    int pos = base;
-                    bool exists = false;
-                    while (base_msg->getLine(pos)->getLineNo() == base_line->getLineNo()) {
-                        if (isEqual(base_msg->getLine(pos)->getLine(), new_line->getLine())) {
-                            for (int i=0; i<new_line->getSize(); i++) {
-                                base_msg->getLine(pos)->addBE(new_line->getBE(i));
-                            }
-                            exists = true;
-                            break;
-                        }
-                        pos++;
-                        if (pos >= base_msg->getSize())
-                            break;
-                    }
-                    if (!exists) {
-                        base_msg->addLine(new_line);
-                        if ((*new_line) < (*base_line)) {
-                            base++;
-                        }
-                    }
-                }
-                newly++;
-            }
-
-            for (int i=newly; i<new_msg->getSize(); i++) {
-                base_msg->addLine(new_msg->getLine(i));
-            }
-        }
-
-        void calcMsgState(DshMessage *msg) {
-            int start = 0, base_pos, num_equal;
-
-            while (start < msg->getSize()) {
-                base_pos = findBasePos(msg, start, &num_equal);
-
-                bool hasSimilar = false;
-                bool hasDiff = false;
-                for (int i=start; i<start+num_equal; i++) {
-                    if (i == base_pos)
-                        continue;
-                    
-                    int state = compare(msg->getLine(base_pos)->getLine(), msg->getLine(i)->getLine());
-                    if (state == EQUAL_STATE) {
-                        printf("\n");
-                        msg->print();
-                        assert(!"Should not be equal state");
-                    } else if (state == SIMILAR_STATE) {
-                        hasSimilar = true;
-                        msg->getLine(i)->setState(SIMILAR_STATE);
-                    } else {
-                        hasDiff = true;
-                        msg->getLine(i)->setState(DIFFERENT_STATE);
-                    }
-                }
-                if (hasSimilar && (base_pos == start)) {
-                    if (msg->getLine(base_pos)->getSize() == 1)
-                        msg->getLine(base_pos)->setState(SIMILAR_STATE);
-                } else if (hasDiff && (base_pos == start)) {
-                    if (msg->getLine(base_pos)->getSize() == 1)
-                        msg->getLine(base_pos)->setState(DIFFERENT_STATE);
-                }
-                
-                start += num_equal;
-            }
-        }
-
-        int findBasePos(DshMessage *msg, int start, int *num_equal) {
-            assert(msg);
-            assert(start < msg->getSize());
-
-            int pos = start, maxPos = start;
-            int maxBEs = 0;
-            *num_equal = 0;
-            while (msg->getLine(pos)->getLineNo() == msg->getLine(start)->getLineNo()) {
-                if (maxBEs < msg->getLine(pos)->getSize()) {
-                    maxBEs = msg->getLine(pos)->getSize();
-                    maxPos = pos;
-                }
-                *num_equal = *num_equal + 1;
-                pos++;
-                if (pos >= msg->getSize())
-                    break;
-            }
-
-            return maxPos;
-        }
-        
-        int compare(char *str1, char *str2) {
-            assert(str1 && str2);
-
-            string string1(str1);
-            string string2(str2);
-
-            int cost = Levenshtein::Distance(string1, string2);
-            if (cost == 0)
-                return EQUAL_STATE;
-            else if (cost * 5 < max(string1.length(), string2.length()))
-                return SIMILAR_STATE;
-            else
-                return DIFFERENT_STATE;
-        }
-
-        int isEqual(char *str1, char *str2) {
-            assert(str1 && str2);
-
-            string string1(str1);
-            string string2(str2);
-
-            if (string1 == string2)
-                return 1;
-            else {
-                if (compare(str1, str2) == EQUAL_STATE)
-                    return 1;
-                else
-                    return 0;
-            }
-        }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp
deleted file mode 100644
index 4d90a07..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Back End.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#include "dsh_header.hpp"
-
-#define DSH_FILTER 1
-#define RST_SIZE 4096
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int seq_no = ((int *) buffer)[0];
-    char *cmd = (char *)((char *) buffer + sizeof(int));
-
-    int my_id;
-    int rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    char result[RST_SIZE] = {0};
-    FILE *fp = popen((const char *)cmd, "r");
-    memset(result, 0, RST_SIZE);
-    int bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    pclose(fp);
-
-    DshMessage msg;
-    msg.readFromString(result, my_id);
-    msg.setSeqNo(seq_no);
-
-    int sizes[1];
-    void *bufs[1];
-    bufs[0] = msg.pack(&sizes[0]);
-
-    rc = SCI_Upload(DSH_FILTER, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    for (int i=0; i<msg.getSize(); i++)
-        delete msg.getLine(i)->getLine();
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp
deleted file mode 100644
index 4ff6c2a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Front End.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#include "dsh_header.hpp"
-
-#define DSH_FILTER 1
-
-bool finished;
-bool expand;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    DshMessage msg;
-    msg.unpack(buffer);
-
-    msg.print(expand);
-    
-    finished = true;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, seq, sizes[2];
-    void *bufs[2];
-
-    char pwd[256];
-    char hfile[256], bpath[256], apath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/dsh_filter64.so", pwd);
-#else
-    sprintf(fpath, "%s/dsh_filter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = DSH_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    expand = false;
-
-    seq = 0;
-    while (1) {
-        printf("(all) ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "quit") == 0)
-            break;
-        else if (strcmp(msg, "expand") == 0) {
-            expand = !expand;
-            if (expand)
-                printf("Expand the output.\n");
-            else
-                printf("Do not expand the output.\n");
-            continue;
-        }
-        
-        finished = false;
-
-        bufs[0] = &seq;
-        sizes[0] = sizeof(seq);
-        bufs[1] = msg;
-        sizes[1] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 2, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        seq++;
-       
-        while (!finished) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp
deleted file mode 100644
index 0034aa0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Filter.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "sci.h"
-#include "dsh_header.hpp"
-#include "dsh_aggregator.hpp"
-
-#include <string.h>
-#include <vector>
-#include <map>
-
-using namespace std;
-
-// typedefs
-typedef map<int, DshAggregator *> DSHAGGRAGATOR_MAP;
-typedef vector<void *> MEM_VEC;
-typedef map<int, MEM_VEC> MEM_VEC_MAP;
-
-// global structures
-DSHAGGRAGATOR_MAP gDshAggregatorMap;
-MEM_VEC_MAP gMemoryMap;
-
-extern "C" {
-
-int filter_initialize(void **user_param);
-int filter_terminate(void *user_param);
-int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-
-} /* extern "C" */
-
-bool isDataAvailable(int seq_no);
-void removeData(int seq_no);
-int outputData(sci_group_t group, DshMessage *msg);
-
-int filter_initialize(void **user_param)
-{
-    gDshAggregatorMap.clear();
-    gMemoryMap.clear();
-    
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param)
-{
-    for (int i=0; i<gDshAggregatorMap.size(); i++) {
-        gDshAggregatorMap[i]->freeMemory();
-    }
-    gDshAggregatorMap.clear();
-    gMemoryMap.clear();
-    
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size)
-{
-    int rc = SCI_SUCCESS;
-
-    DshMessage *msg = new DshMessage();
-    assert(msg);
-
-    void *new_buf = malloc(size);
-    memcpy(new_buf, buf, size);
-    gMemoryMap[msg->getSeqNo()].push_back(new_buf);
-    
-    msg->unpack(new_buf);
-    if (gDshAggregatorMap.find(msg->getSeqNo()) == gDshAggregatorMap.end()) {
-        gDshAggregatorMap[msg->getSeqNo()] = new DshAggregator();
-    }
-    gDshAggregatorMap[msg->getSeqNo()]->addMsg(msg);
-
-    if (isDataAvailable(msg->getSeqNo())) {
-        DshMessage *new_msg = gDshAggregatorMap[msg->getSeqNo()]->getAggregatedMsg();
-        rc = outputData(group, new_msg);
-        removeData(msg->getSeqNo());
-        delete new_msg;
-    }
-
-    return rc;
-}
-
-// functions
-bool isDataAvailable(int seq_no)
-{
-    assert(gDshAggregatorMap.find(seq_no) != gDshAggregatorMap.end());
-    
-    int rc, ret_val;
-    rc = SCI_Group_query(SCI_GROUP_ALL, GROUP_MEMBER_NUM, &ret_val);
-    if (rc != SCI_SUCCESS) {
-        assert(!"SCI_Query_info_ext did not work!");
-    }
-
-    if (ret_val <= gDshAggregatorMap[seq_no]->numOfBEs())
-        return true;
-
-    return false;
-}
-
-void removeData(int seq_no)
-{
-    assert(gDshAggregatorMap.find(seq_no) != gDshAggregatorMap.end());
-    
-    gDshAggregatorMap[seq_no]->freeMemory();
-    delete gDshAggregatorMap[seq_no];
-    gDshAggregatorMap.erase(seq_no);
-
-    for (int i=0; i<gMemoryMap[seq_no].size(); i++) {
-        free(gMemoryMap[seq_no][i]);
-    }
-    gMemoryMap.erase(seq_no);
-}
-
-int outputData(sci_group_t group, DshMessage *msg)
-{
-    assert(msg);
-
-    void *bufs[1];
-    int rc, sizes[1];
-
-    bufs[0] = msg->pack(&sizes[0]);
-    rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp
deleted file mode 100644
index a9a6b14..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp
+++ /dev/null
@@ -1,440 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshLine, DshMessage
-
- Description: Common definitions.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHHEADER_HPP
-#define _DSHHEADER_HPP
-
-#include <stdio.h>
-#include <assert.h>
-#include <string.h>
-
-#include "dsh_packer.hpp"
-
-#include <vector>
-#include <algorithm>
-
-using namespace std;
-
-const int EQUAL_STATE  = 0;
-const int SIMILAR_STATE = 1;
-const int DIFFERENT_STATE = 2;
-
-const char *EQUAL_COLOR = "\x1b[1;32m"; // green
-const char *SIMILAR_COLOR = "\x1b[2;32m"; // dark green
-const char *DIFFERENT_COLOR = "\x1b[1;31m"; // red
-const char *END_COLOR = "\x1b[00m"; // end sign
-
-class DshLine 
-{
-    private:
-        vector<int>     be_ids;
-        int             state;
-        int             min_id;
-        int             max_id;
-        int             line_no;
-        char            *line;
-
-    public:
-        DshLine(int st = EQUAL_STATE) {
-            be_ids.clear();
-            line_no = 0;
-            line = NULL;
-            state = st;
-            min_id = max_id = 0;
-        }
-
-        void addBE(int be_id) {
-            if (find(be_ids.begin(), be_ids.end(), be_id) == be_ids.end()) {
-                be_ids.push_back(be_id);
-                sort(be_ids.begin(), be_ids.end());
-                if (be_id > max_id)
-                    max_id = be_id;
-                else if (be_id < min_id)
-                    min_id = be_id;
-            }
-        }
-
-        void deleteAll() {
-            be_ids.clear();
-        }
-        
-        void print() {
-            int first, last;
-
-            if (state == EQUAL_STATE)
-                printf("%s", EQUAL_COLOR);
-            else if (state == SIMILAR_STATE)
-                printf("%s", SIMILAR_COLOR);
-            else if (state == DIFFERENT_STATE)
-                printf("%s", DIFFERENT_COLOR);
-            else
-                assert(!"Undefined message state");
-            
-            first = last = 0;
-            for (int i=0; i<be_ids.size(); i++) {
-                if (be_ids[i] == be_ids[first] + (i - first)) {
-                    last = i;
-                } else {
-                    if (first == last)
-                        printf("%d ", be_ids[first]);
-                    else
-                        printf("%d:%d ", be_ids[first], be_ids[last]);
-                    first = last = i;
-                }
-            }
-            if (first == last)
-                printf("%d ", be_ids[first]);
-            else
-                printf("%d:%d ", be_ids[first], be_ids[last]);
-            printf("| %s%s\n", line, END_COLOR);
-        }
-
-        void print(int be_id) {
-            if (find(be_ids.begin(), be_ids.end(), be_id) == be_ids.end())
-                return;
-
-            if (state == EQUAL_STATE)
-                printf("%s", EQUAL_COLOR);
-            else if (state == SIMILAR_STATE)
-                printf("%s", SIMILAR_COLOR);
-            else if (state == DIFFERENT_STATE)
-                printf("%s", DIFFERENT_COLOR);
-            else
-                assert(!"Undefined message state");
-
-            printf("%d | %s%s\n", be_id, line, END_COLOR);
-        }
-        
-        void setState(int st) {
-            state = st;
-        }
-        
-        int getState() {
-            return state;
-        }
-
-        void setLineNo(int no) {
-            line_no = no;
-        }
-
-        int getLineNo() {
-            return line_no;
-        }
-
-        void setLine(char *str) {
-            line = str;
-        }
-
-        char * getLine() {
-            return line;
-        }
-
-        int getBE(int index) {
-            assert(index>=0 || index<getSize());
-
-            return be_ids[index];
-        }
-        
-        int getSize() {
-            return be_ids.size();
-        }
-
-        int getMinBEId() {
-            return min_id;
-        }
-
-        int getMaxBEId() {
-            return max_id;
-        }
-
-        bool  operator > (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no > dl.line_no)
-                return true;
-
-            if (line_no < dl.line_no)
-                return false;
-
-            if (be_ids[be_ids.size()-1] <= dl.be_ids[dl.be_ids.size()-1])
-                return false;
-
-            return true;
-        }
-
-        bool  operator < (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no < dl.line_no)
-                return true;
-
-            if (line_no > dl.line_no)
-                return false;
-
-            if (be_ids[0] >= dl.be_ids[0])
-                return false;
-
-            return true;
-        }
-
-        bool  operator == (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no != dl.line_no)
-                return false;
-
-            if (be_ids.size() != dl.be_ids.size())
-                return false;
-
-            for (int i=0; i<be_ids.size(); i++) {
-                if (be_ids[i] != dl.be_ids[i])
-                    return false;
-            }
-
-            return true;
-        }
-};
-
-class DshMessage 
-{
-    private:
-        int                seq_no;
-        vector<DshLine*>   lines;
-        int                max_id;
-        int                min_id;
-
-    public:
-        DshMessage(int seq = 0) {
-            seq_no = seq;
-            lines.clear();
-            max_id = min_id = 0;
-        }
-
-        DshMessage & readFromString(const char *str, int be_id = 0) {
-            char *from = (char *) str, *to = NULL;
-
-            lines.clear();
-            int line_no = 0;
-            while (1) {
-                to = strstr(from, "\n");
-                if (to == NULL) {
-                    if (strlen(from) > 0) {
-                        int len = strlen(from);
-                        char *text = new char[len + 1];
-                        strncpy(text, from, len);
-                        text[len] = '\0';
-                        chomp(text);
-
-                        DshLine *line = new DshLine();
-                        line->setLineNo(line_no++);
-                        line->setLine(text);
-                        line->addBE(be_id);
-                        lines.push_back(line);
-                    }
-                    break;
-                } else {
-                    int len = strlen(from) - strlen(to);
-                    char *text = new char[len + 1];
-                    strncpy(text, from, len);
-                    text[len] = '\0';
-                    chomp(text);
-
-                    DshLine *line = new DshLine();
-                    line->setLineNo(line_no++);
-                    line->setLine(text);
-                    line->addBE(be_id);
-                    lines.push_back(line);
-                }
-                from = to + 1;
-            }
-
-            max_id = min_id = be_id;
-            
-            return *this;
-        }
-
-        void addLine(DshLine *line) {
-            assert(line);
-
-            if (line->getMaxBEId() > max_id)
-                max_id = line->getMaxBEId();
-            else if (line->getMinBEId() < min_id)
-                min_id = line->getMinBEId();
-
-            vector<DshLine*>::iterator it = lines.begin();
-            for (; it!=lines.end(); ++it) {
-                DshLine *tmp = (*it);
-                if ((*line) < (*tmp)) {
-                    lines.insert(it, line);
-                    return;
-                }
-            }
-            
-            lines.push_back(line);
-        }
-        
-        void freeMemory(bool incStr = false) {
-            for (int i=0; i<lines.size(); i++) {
-                if (lines[i]) {
-                    if (incStr)
-                        delete [] lines[i]->getLine();
-                    delete lines[i];
-                }
-            }
-            deleteAll();
-        }
-
-        void deleteAll() {
-            lines.clear();
-        }
-
-        DshLine * getLine(int index) {
-            assert(index>=0 && index<lines.size());
-            if (lines.size() == 0)
-                return NULL;
-
-            return lines[index];
-        }
-
-        void print(bool expand = false) {
-            if (!expand) {
-                for (int i=0; i<lines.size(); i++) {
-                    lines[i]->print();
-                }
-            } else {
-                for (int i=min_id; i<=max_id; i++) {
-                    for (int j=0; j<lines.size(); j++) {
-                        lines[j]->print(i);
-                    }
-                }
-            }
-        }
-
-        void setSeqNo(int seq) {
-            seq_no = seq;
-        }
-
-        int getSeqNo() {
-            return seq_no;
-        }
-
-        void setLineState(int index, int state) {
-            assert(index>=0 || index<lines.size());
-            assert((state==EQUAL_STATE) || (state==SIMILAR_STATE) || (state==DIFFERENT_STATE));
-
-            lines[index]->setState(state);
-        }
-
-        int getLineState(int index) {
-            assert(index>=0 || index<lines.size());
-
-            return lines[index]->getState();
-        }
-
-        int getLineNo(int index) {
-            assert(index>=0 || index<lines.size());
-
-            return lines[index]->getLineNo();
-        }
-
-        int getSize() {
-            return lines.size();
-        }
-
-        int getMaxLineSize() {
-            int size = 1;
-            for (int i=0; i<lines.size(); i++) {
-                if (lines[i]->getSize() > size)
-                    size = lines[i]->getSize();
-            }
-
-            return size;
-        }
-
-        int getMaxBEId() {
-            return max_id;
-        }
-
-        int getMinBEId() {
-            return min_id;
-        }
-
-        void * pack(int *size = NULL) {
-            DshPacker packer;
-            int line_size;
-
-            packer.packInt(seq_no);
-            packer.packInt(lines.size());
-            for (int i=0; i<lines.size(); i++) {
-                packer.packInt(lines[i]->getSize());
-                for (int j=0; j<lines[i]->getSize(); j++)
-                    packer.packInt(lines[i]->getBE(j));
-                packer.packInt(lines[i]->getState());
-                packer.packInt(lines[i]->getLineNo());
-                packer.packStr(lines[i]->getLine());
-            }
-
-            if (size)
-                *size = packer.getPackedMsgLen();
-            return packer.getPackedMsg();
-        }
-    
-        DshMessage & unpack(void *buf) {
-            DshPacker packer;
-            packer.setPackedMsg((char *)buf);
-        
-            seq_no = packer.unpackInt();
-            int num_lines = packer.unpackInt();
-            for (int i=0; i<num_lines; i++) {
-                DshLine *li = new DshLine();
-
-                int num_bes = packer.unpackInt();
-                for (int j=0; j<num_bes; j++)
-                    li->addBE(packer.unpackInt());
-                li->setState(packer.unpackInt());
-                li->setLineNo(packer.unpackInt());
-                li->setLine(packer.unpackStr());
-        
-                addLine(li);
-            }
-
-            return *this;
-        }
-
-    private:
-        void chomp(char* str) {
-            int end = strlen(str);
-            while (end >= 0) {
-                if ((str[end]==' ') || (str[end]=='\t'))
-                    str[end] = '\0';
-                else
-                    break;
-                end--;
-            }
-        }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp
deleted file mode 100644
index 4d4a7bf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshPacker
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "dsh_packer.hpp"
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <string.h>
-
-DshPacker::DshPacker()
-{
-    msgBuf = (char *)malloc(1);
-    msgPtr = msgBuf;
-    msgLen = 0;
-}
-
-char* DshPacker::getPackedMsg()
-{
-    return msgBuf;
-}
-
-int DshPacker::getPackedMsgLen()
-{
-    return msgLen;
-}
-
-void DshPacker::packInt(int value)
-{
-    int size = htonl(value);
-
-    int oldLen = msgLen;
-    msgLen += sizeof(size);
-    msgBuf = (char *)realloc(msgBuf, msgLen);
-    msgPtr = msgBuf + oldLen;
-
-    memcpy(msgPtr, &size, sizeof(size));
-    msgPtr += sizeof(size);
-}
-
-void DshPacker::packStr(char *value)
-{
-    int len = strlen(value) + 1;
-    packInt(len);
-
-    int oldLen = msgLen;
-    msgLen += len;
-    msgBuf = (char *)realloc(msgBuf, msgLen);
-    msgPtr = msgBuf + oldLen;
-
-    memcpy(msgPtr, value, len);
-    msgPtr += len;
-}
-
-void DshPacker::setPackedMsg(char * msg)
-{
-    msgBuf = msg;
-    msgPtr = msgBuf;
-}
-
-int DshPacker::unpackInt()
-{
-    int size, value;
-    memcpy(&size, msgPtr, sizeof(size));
-
-    value = ntohl(size);
-    msgPtr += sizeof(size);
-
-    return value;
-}
-
-char* DshPacker::unpackStr()
-{
-    int len;
-    char *value;
-
-    len = unpackInt();
-    value = msgPtr;
-    msgPtr += len;
-
-    return value;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp
deleted file mode 100644
index 2ffe930..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshPacker
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHPACKER_HPP
-#define _DSHPACKER_HPP
-
-#include <vector>
-#include <map>
-#include <string>
-
-using namespace std;
-
-class DshPacker {
-    private:
-        char *msgBuf;
-        char *msgPtr;
-        int     msgLen;
-        
-    public:
-        DshPacker();
-
-        // for message packing usage
-        void packInt(int value);
-        void packStr(char *value);
-        char* getPackedMsg();
-        int getPackedMsgLen();
-
-        // for message unpacking usage
-        void setPackedMsg(char *msg);
-        int unpackInt();
-        char *unpackStr();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp
deleted file mode 100644
index 4cc4ca5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Unit tests.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <string.h>
-
-#include "levenshtein.hpp"
-#include "dsh_header.hpp"
-#include "dsh_aggregator.hpp"
-
-#include <string>
-
-using namespace std;
-
-void Levenshtein_Test()
-{
-    string str1 = "This is a test";
-    string str2 = "This is a test";
-
-    int cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 0)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-
-    str1 = "This is a test";
-    str2 = "This is a test!";
-    cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 1)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-
-    str1 = "-rwxr-xr-x 1 nicole nicole 1060380 2008-10-29 13:21 dsh_be";
-    str2 = "-rwxr-xr-x 1 nicole nicole 1234567 2008-10-29 13:21 dsh_be";
-    cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 6)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-}
-
-void DshLine_Test()
-{
-    DshLine line;
-    char *str = new char[256];
-    strcpy(str, "This is a test");
-    line.setLine(str);
-
-    line.addBE(0);
-    line.print();
-
-    line.addBE(1);
-    line.print();
-
-    for (int i=3; i<10; i++)
-        line.addBE(i);
-    line.print();
-
-    for (int i=5; i<20; i++)
-        line.addBE(i);
-    line.print();
-
-    line.addBE(30);
-    line.addBE(50);
-    line.addBE(70);
-    line.addBE(90);
-    line.print();
-
-    delete [] str;
-}
-
-void DshLine_Test_Ext()
-{
-    DshLine line1, line2;
-
-    line1.addBE(0);
-    line2.addBE(0);
-    if (line1 == line2)
-        printf("[%d] 0 = [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-
-    line1.addBE(1);
-    if (line1 > line2)
-        printf("[%d] 0:1 > [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-
-    line2.setLineNo(line1.getLineNo() + 1);
-    if (line1 < line2)
-        printf("[%d] 0:1 < [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-}
-
-void DshMessage_Test()
-{
-    DshMessage msg;
-
-    for (int i=0; i<50; i++) {
-        DshLine *line = new DshLine();
-        if (i%2 == 0)
-            line->setLine("Mary is a women");
-        else
-            line->setLine("Robert is a man");
-
-        for (int j=i; j<i+5; j++)
-            line->addBE(j);
-
-        if (i%3 == 0)
-            line->setState(EQUAL_STATE);
-        else if (i%3 == 1)
-            line->setState(SIMILAR_STATE);
-        else
-            line->setState(DIFFERENT_STATE);
-
-        msg.addLine(line);
-    }
-
-    msg.print();
-    msg.freeMemory();
-}
-
-void DshMessage_Test_Ext()
-{
-    DshMessage msg;
-
-    for (int i=0; i<10; i++) {
-        DshLine *line = new DshLine();
-        line->addBE(i);
-        if (i%2 == 0)
-            line->setLine("I am Nicole Nie");
-        else
-            line->setLine("My wife is Awa Wang");
-        msg.addLine(line);
-    }
-    msg.print();
-    msg.freeMemory();
-    
-    for (int i=10; i>0; i--) {
-        DshLine *line = new DshLine();
-        line->addBE(0);
-        line->setLineNo(i);
-        if (i%2 == 0)
-            line->setLine("Nicole loves Awa");
-        else
-            line->setLine("Awa loves Nicole");
-        msg.addLine(line);
-    }
-    msg.print();
-    msg.freeMemory();
-}
-
-void DshMessage_Test_Pack()
-{
-    DshMessage msg1, msg2;
-
-    for (int i=0; i<10; i++) {
-        DshLine *line = new DshLine();
-        line->addBE(i);
-        if (i%2 == 0)
-            line->setLine("I am Nicole Nie");
-        else
-            line->setLine("My wife is Awa Wang");
-        msg1.addLine(line);
-    }
-
-    printf("\n");
-    msg1.print();
-
-    msg2.unpack(msg1.pack());
-    printf("\n");
-    msg2.print();
-
-    msg1.freeMemory();
-}
-
-void DshMessage_Test_ReadStr()
-{
-    DshMessage msg;
-
-    msg.readFromString("This is a test 1\nThis is a test 2\nThis is a test 3\nThis is a test 4\nThis is a test 5\n");
-
-    msg.print();
-    for (int i=0; i<msg.getSize(); i++)
-        delete msg.getLine(i)->getLine();
-}
-
-void DshAggregator_Test()
-{
-    DshAggregator aggregator;
-    DshMessage *aggregatedMsg = NULL;
-
-    const int NUM_MSG = 10;
-    const int NUM_LINE = 10;
-
-    // test 1
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (j%2 == 0)
-                line->setLine("I am a man");
-            else
-                line->setLine("I am a women");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-
-    // test 2
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (i == (NUM_MSG - 1))
-                line->setLine("I am a man");
-            else
-                line->setLine("Who are you");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-
-    // test 3
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (i == (NUM_MSG - 1))
-                line->setLine("Who are you");
-            else if (i == (NUM_MSG - 2))
-                line->setLine("I am a women");
-            else
-                line->setLine("I am a woman");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-}
-
-void DshAggregator_Test_Ext()
-{
-    DshAggregator aggregator;
-    DshMessage *aggregatedMsg = NULL;
-
-    const int NUM_MSG = 10;
-    const int NUM_LINE = 10;
-
-    // test 1
-    printf("\n");
-    for (int i=NUM_MSG-1; i>=0; i--) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (j%2 == 0)
-                line->setLine("I am a man");
-            else
-                line->setLine("I am a women");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-}
-
-int main(int argc, char **argv)
-{
-    // Test Levenshtein class
-    Levenshtein_Test();
-
-    // Test DshLine class
-    DshLine_Test();
-
-    // Test DshLine class
-    DshLine_Test_Ext();
-
-    // Test DshMessage class
-    DshMessage_Test();
-
-    // Test DshMessage class
-    DshMessage_Test_Ext();
-
-    // Test DshMessage class
-    DshMessage_Test_Pack();
-
-    // Test DshMessage class
-    DshMessage_Test_ReadStr();
-
-    // Test DshAggregator class
-    DshAggregator_Test();
-
-    // Test DshAggregator class
-    DshAggregator_Test_Ext();
-    
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp
deleted file mode 100644
index 6235d68..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Levenshtein
-
- Description: Levenshtein algorithm.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "levenshtein.hpp"
-
-#include <algorithm>
-
-int Levenshtein::Distance(const string &s1, const string &s2)
-{
-    int i, j, cost;
-    int n = s1.length(), m = s2.length();
-    int *matrix = new int[(m + 1) * (n + 1)]; 
-
-    if (m == 0) 
-        return n;
-    if (n == 0) 
-        return m;
-
-    m++;
-    n++;
-
-    for (i = 0; i < n; i ++)    
-        matrix[i] = i;
-    for (i = 0; i < m; i ++)    
-        matrix[i * n] = i;
-    
-    for (i = 1; i < n; i ++) {
-        for (j = 1; j < m; j ++) {
-            if (s1[i - 1] == s2[j - 1])
-                cost = 0;
-            else
-                cost = 1;
-            matrix[j * n + i] = Minimum(matrix[(j-1)*n+i]+1, matrix[j*n+i-1]+1, matrix[(j-1)*n+i-1]+cost);
-        }
-    }
-
-    cost = matrix[n * m - 1];
-    delete [] matrix;
-
-    return cost;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp
deleted file mode 100644
index 638c118..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Levenshtein
-
- Description: Levenshtein algorithm.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _LEVENSHTEIN_HPP
-#define _LEVENSHTEIN_HPP
-
-#include <string>
-
-using namespace std;
-
-class Levenshtein
-{
-    public:
-        static int Distance(const string &s1, const string &s2);
-        
-    private:
-        static inline int Minimum(int a, int b, int c)
-        {
-            return min(min(a, b), c);
-        };
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/.cvsignore b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/.cvsignore
deleted file mode 100644
index 8ded89a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.libs
-.deps
-*.lo
-*.la
-dsh_fe
-dsh_be
-Makefile
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix
deleted file mode 100644
index 87c0f90..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix
+++ /dev/null
@@ -1,54 +0,0 @@
-CC = xlC_r
-
-CFLAGS = -+ # treat .c file as c++ source code
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-all_64: dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-downfilter.so: downfilter.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ downfilter.c $(OTHER_FLAGS)
-
-upfilter.so: upfilter.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfilter.c $(OTHER_FLAGS)
-
-upfiltera.so: upfiltera.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfiltera.c $(OTHER_FLAGS)
-
-upfilterb.so: upfilterb.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfilterb.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-downfilter64.so: downfilter.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ downfilter.c $(OTHER_FLAGS)
-
-upfilter64.so: upfilter.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfilter.c $(OTHER_FLAGS)
-
-upfiltera64.so: upfiltera.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfiltera.c $(OTHER_FLAGS)
-
-upfilterb64.so: upfilterb.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfilterb.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.am b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.am
deleted file mode 100644
index b5e3430..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.am
+++ /dev/null
@@ -1,94 +0,0 @@
-dsh_fe64_SOURCES = dsh_fe.c
-dsh_be64_SOURCES = dsh_be.c
-downfilter64_la_SOURCES = downfilter.c
-upfilter64_la_SOURCES = upfilter.c
-upfiltera64_la_SOURCES = upfiltera.c
-upfilterb64_la_SOURCES = upfilterb.c
-dsh_fe_SOURCES = dsh_fe.c
-dsh_be_SOURCES = dsh_be.c
-downfilter_la_SOURCES = downfilter.c
-upfilter_la_SOURCES = upfilter.c
-upfiltera_la_SOURCES = upfiltera.c
-upfilterb_la_SOURCES = upfilterb.c
-if SYSTEM_AIX
-if BIT64
-bin_PROGRAMS = dsh_fe64 dsh_be64
-pkglib_LTLIBRARIES = downfilter64.la upfilter64.la upfiltera64.la upfilterb64.la
-dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-downfilter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-downfilter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfilter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-upfilter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfiltera64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-upfiltera64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfilterb64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-upfilterb64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe dsh_be
-pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-downfilter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-downfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfilter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-upfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfiltera_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-upfiltera_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-upfilterb_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-upfilterb_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-endif
-endif
-if SYSTEM_DARWIN
-bin_PROGRAMS = dsh_fe dsh_be
-pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-dsh_fe_CPPFLAGS = -I../../common -I../../include
-dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-dsh_be_CPPFLAGS = -I../../common -I../../include
-dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-downfilter_la_CPPFLAGS = -I../../common -I../../include
-downfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-upfilter_la_CPPFLAGS = -I../../common -I../../include
-upfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-upfiltera_la_CPPFLAGS = -I../../common -I../../include
-upfiltera_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-upfilterb_la_CPPFLAGS = -I../../common -I../../include
-upfilterb_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-endif
-if SYSTEM_LINUX
-if BIT64
-bin_PROGRAMS = dsh_fe64 dsh_be64
-pkglib_LTLIBRARIES = downfilter64.la upfilter64.la upfiltera64.la upfilterb64.la
-dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-downfilter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-downfilter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfilter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-upfilter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfiltera64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-upfiltera64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfilterb64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-upfilterb64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-else
-bin_PROGRAMS = dsh_fe dsh_be
-pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-downfilter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-downfilter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfilter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-upfilter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfiltera_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-upfiltera_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-upfilterb_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-upfilterb_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-endif
-endif
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.in b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.in
deleted file mode 100644
index 4cbe10c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.in
+++ /dev/null
@@ -1,910 +0,0 @@
-# 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@
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be$(EXEEXT)
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	dsh_be$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_FALSE@@SYSTEM_LINUX_TRUE@	dsh_be64$(EXEEXT)
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@bin_PROGRAMS = dsh_fe64$(EXEEXT) \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	dsh_be64$(EXEEXT)
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@bin_PROGRAMS = dsh_fe$(EXEEXT) \
-@SYSTEM_AIX_FALSE@@SYSTEM_DARWIN_TRUE@@SYSTEM_LINUX_FALSE@	dsh_be$(EXEEXT)
-subdir = usecase/dsh_filter2
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-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'
-am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)"
-LTLIBRARIES = $(pkglib_LTLIBRARIES)
-downfilter_la_LIBADD =
-am_downfilter_la_OBJECTS = downfilter_la-downfilter.lo
-downfilter_la_OBJECTS = $(am_downfilter_la_OBJECTS)
-downfilter_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(downfilter_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@am_downfilter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@am_downfilter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-@SYSTEM_DARWIN_TRUE@am_downfilter_la_rpath = -rpath $(pkglibdir)
-downfilter64_la_LIBADD =
-am_downfilter64_la_OBJECTS = downfilter64_la-downfilter.lo
-downfilter64_la_OBJECTS = $(am_downfilter64_la_OBJECTS)
-downfilter64_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(downfilter64_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@am_downfilter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am_downfilter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-upfilter_la_LIBADD =
-am_upfilter_la_OBJECTS = upfilter_la-upfilter.lo
-upfilter_la_OBJECTS = $(am_upfilter_la_OBJECTS)
-upfilter_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfilter_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@am_upfilter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@am_upfilter_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-@SYSTEM_DARWIN_TRUE@am_upfilter_la_rpath = -rpath $(pkglibdir)
-upfilter64_la_LIBADD =
-am_upfilter64_la_OBJECTS = upfilter64_la-upfilter.lo
-upfilter64_la_OBJECTS = $(am_upfilter64_la_OBJECTS)
-upfilter64_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfilter64_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@am_upfilter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am_upfilter64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-upfiltera_la_LIBADD =
-am_upfiltera_la_OBJECTS = upfiltera_la-upfiltera.lo
-upfiltera_la_OBJECTS = $(am_upfiltera_la_OBJECTS)
-upfiltera_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfiltera_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@am_upfiltera_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@am_upfiltera_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-@SYSTEM_DARWIN_TRUE@am_upfiltera_la_rpath = -rpath $(pkglibdir)
-upfiltera64_la_LIBADD =
-am_upfiltera64_la_OBJECTS = upfiltera64_la-upfiltera.lo
-upfiltera64_la_OBJECTS = $(am_upfiltera64_la_OBJECTS)
-upfiltera64_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfiltera64_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@am_upfiltera64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am_upfiltera64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-upfilterb_la_LIBADD =
-am_upfilterb_la_OBJECTS = upfilterb_la-upfilterb.lo
-upfilterb_la_OBJECTS = $(am_upfilterb_la_OBJECTS)
-upfilterb_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfilterb_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@am_upfilterb_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@am_upfilterb_la_rpath = -rpath \
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-@SYSTEM_DARWIN_TRUE@am_upfilterb_la_rpath = -rpath $(pkglibdir)
-upfilterb64_la_LIBADD =
-am_upfilterb64_la_OBJECTS = upfilterb64_la-upfilterb.lo
-upfilterb64_la_OBJECTS = $(am_upfilterb64_la_OBJECTS)
-upfilterb64_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(upfilterb64_la_LDFLAGS) $(LDFLAGS) -o $@
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@am_upfilterb64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@	$(pkglibdir)
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@am_upfilterb64_la_rpath = -rpath \
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@	$(pkglibdir)
-PROGRAMS = $(bin_PROGRAMS)
-am_dsh_be_OBJECTS = dsh_be-dsh_be.$(OBJEXT)
-dsh_be_OBJECTS = $(am_dsh_be_OBJECTS)
-dsh_be_LDADD = $(LDADD)
-dsh_be_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_be64_OBJECTS = dsh_be64-dsh_be.$(OBJEXT)
-dsh_be64_OBJECTS = $(am_dsh_be64_OBJECTS)
-dsh_be64_LDADD = $(LDADD)
-dsh_be64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_be64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe_OBJECTS = dsh_fe-dsh_fe.$(OBJEXT)
-dsh_fe_OBJECTS = $(am_dsh_fe_OBJECTS)
-dsh_fe_LDADD = $(LDADD)
-dsh_fe_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_dsh_fe64_OBJECTS = dsh_fe64-dsh_fe.$(OBJEXT)
-dsh_fe64_OBJECTS = $(am_dsh_fe64_OBJECTS)
-dsh_fe64_LDADD = $(LDADD)
-dsh_fe64_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(dsh_fe64_LDFLAGS) \
-	$(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-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 = $(downfilter_la_SOURCES) $(downfilter64_la_SOURCES) \
-	$(upfilter_la_SOURCES) $(upfilter64_la_SOURCES) \
-	$(upfiltera_la_SOURCES) $(upfiltera64_la_SOURCES) \
-	$(upfilterb_la_SOURCES) $(upfilterb64_la_SOURCES) \
-	$(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_SOURCES)
-DIST_SOURCES = $(downfilter_la_SOURCES) $(downfilter64_la_SOURCES) \
-	$(upfilter_la_SOURCES) $(upfilter64_la_SOURCES) \
-	$(upfiltera_la_SOURCES) $(upfiltera64_la_SOURCES) \
-	$(upfilterb_la_SOURCES) $(upfilterb64_la_SOURCES) \
-	$(dsh_be_SOURCES) $(dsh_be64_SOURCES) $(dsh_fe_SOURCES) \
-	$(dsh_fe64_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@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-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_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_CXX = @ac_ct_CXX@
-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@
-dsh_fe64_SOURCES = dsh_fe.c
-dsh_be64_SOURCES = dsh_be.c
-downfilter64_la_SOURCES = downfilter.c
-upfilter64_la_SOURCES = upfilter.c
-upfiltera64_la_SOURCES = upfiltera.c
-upfilterb64_la_SOURCES = upfilterb.c
-dsh_fe_SOURCES = dsh_fe.c
-dsh_be_SOURCES = dsh_be.c
-downfilter_la_SOURCES = downfilter.c
-upfilter_la_SOURCES = upfilter.c
-upfiltera_la_SOURCES = upfiltera.c
-upfilterb_la_SOURCES = upfilterb.c
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@pkglib_LTLIBRARIES = downfilter64.la upfilter64.la upfiltera64.la upfilterb64.la
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@pkglib_LTLIBRARIES = downfilter64.la upfilter64.la upfiltera64.la upfilterb64.la
-@SYSTEM_DARWIN_TRUE@pkglib_LTLIBRARIES = downfilter.la upfilter.la upfiltera.la upfilterb.la
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_fe64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_fe64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@dsh_be64_LDFLAGS = -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@dsh_be64_LDFLAGS = -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@downfilter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@downfilter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@downfilter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@downfilter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfilter64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfilter64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfilter64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfilter64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfiltera64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfiltera64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfiltera64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfiltera64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfilterb64_la_CPPFLAGS = -g -O0 -q64 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfilterb64_la_CPPFLAGS = -m64 -g -O0 -I../../common -I../../include -D__64BIT__
-@BIT64_TRUE@@SYSTEM_AIX_TRUE@upfilterb64_la_LDFLAGS = -module -q64 -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_TRUE@@SYSTEM_LINUX_TRUE@upfilterb64_la_LDFLAGS = -module -m64 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_fe_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_fe_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_fe_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@dsh_be_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@dsh_be_LDFLAGS = -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@dsh_be_LDFLAGS = -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@downfilter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@downfilter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@downfilter_la_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@downfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@downfilter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@downfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfilter_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfilter_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@upfilter_la_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfilter_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@upfilter_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfiltera_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfiltera_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@upfiltera_la_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfiltera_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfiltera_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@upfiltera_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfilterb_la_CPPFLAGS = -g -O0 -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfilterb_la_CPPFLAGS = -m32 -g -O0 -I../../common -I../../include
-@SYSTEM_DARWIN_TRUE@upfilterb_la_CPPFLAGS = -I../../common -I../../include
-@BIT64_FALSE@@SYSTEM_AIX_TRUE@upfilterb_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn64 -lrt -lpthread -lsci
-@BIT64_FALSE@@SYSTEM_LINUX_TRUE@upfilterb_la_LDFLAGS = -module -m32 -L../../common -L../../libsci -lcmn -lrt -lpthread -lsci
-@SYSTEM_DARWIN_TRUE@upfilterb_la_LDFLAGS = -module -L../../common -L../../libsci -lcmn -lpthread -lsci
-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) --gnu usecase/dsh_filter2/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu usecase/dsh_filter2/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):
-install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkglibdir)" || $(MKDIR_P) "$(DESTDIR)$(pkglibdir)"
-	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
-	}
-
-uninstall-pkglibLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
-	done
-
-clean-pkglibLTLIBRARIES:
-	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
-	@list='$(pkglib_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
-downfilter.la: $(downfilter_la_OBJECTS) $(downfilter_la_DEPENDENCIES) 
-	$(downfilter_la_LINK) $(am_downfilter_la_rpath) $(downfilter_la_OBJECTS) $(downfilter_la_LIBADD) $(LIBS)
-downfilter64.la: $(downfilter64_la_OBJECTS) $(downfilter64_la_DEPENDENCIES) 
-	$(downfilter64_la_LINK) $(am_downfilter64_la_rpath) $(downfilter64_la_OBJECTS) $(downfilter64_la_LIBADD) $(LIBS)
-upfilter.la: $(upfilter_la_OBJECTS) $(upfilter_la_DEPENDENCIES) 
-	$(upfilter_la_LINK) $(am_upfilter_la_rpath) $(upfilter_la_OBJECTS) $(upfilter_la_LIBADD) $(LIBS)
-upfilter64.la: $(upfilter64_la_OBJECTS) $(upfilter64_la_DEPENDENCIES) 
-	$(upfilter64_la_LINK) $(am_upfilter64_la_rpath) $(upfilter64_la_OBJECTS) $(upfilter64_la_LIBADD) $(LIBS)
-upfiltera.la: $(upfiltera_la_OBJECTS) $(upfiltera_la_DEPENDENCIES) 
-	$(upfiltera_la_LINK) $(am_upfiltera_la_rpath) $(upfiltera_la_OBJECTS) $(upfiltera_la_LIBADD) $(LIBS)
-upfiltera64.la: $(upfiltera64_la_OBJECTS) $(upfiltera64_la_DEPENDENCIES) 
-	$(upfiltera64_la_LINK) $(am_upfiltera64_la_rpath) $(upfiltera64_la_OBJECTS) $(upfiltera64_la_LIBADD) $(LIBS)
-upfilterb.la: $(upfilterb_la_OBJECTS) $(upfilterb_la_DEPENDENCIES) 
-	$(upfilterb_la_LINK) $(am_upfilterb_la_rpath) $(upfilterb_la_OBJECTS) $(upfilterb_la_LIBADD) $(LIBS)
-upfilterb64.la: $(upfilterb64_la_OBJECTS) $(upfilterb64_la_DEPENDENCIES) 
-	$(upfilterb64_la_LINK) $(am_upfilterb64_la_rpath) $(upfilterb64_la_OBJECTS) $(upfilterb64_la_LIBADD) $(LIBS)
-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
-dsh_be$(EXEEXT): $(dsh_be_OBJECTS) $(dsh_be_DEPENDENCIES) 
-	@rm -f dsh_be$(EXEEXT)
-	$(dsh_be_LINK) $(dsh_be_OBJECTS) $(dsh_be_LDADD) $(LIBS)
-dsh_be64$(EXEEXT): $(dsh_be64_OBJECTS) $(dsh_be64_DEPENDENCIES) 
-	@rm -f dsh_be64$(EXEEXT)
-	$(dsh_be64_LINK) $(dsh_be64_OBJECTS) $(dsh_be64_LDADD) $(LIBS)
-dsh_fe$(EXEEXT): $(dsh_fe_OBJECTS) $(dsh_fe_DEPENDENCIES) 
-	@rm -f dsh_fe$(EXEEXT)
-	$(dsh_fe_LINK) $(dsh_fe_OBJECTS) $(dsh_fe_LDADD) $(LIBS)
-dsh_fe64$(EXEEXT): $(dsh_fe64_OBJECTS) $(dsh_fe64_DEPENDENCIES) 
-	@rm -f dsh_fe64$(EXEEXT)
-	$(dsh_fe64_LINK) $(dsh_fe64_OBJECTS) $(dsh_fe64_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/downfilter64_la-downfilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/downfilter_la-downfilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_be64-dsh_be.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsh_fe64-dsh_fe.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfilter64_la-upfilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfilter_la-upfilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfiltera64_la-upfiltera.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfiltera_la-upfiltera.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfilterb64_la-upfilterb.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upfilterb_la-upfilterb.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-downfilter_la-downfilter.lo: downfilter.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(downfilter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT downfilter_la-downfilter.lo -MD -MP -MF $(DEPDIR)/downfilter_la-downfilter.Tpo -c -o downfilter_la-downfilter.lo `test -f 'downfilter.c' || echo '$(srcdir)/'`downfilter.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/downfilter_la-downfilter.Tpo $(DEPDIR)/downfilter_la-downfilter.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='downfilter.c' object='downfilter_la-downfilter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(downfilter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o downfilter_la-downfilter.lo `test -f 'downfilter.c' || echo '$(srcdir)/'`downfilter.c
-
-downfilter64_la-downfilter.lo: downfilter.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(downfilter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT downfilter64_la-downfilter.lo -MD -MP -MF $(DEPDIR)/downfilter64_la-downfilter.Tpo -c -o downfilter64_la-downfilter.lo `test -f 'downfilter.c' || echo '$(srcdir)/'`downfilter.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/downfilter64_la-downfilter.Tpo $(DEPDIR)/downfilter64_la-downfilter.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='downfilter.c' object='downfilter64_la-downfilter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(downfilter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o downfilter64_la-downfilter.lo `test -f 'downfilter.c' || echo '$(srcdir)/'`downfilter.c
-
-upfilter_la-upfilter.lo: upfilter.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfilter_la-upfilter.lo -MD -MP -MF $(DEPDIR)/upfilter_la-upfilter.Tpo -c -o upfilter_la-upfilter.lo `test -f 'upfilter.c' || echo '$(srcdir)/'`upfilter.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfilter_la-upfilter.Tpo $(DEPDIR)/upfilter_la-upfilter.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfilter.c' object='upfilter_la-upfilter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilter_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfilter_la-upfilter.lo `test -f 'upfilter.c' || echo '$(srcdir)/'`upfilter.c
-
-upfilter64_la-upfilter.lo: upfilter.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfilter64_la-upfilter.lo -MD -MP -MF $(DEPDIR)/upfilter64_la-upfilter.Tpo -c -o upfilter64_la-upfilter.lo `test -f 'upfilter.c' || echo '$(srcdir)/'`upfilter.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfilter64_la-upfilter.Tpo $(DEPDIR)/upfilter64_la-upfilter.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfilter.c' object='upfilter64_la-upfilter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilter64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfilter64_la-upfilter.lo `test -f 'upfilter.c' || echo '$(srcdir)/'`upfilter.c
-
-upfiltera_la-upfiltera.lo: upfiltera.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfiltera_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfiltera_la-upfiltera.lo -MD -MP -MF $(DEPDIR)/upfiltera_la-upfiltera.Tpo -c -o upfiltera_la-upfiltera.lo `test -f 'upfiltera.c' || echo '$(srcdir)/'`upfiltera.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfiltera_la-upfiltera.Tpo $(DEPDIR)/upfiltera_la-upfiltera.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfiltera.c' object='upfiltera_la-upfiltera.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfiltera_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfiltera_la-upfiltera.lo `test -f 'upfiltera.c' || echo '$(srcdir)/'`upfiltera.c
-
-upfiltera64_la-upfiltera.lo: upfiltera.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfiltera64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfiltera64_la-upfiltera.lo -MD -MP -MF $(DEPDIR)/upfiltera64_la-upfiltera.Tpo -c -o upfiltera64_la-upfiltera.lo `test -f 'upfiltera.c' || echo '$(srcdir)/'`upfiltera.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfiltera64_la-upfiltera.Tpo $(DEPDIR)/upfiltera64_la-upfiltera.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfiltera.c' object='upfiltera64_la-upfiltera.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfiltera64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfiltera64_la-upfiltera.lo `test -f 'upfiltera.c' || echo '$(srcdir)/'`upfiltera.c
-
-upfilterb_la-upfilterb.lo: upfilterb.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilterb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfilterb_la-upfilterb.lo -MD -MP -MF $(DEPDIR)/upfilterb_la-upfilterb.Tpo -c -o upfilterb_la-upfilterb.lo `test -f 'upfilterb.c' || echo '$(srcdir)/'`upfilterb.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfilterb_la-upfilterb.Tpo $(DEPDIR)/upfilterb_la-upfilterb.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfilterb.c' object='upfilterb_la-upfilterb.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilterb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfilterb_la-upfilterb.lo `test -f 'upfilterb.c' || echo '$(srcdir)/'`upfilterb.c
-
-upfilterb64_la-upfilterb.lo: upfilterb.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilterb64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT upfilterb64_la-upfilterb.lo -MD -MP -MF $(DEPDIR)/upfilterb64_la-upfilterb.Tpo -c -o upfilterb64_la-upfilterb.lo `test -f 'upfilterb.c' || echo '$(srcdir)/'`upfilterb.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/upfilterb64_la-upfilterb.Tpo $(DEPDIR)/upfilterb64_la-upfilterb.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='upfilterb.c' object='upfilterb64_la-upfilterb.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upfilterb64_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o upfilterb64_la-upfilterb.lo `test -f 'upfilterb.c' || echo '$(srcdir)/'`upfilterb.c
-
-dsh_be-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be-dsh_be.Tpo -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be-dsh_be.Tpo $(DEPDIR)/dsh_be-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_be64-dsh_be.o: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.o -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.o `test -f 'dsh_be.c' || echo '$(srcdir)/'`dsh_be.c
-
-dsh_be64-dsh_be.obj: dsh_be.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_be64-dsh_be.obj -MD -MP -MF $(DEPDIR)/dsh_be64-dsh_be.Tpo -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_be64-dsh_be.Tpo $(DEPDIR)/dsh_be64-dsh_be.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_be.c' object='dsh_be64-dsh_be.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_be64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_be64-dsh_be.obj `if test -f 'dsh_be.c'; then $(CYGPATH_W) 'dsh_be.c'; else $(CYGPATH_W) '$(srcdir)/dsh_be.c'; fi`
-
-dsh_fe-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe-dsh_fe.Tpo -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe-dsh_fe.Tpo $(DEPDIR)/dsh_fe-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-dsh_fe64-dsh_fe.o: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.o -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.o `test -f 'dsh_fe.c' || echo '$(srcdir)/'`dsh_fe.c
-
-dsh_fe64-dsh_fe.obj: dsh_fe.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsh_fe64-dsh_fe.obj -MD -MP -MF $(DEPDIR)/dsh_fe64-dsh_fe.Tpo -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/dsh_fe64-dsh_fe.Tpo $(DEPDIR)/dsh_fe64-dsh_fe.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='dsh_fe.c' object='dsh_fe64-dsh_fe.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dsh_fe64_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsh_fe64-dsh_fe.obj `if test -f 'dsh_fe.c'; then $(CYGPATH_W) 'dsh_fe.c'; else $(CYGPATH_W) '$(srcdir)/dsh_fe.c'; fi`
-
-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 $(LTLIBRARIES) $(PROGRAMS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-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)
-
-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-binPROGRAMS clean-generic clean-libtool \
-	clean-pkglibLTLIBRARIES mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	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-binPROGRAMS install-pkglibLTLIBRARIES
-
-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 -rf ./$(DEPDIR)
-	-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: uninstall-binPROGRAMS uninstall-pkglibLTLIBRARIES
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir 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-pdf \
-	install-pdf-am install-pkglibLTLIBRARIES 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 uninstall-binPROGRAMS uninstall-pkglibLTLIBRARIES
-
-
-# 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/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c
deleted file mode 100644
index ef7a1a7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-
-    int num_successors;
-    rc = SCI_Query(NUM_SUCCESSORS, &num_successors);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    }
-    int successor_ids[num_successors];
-    rc = SCI_Query(SUCCESSOR_IDLIST, successor_ids);
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_ids, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c
deleted file mode 100644
index faf81c0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(UP_FILTER, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_INTERRUPT;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c
deleted file mode 100644
index bec83ce..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-#ifdef __64BIT__
-    sprintf(fpath, "%s/downfilter64.so", pwd);
-#else
-    sprintf(fpath, "%s/downfilter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = DOWN_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfilter64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfilter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfiltera64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfiltera.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER_A;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfilterb64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfilterb.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER_B;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(DOWN_FILTER, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c
deleted file mode 100644
index 5b3ebac..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(UP_FILTER_A, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c
deleted file mode 100644
index 763e3c3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(UP_FILTER_B, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c
deleted file mode 100644
index d26ea88..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
