diff --git a/pom.xml b/pom.xml
index 6010db5..5b37e5a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -365,22 +365,6 @@
                 <packages>org.apache.xalan.samples*</packages>
               </group>
             </groups>
-            <reportSet>
-              <id>xalan2jdoc</id>
-              <name>xalan2jdoc</name>
-              <description>Doclet using old APIs; may not run</description>
-              <configuration>
-                <doclet>xalanjdoc.Standard</doclet>
-                <docletPath>xalan2jdoc/legacy_blob/xalan2jdoc.jar</docletPath>
-                <!-- Not sure what value ant's build.apidocs is equivalent
-                     to here. and not sure we need it. 
-                -->
-                <!-- <additionalOptions> -->
-                <!--   <additionalOption>-d</additionalOption> -->
-                <!--   <additionalOption>${build.apidocs}</additionalOption> -->
-                <!-- </additionalOptions> -->
-              </configuration>
-            </reportSet>
           </configuration>
 
           <executions>
diff --git a/xalan2jdoc/README b/xalan2jdoc/README
deleted file mode 100644
index 09077a9..0000000
--- a/xalan2jdoc/README
+++ /dev/null
@@ -1,3 +0,0 @@
-LEGACY JARFILE WITH DOCUMENTATION ONLY. WILL NOT BUILD.
-
-Please see comment at top of this module's POM.XML for explanation.
diff --git a/xalan2jdoc/README~ b/xalan2jdoc/README~
deleted file mode 100644
index 43054df..0000000
--- a/xalan2jdoc/README~
+++ /dev/null
@@ -1,2 +0,0 @@
-Unfortunately, this will not currently build, since it depends on com.tools.doclets,
-predating the new jdk.javadoc.doclet API. There is some evidence that it may still _run_.
diff --git a/xalan2jdoc/legacy_blob/xalan2jdoc.jar b/xalan2jdoc/legacy_blob/xalan2jdoc.jar
deleted file mode 100644
index dcc37db..0000000
--- a/xalan2jdoc/legacy_blob/xalan2jdoc.jar
+++ /dev/null
Binary files differ
diff --git a/xalan2jdoc/pom.xml b/xalan2jdoc/pom.xml
deleted file mode 100644
index 19a0049..0000000
--- a/xalan2jdoc/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- ================================================================
-Xalan has been using a custom doclet to produce additional index pages
-for deprecated classes, constants, and so on. This is a decompiled
-version of it.
-
-unfortunately, THIS WILL NOT CURRENTLY BUILD, since it depends on the
-com.sun.tools.doclets API, which was replaced around Java 8 or 9 by
-jdk.javadoc.doclet API. It could be rewritten based on the latter,
-but I haven't yet wanted to invest cycles in it.
-
-However it *does* still seem to run (mostly?) when javadoc is told to
-use it. Either that, or we're falling back to the "standard" doclet
-and it produces very similar output.
-
-So... I've put the jarfile we decompiled this from into a legacy_blob/
-directory, and invoking that. The source here is currently considered just
-documentation, and xalan-project does NOT declare it as a child module
-so no attempt is made to actual build the POM (which would fail).
-
-It isn't good. But it isn't worse than the ant-based build, and is
-better than nothing. At least it seems to produce the previously
-missing allclasses, constant_values, deprecated_list, help_doc,
-index-all and index HTML files
-================================================================ -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>xalan</groupId>
-    <artifactId>xalan-project</artifactId>
-    <version>2.7.3</version>
-  </parent>
-
-  <artifactId>xalan2jdoclet</artifactId>
-  <name>@xsl.usage doclet JDK 8</name>
-  <description>
-    Implementation of an indexing doclet used in the Xalan package's javadoc.
-    Its output includes:
-    allclasses_frame.html
-    allclasses_noframe.html
-    constant_values.html
-    deprecated_list.html
-    help_doc.html
-    index_all.html
-    index.html
-  </description>
-
-  <dependencies>
-    <!-- Automatically depends on tools.jar up to JDK 8, but not on JDK 9+.
-         This way, we do not need to manually define profiles for this task.
-    -->
-    <dependency>
-      <groupId>com.github.olivergondza</groupId>
-      <artifactId>maven-jdk-tools-wrapper</artifactId>
-      <version>0.1</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <!-- Copy generated jarfile up to xalan-java/build/,
-           for backward compatibility with Ant builds. -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
diff --git a/xalan2jdoc/pom.xml~ b/xalan2jdoc/pom.xml~
deleted file mode 100644
index c9d4040..0000000
--- a/xalan2jdoc/pom.xml~
+++ /dev/null
@@ -1,41 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>xalan</groupId>
-    <artifactId>xalan-project</artifactId>
-    <version>2.7.3</version>
-  </parent>
-
-  <artifactId>xalan2jtaglet</artifactId>
-  <name>@xsl.usage taglet JDK 8</name>
-  <description>
-    Implementation of the @xsl.usage taglet, used in the Xalan package's javadoc
-    to indicate classes which, while public for cross-module access, are not
-    intended to be called by end-users.
-  </description>
-
-  <dependencies>
-    <!-- Automatically depends on tools.jar up to JDK 8, but not on JDK 9+.
-         This way, we do not need to manually define profiles for this task.
-    -->
-    <dependency>
-      <groupId>com.github.olivergondza</groupId>
-      <artifactId>maven-jdk-tools-wrapper</artifactId>
-      <version>0.1</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <!-- Copy generated jarfile up to xalan-java/build/,
-           for backward compatibility with Ant builds. -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
diff --git a/xalan2jdoc/src/main/java/AbstractIndexWriter.java b/xalan2jdoc/src/main/java/AbstractIndexWriter.java
deleted file mode 100644
index 116ccb1..0000000
--- a/xalan2jdoc/src/main/java/AbstractIndexWriter.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.Doc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.IndexBuilder;
-import java.io.IOException;
-import java.util.List;
-
-public class AbstractIndexWriter extends HtmlStandardWriter {
-   protected IndexBuilder indexbuilder;
-
-   protected AbstractIndexWriter(String filename, IndexBuilder indexbuilder) throws IOException {
-      super(filename);
-      this.indexbuilder = indexbuilder;
-   }
-
-   protected AbstractIndexWriter(String path, String filename, String relpath, IndexBuilder indexbuilder) throws IOException {
-      super(path, filename, relpath);
-      this.indexbuilder = indexbuilder;
-   }
-
-   protected void generateContents(Character unicode, List memberlist) {
-      this.anchor("_" + unicode + "_");
-      this.h2();
-      this.bold(unicode.toString());
-      this.h2End();
-      this.dl();
-
-      for(int i = 0; i < memberlist.size(); ++i) {
-         Doc element = (Doc)memberlist.get(i);
-         if (element instanceof MemberDoc) {
-            this.printDescription((MemberDoc)element);
-         } else if (element instanceof ClassDoc) {
-            this.printDescription((ClassDoc)element);
-         } else if (element instanceof PackageDoc) {
-            this.printDescription((PackageDoc)element);
-         }
-      }
-
-      this.dlEnd();
-      this.hr();
-   }
-
-   protected void navLinkIndex() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Index");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void printClassInfo(ClassDoc cd) {
-      if (cd.isOrdinaryClass()) {
-         this.print("class ");
-      } else if (cd.isInterface()) {
-         this.print("interface ");
-      } else if (cd.isException()) {
-         this.print("exception ");
-      } else {
-         this.print("error ");
-      }
-
-      this.printPreQualifiedClassLink(cd);
-      this.print('.');
-   }
-
-   protected void printComment(ProgramElementDoc element) {
-      Tag[] tags;
-      if ((tags = element.tags("deprecated")).length > 0) {
-         this.boldText("doclet.Deprecated");
-         this.space();
-         this.printInlineDeprecatedComment(tags[0]);
-      } else {
-         for(ClassDoc cont = element.containingClass(); cont != null; cont = cont.containingClass()) {
-            if (cont.tags("deprecated").length > 0) {
-               this.boldText("doclet.Deprecated");
-               this.space();
-               break;
-            }
-         }
-
-         this.printSummaryComment(element);
-      }
-   }
-
-   protected void printDescription(ClassDoc cd) {
-      this.dt();
-      this.printClassLink(cd, true);
-      this.print(" - ");
-      this.printClassInfo(cd);
-      this.dd();
-      this.printComment(cd);
-   }
-
-   protected void printDescription(MemberDoc element) {
-      String name = element instanceof ExecutableMemberDoc ? element.name() + ((ExecutableMemberDoc)element).flatSignature() : element.name();
-      ClassDoc containing = element.containingClass();
-      String qualname = containing.qualifiedName();
-      String baseClassName = containing.name();
-      this.dt();
-      this.printDocLink(element, name, true);
-      this.println(" - ");
-      this.printMemberDesc(element);
-      this.println();
-      this.dd();
-      this.printComment(element);
-      this.println();
-   }
-
-   protected void printDescription(PackageDoc pd) {
-      this.dt();
-      this.printPackageLink(pd);
-      this.print(" - ");
-      this.print("package " + pd.name());
-      this.dd();
-      this.printSummaryComment(pd);
-   }
-
-   protected void printMemberDesc(MemberDoc member) {
-      ClassDoc containing = member.containingClass();
-      String classdesc = (containing.isInterface() ? "interface " : "class ") + this.getPreQualifiedClassLink(containing);
-      if (member.isField()) {
-         if (member.isStatic()) {
-            this.printText("doclet.Static_variable_in", classdesc);
-         } else {
-            this.printText("doclet.Variable_in", classdesc);
-         }
-      } else if (member.isConstructor()) {
-         this.printText("doclet.Constructor_for", classdesc);
-      } else if (member.isMethod()) {
-         if (member.isStatic()) {
-            this.printText("doclet.Static_method_in", classdesc);
-         } else {
-            this.printText("doclet.Method_in", classdesc);
-         }
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/AbstractPackageIndexWriter.java b/xalan2jdoc/src/main/java/AbstractPackageIndexWriter.java
deleted file mode 100644
index c81b5a9..0000000
--- a/xalan2jdoc/src/main/java/AbstractPackageIndexWriter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import java.io.IOException;
-import java.util.Arrays;
-
-public abstract class AbstractPackageIndexWriter extends HtmlStandardWriter {
-   protected PackageDoc[] packages;
-
-   public AbstractPackageIndexWriter(String filename) throws IOException {
-      super(filename);
-      this.packages = Standard.configuration().packages;
-   }
-
-   protected void generateIndex() {
-      this.printIndexContents(this.packages, "doclet.Package_Summary");
-   }
-
-   protected void generatePackageIndexFile() throws IOException {
-      this.printHeader(this.getText("doclet.Window_Overview", Standard.configuration().windowtitle));
-      this.printNavigationBarHeader();
-      this.printOverviewHeader();
-      this.generateIndex();
-      this.printOverview();
-      this.printNavigationBarFooter();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navLinkContents() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Overview");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void printAllClassesPackagesLink() {
-   }
-
-   protected void printConfigurationTitle() {
-      if (Standard.configuration().doctitle.length() > 0) {
-         this.center();
-         this.h2();
-         this.print(Standard.configuration().doctitle);
-         this.h2End();
-         this.centerEnd();
-      }
-   }
-
-   protected void printIndexContents(PackageDoc[] packages, String text) {
-      if (packages.length > 0) {
-         Arrays.sort((Object[])packages);
-         this.printIndexHeader(text);
-         this.printAllClassesPackagesLink();
-
-         for(int i = 0; i < packages.length; ++i) {
-            PackageDoc packagedoc = packages[i];
-            this.printIndexRow(packagedoc);
-         }
-
-         this.printIndexFooter();
-      }
-   }
-
-   protected abstract void printIndexFooter();
-
-   protected abstract void printIndexHeader(String var1);
-
-   protected abstract void printIndexRow(PackageDoc var1);
-
-   protected abstract void printNavigationBarFooter();
-
-   protected abstract void printNavigationBarHeader();
-
-   protected void printOverview() throws IOException {
-   }
-
-   protected abstract void printOverviewHeader();
-}
diff --git a/xalan2jdoc/src/main/java/AbstractPackageWriter.java b/xalan2jdoc/src/main/java/AbstractPackageWriter.java
deleted file mode 100644
index efe52b6..0000000
--- a/xalan2jdoc/src/main/java/AbstractPackageWriter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public abstract class AbstractPackageWriter extends HtmlStandardWriter {
-   PackageDoc packagedoc;
-
-   public AbstractPackageWriter(String path, String filename, PackageDoc packagedoc) throws IOException, DocletAbortException {
-      super(path, filename, DirectoryManager.getRelativePath(packagedoc.name()));
-      this.packagedoc = packagedoc;
-   }
-
-   protected abstract void generateClassListing();
-
-   protected void generatePackageFile() throws IOException {
-      String pkgName = this.packagedoc.toString();
-      String heading = this.getText("doclet.Window_Package", Standard.configuration().windowtitle, pkgName);
-      this.printHeader(heading);
-      this.printPackageHeader(pkgName);
-      this.generateClassListing();
-      this.printPackageDescription();
-      this.printPackageFooter();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navLinkPackage() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Package");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected abstract void printPackageDescription() throws IOException;
-
-   protected abstract void printPackageFooter();
-
-   protected abstract void printPackageHeader(String var1);
-}
diff --git a/xalan2jdoc/src/main/java/AbstractSubWriter.java b/xalan2jdoc/src/main/java/AbstractSubWriter.java
deleted file mode 100644
index 3962ecc..0000000
--- a/xalan2jdoc/src/main/java/AbstractSubWriter.java
+++ /dev/null
@@ -1,425 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.Tag;
-import com.sun.javadoc.Type;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-public abstract class AbstractSubWriter {
-   protected final SubWriterHolderWriter writer;
-
-   AbstractSubWriter(SubWriterHolderWriter writer) {
-      this.writer = writer;
-   }
-
-   protected void bold(String str) {
-      this.writer.bold(str);
-      this.writer.displayLength += str.length();
-   }
-
-   protected ProgramElementDoc[] eligibleMembers(ProgramElementDoc[] members) {
-      if (!Standard.configuration().nodeprecated) {
-         return members;
-      } else {
-         List list = new ArrayList();
-
-         for(int i = 0; i < members.length; ++i) {
-            if (members[i].tags("deprecated").length == 0) {
-               list.add(members[i]);
-            }
-         }
-
-         return list.toArray(new ProgramElementDoc[list.size()]);
-      }
-   }
-
-   protected String makeSpace(int len) {
-      if (len <= 0) {
-         return "";
-      } else {
-         StringBuffer sb = new StringBuffer(len);
-
-         for(int i = 0; i < len; ++i) {
-            sb.append(' ');
-         }
-
-         return sb.toString();
-      }
-   }
-
-   public abstract ProgramElementDoc[] members(ClassDoc var1);
-
-   protected String modifierString(MemberDoc member) {
-      int ms = member.modifierSpecifier();
-      int no = 288;
-      return Modifier.toString(ms & ~no);
-   }
-
-   protected String name(ProgramElementDoc member) {
-      return member.name();
-   }
-
-   protected void navDetailLink(ClassDoc cd) {
-      ProgramElementDoc[] members = this.members(cd);
-      this.printNavDetailLink(members.length > 0);
-   }
-
-   protected void navSummaryLink(ClassDoc cd) {
-      ProgramElementDoc[] members = this.members(cd);
-      if (members.length > 0) {
-         this.printNavSummaryLink(null, true);
-      } else {
-         for(ClassDoc icd = cd.superclass(); icd != null; icd = icd.superclass()) {
-            ProgramElementDoc[] inhmembers = this.members(icd);
-            if (inhmembers.length > 0) {
-               this.printNavSummaryLink(icd, true);
-               return;
-            }
-         }
-
-         this.printNavSummaryLink(null, false);
-      }
-   }
-
-   protected void print(char ch) {
-      this.writer.print(ch);
-      ++this.writer.displayLength;
-   }
-
-   protected void print(String str) {
-      this.writer.print(str);
-      this.writer.displayLength += str.length();
-   }
-
-   protected abstract void printBodyHtmlEnd(ClassDoc var1);
-
-   protected void printComment(ProgramElementDoc member) {
-      if (member.inlineTags().length > 0) {
-         this.writer.dd();
-         this.writer.printInlineComment(member);
-      }
-   }
-
-   protected void printCommentAndTags(ProgramElementDoc member) {
-      this.printComment(member);
-      this.printTags(member);
-   }
-
-   protected void printDeprecated(ProgramElementDoc member) {
-      Tag[] deprs = member.tags("deprecated");
-      if (deprs.length > 0) {
-         this.writer.dd();
-         this.writer.boldText("doclet.Deprecated");
-         this.writer.space();
-         this.writer.printInlineDeprecatedComment(deprs[0]);
-      } else {
-         this.printDeprecatedClassComment(member);
-      }
-   }
-
-   protected void printDeprecatedAPI(List deprmembers, String headingKey) {
-      if (deprmembers.size() > 0) {
-         this.writer.tableIndexSummary();
-         this.writer.tableHeaderStart("#CCCCFF");
-         this.writer.boldText(headingKey);
-         this.writer.tableHeaderEnd();
-
-         for(int i = 0; i < deprmembers.size(); ++i) {
-            ProgramElementDoc member = (ProgramElementDoc)deprmembers.get(i);
-            ClassDoc cd = member.containingClass();
-            this.writer.trBgcolorStyle("white", "TableRowColor");
-            this.writer.summaryRow(0);
-            this.printDeprecatedLink(member);
-            this.writer.br();
-            this.writer.printNbsps();
-            this.writer.printInlineDeprecatedComment(member.tags("deprecated")[0]);
-            this.writer.space();
-            this.writer.summaryRowEnd();
-            this.writer.trEnd();
-         }
-
-         this.writer.tableEnd();
-         this.writer.space();
-         this.writer.p();
-      }
-   }
-
-   protected void printDeprecatedClassComment(ProgramElementDoc member) {
-      Tag[] deprs = member.containingClass().tags("deprecated");
-      if (deprs.length > 0) {
-         this.writer.dd();
-         this.writer.boldText("doclet.Deprecated");
-         this.writer.space();
-      }
-   }
-
-   protected abstract void printDeprecatedLink(ProgramElementDoc var1);
-
-   protected void printFullComment(ProgramElementDoc member) {
-      this.writer.dl();
-      this.printDeprecated(member);
-      this.printCommentAndTags(member);
-      this.writer.dlEnd();
-   }
-
-   protected void printHead(MemberDoc member) {
-      this.writer.h3();
-      this.writer.print(member.name());
-      this.writer.h3End();
-   }
-
-   protected abstract void printHeader(ClassDoc var1);
-
-   protected void printInheritedMembersInfo(ClassDoc icd) {
-      ProgramElementDoc[] members = this.members(icd);
-      if (members.length > 0) {
-         Arrays.sort((Object[])members);
-         this.printInheritedSummaryHeader(icd);
-         this.printInheritedSummaryMember(icd, members[0]);
-
-         for(int i = 1; i < members.length; ++i) {
-            this.print(", ");
-            this.writer.println(' ');
-            this.printInheritedSummaryMember(icd, members[i]);
-         }
-
-         this.printInheritedSummaryFooter(icd);
-      }
-   }
-
-   public void printInheritedMembersSummary(ClassDoc cd) {
-      if (cd.isClass()) {
-         for(ClassDoc icd = cd.superclass(); icd != null; icd = icd.superclass()) {
-            this.printInheritedMembersInfo(icd);
-         }
-      } else {
-         ClassDoc[] iin = cd.interfaces();
-
-         for(int i = 0; i < iin.length; ++i) {
-            this.printInheritedMembersInfo(iin[i]);
-         }
-
-         for(int i = 0; i < iin.length; ++i) {
-            this.printInheritedMembersSummary(iin[i]);
-         }
-      }
-   }
-
-   public abstract void printInheritedSummaryAnchor(ClassDoc var1);
-
-   public void printInheritedSummaryFooter(ClassDoc cd) {
-      this.writer.printInheritedSummaryFooter(this, cd);
-   }
-
-   public void printInheritedSummaryHeader(ClassDoc cd) {
-      this.writer.printInheritedSummaryHeader(this, cd);
-   }
-
-   public abstract void printInheritedSummaryLabel(ClassDoc var1);
-
-   protected abstract void printInheritedSummaryLink(ClassDoc var1, ProgramElementDoc var2);
-
-   public void printInheritedSummaryMember(ClassDoc cd, ProgramElementDoc member) {
-      this.writer.printInheritedSummaryMember(this, cd, member);
-   }
-
-   protected abstract void printMember(ProgramElementDoc var1);
-
-   protected void printMemberCommentsFromInterfaces(ProgramElementDoc member) {
-   }
-
-   public void printMembers(ClassDoc cd) {
-      ProgramElementDoc[] members = this.members(cd);
-      if (members.length > 0) {
-         this.printHeader(cd);
-
-         for(int i = 0; i < members.length; ++i) {
-            if (i > 0) {
-               this.writer.printMemberHeader();
-            }
-
-            this.writer.println("");
-            this.printMember(members[i]);
-            this.writer.printMemberFooter();
-         }
-
-         this.printBodyHtmlEnd(cd);
-      }
-   }
-
-   public void printMembersSummary(ClassDoc cd) {
-      ProgramElementDoc[] members = this.members(cd);
-      if (members.length > 0) {
-         Arrays.sort((Object[])members);
-         this.printSummaryHeader(cd);
-
-         for(int i = 0; i < members.length; ++i) {
-            this.printSummaryMember(cd, members[i]);
-         }
-
-         this.printSummaryFooter(cd);
-      }
-   }
-
-   protected void printModifier(ProgramElementDoc member) {
-      if (member.isProtected()) {
-         this.print("protected ");
-      } else if (member.isPrivate()) {
-         this.print("private ");
-      } else if (!member.isPublic()) {
-         this.writer.printText("doclet.Package_private");
-         this.print(" ");
-      }
-
-      if (member.isMethod() && ((MethodDoc)member).isAbstract()) {
-         this.print("abstract ");
-      }
-
-      if (member.isStatic()) {
-         this.print("static");
-      }
-
-      this.writer.space();
-   }
-
-   protected void printModifierAndType(ProgramElementDoc member, Type type) {
-      this.writer.printTypeSummaryHeader();
-      this.printModifier(member);
-      if (type == null) {
-         if (member.isOrdinaryClass()) {
-            this.print("class");
-         } else {
-            this.print("interface");
-         }
-      } else {
-         this.printTypeLink(type);
-      }
-
-      this.writer.printTypeSummaryFooter();
-   }
-
-   protected void printModifiers(MemberDoc member) {
-      String mod = this.modifierString(member);
-      if (mod.length() > 0) {
-         this.print(mod);
-         this.print(' ');
-      }
-   }
-
-   protected abstract void printNavDetailLink(boolean var1);
-
-   protected abstract void printNavSummaryLink(ClassDoc var1, boolean var2);
-
-   protected void printStaticAndType(boolean isStatic, Type type) {
-      this.writer.printTypeSummaryHeader();
-      if (isStatic) {
-         this.print("static");
-      }
-
-      this.writer.space();
-      if (type != null) {
-         this.printTypeLink(type);
-      }
-
-      this.writer.printTypeSummaryFooter();
-   }
-
-   public abstract void printSummaryAnchor(ClassDoc var1);
-
-   public void printSummaryFooter(ClassDoc cd) {
-      this.writer.printSummaryFooter(this, cd);
-   }
-
-   public void printSummaryHeader(ClassDoc cd) {
-      this.writer.printSummaryHeader(this, cd);
-   }
-
-   public abstract void printSummaryLabel(ClassDoc var1);
-
-   protected abstract void printSummaryLink(ClassDoc var1, ProgramElementDoc var2);
-
-   public void printSummaryMember(ClassDoc cd, ProgramElementDoc member) {
-      this.writer.printSummaryMember(this, cd, member);
-   }
-
-   protected abstract void printSummaryType(ProgramElementDoc var1);
-
-   protected void printTags(ProgramElementDoc member) {
-      Tag[] since = member.tags("since");
-      Tag[] usages = member.tags("xsl.usage");
-      if (usages.length + member.seeTags().length + since.length > 0) {
-         this.writer.dd();
-         this.writer.dl();
-         this.writer.printSeeTags(member);
-         this.writer.printSinceTag(member);
-         this.writer.printUsageTags(member);
-         this.writer.dlEnd();
-         this.writer.ddEnd();
-      }
-   }
-
-   protected void printTypeLink(Type type) {
-      this.printTypeLinkNoDimension(type);
-      this.print(type.dimension());
-   }
-
-   protected void printTypeLinkNoDimension(Type type) {
-      ClassDoc cd = type.asClassDoc();
-      if (cd == null) {
-         this.print(type.typeName());
-      } else {
-         this.writer.printClassLink(cd);
-      }
-   }
-
-   protected void printTypedName(Type type, String name) {
-      if (type != null) {
-         this.printTypeLink(type);
-      }
-
-      if (name.length() > 0) {
-         this.writer.space();
-         this.writer.print(name);
-      }
-   }
-
-   protected void printUseInfo(Object mems, String heading) {
-      if (mems != null) {
-         List members = (List)mems;
-         if (members.size() > 0) {
-            this.writer.tableIndexSummary();
-            this.writer.tableUseInfoHeaderStart("#CCCCFF");
-            this.writer.print(heading);
-            this.writer.tableHeaderEnd();
-            Iterator it = members.iterator();
-
-            while(it.hasNext()) {
-               this.printSummaryMember(null, (ProgramElementDoc)it.next());
-            }
-
-            this.writer.tableEnd();
-            this.writer.space();
-            this.writer.p();
-         }
-      }
-   }
-
-   protected String typeString(MemberDoc member) {
-      String type = "";
-      if (member instanceof MethodDoc) {
-         type = ((MethodDoc)member).returnType().toString();
-      } else if (member instanceof FieldDoc) {
-         type = ((FieldDoc)member).type().toString();
-      }
-
-      return type;
-   }
-}
diff --git a/xalan2jdoc/src/main/java/AbstractTreeWriter.java b/xalan2jdoc/src/main/java/AbstractTreeWriter.java
deleted file mode 100644
index bdbc2c4..0000000
--- a/xalan2jdoc/src/main/java/AbstractTreeWriter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-public abstract class AbstractTreeWriter extends HtmlStandardWriter {
-   protected final ClassTree classtree;
-
-   protected AbstractTreeWriter(String filename, ClassTree classtree) throws IOException, DocletAbortException {
-      super(filename);
-      this.classtree = classtree;
-   }
-
-   protected AbstractTreeWriter(String path, String filename, ClassTree classtree, PackageDoc pkg) throws IOException, DocletAbortException {
-      super(path, filename, DirectoryManager.getRelativePath(pkg.name()));
-      this.classtree = classtree;
-   }
-
-   protected void generateLevelInfo(ClassDoc parent, List list) {
-      if (list.size() > 0) {
-         this.ul();
-
-         for(int i = 0; i < list.size(); ++i) {
-            ClassDoc local = (ClassDoc)list.get(i);
-            this.printPartialInfo(local);
-            this.printExtendsImplements(parent, local);
-            this.generateLevelInfo(local, this.classtree.subs(local));
-         }
-
-         this.ulEnd();
-      }
-   }
-
-   protected void generateTree(List list, String heading) {
-      if (list.size() > 0) {
-         ClassDoc cd = (ClassDoc)list.get(0);
-         this.printTreeHeading(heading);
-         this.generateLevelInfo(cd.isClass() ? (ClassDoc)list.get(0) : null, list);
-      }
-   }
-
-   protected void navLinkTree() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Tree");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void printExtendsImplements(ClassDoc parent, ClassDoc cd) {
-      ClassDoc[] interfaces = cd.interfaces();
-      if (interfaces.length > (cd.isInterface() ? 1 : 0)) {
-         Arrays.sort((Object[])interfaces);
-         if (cd.isInterface()) {
-            this.print("(" + this.getText("doclet.also") + " extends ");
-         } else {
-            this.print(" (implements ");
-         }
-
-         boolean printcomma = false;
-
-         for(int i = 0; i < interfaces.length; ++i) {
-            if (parent != interfaces[i]) {
-               if (printcomma) {
-                  this.print(", ");
-               }
-
-               this.printPreQualifiedClassLink(interfaces[i]);
-               printcomma = true;
-            }
-         }
-
-         this.println(")");
-      }
-   }
-
-   protected void printPartialInfo(ClassDoc cd) {
-      boolean isInterface = cd.isInterface();
-      this.li("circle");
-      this.print(isInterface ? "interface " : "class ");
-      this.printPreQualifiedBoldClassLink(cd);
-   }
-
-   protected void printTreeHeading(String heading) {
-      this.h2();
-      this.println(this.getText(heading));
-      this.h2End();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/AllClassesFrameWriter.java b/xalan2jdoc/src/main/java/AllClassesFrameWriter.java
deleted file mode 100644
index e21510f..0000000
--- a/xalan2jdoc/src/main/java/AllClassesFrameWriter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import com.sun.tools.doclets.IndexBuilder;
-import java.io.IOException;
-import java.util.List;
-
-public class AllClassesFrameWriter extends HtmlStandardWriter {
-   protected IndexBuilder indexbuilder;
-
-   public AllClassesFrameWriter(String filename, IndexBuilder indexbuilder) throws IOException, DocletAbortException {
-      super(filename);
-      this.indexbuilder = indexbuilder;
-   }
-
-   public static void generate(IndexBuilder indexbuilder) throws DocletAbortException {
-      String filename = "allclasses-frame.html";
-
-      try {
-         AllClassesFrameWriter allclassgen = new AllClassesFrameWriter(filename, indexbuilder);
-         allclassgen.generateAllClassesFile();
-         allclassgen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateAllClassesFile() throws IOException {
-      String label = this.getText("doclet.All_Classes");
-      this.printHeader(label);
-      this.printAllClassesTableHeader();
-      this.printAllClasses();
-      this.printAllClassesTableFooter();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void generateContents(List classlist) {
-      for(int i = 0; i < classlist.size(); ++i) {
-         ClassDoc cd = (ClassDoc)classlist.get(i);
-         if (this.isCoreClass(cd)) {
-            String label = this.italicsClassName(cd, false);
-            this.printTargetHyperLink(this.pathToClass(cd), "classFrame", label);
-            this.br();
-         }
-      }
-   }
-
-   protected void printAllClasses() {
-      for(int i = 0; i < this.indexbuilder.elements().length; ++i) {
-         Character unicode = (Character)this.indexbuilder.elements()[i];
-         this.generateContents(this.indexbuilder.getMemberList(unicode));
-      }
-   }
-
-   protected void printAllClassesTableFooter() {
-      this.fontEnd();
-      this.tdEnd();
-      this.trEnd();
-      this.tableEnd();
-   }
-
-   protected void printAllClassesTableHeader() {
-      this.fontSizeStyle("+1", "FrameHeadingFont");
-      this.boldText("doclet.All_Classes");
-      this.fontEnd();
-      this.br();
-      this.table();
-      this.tr();
-      this.tdNowrap();
-      this.fontStyle("FrameItemFont");
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ClassSubWriter.java b/xalan2jdoc/src/main/java/ClassSubWriter.java
deleted file mode 100644
index c921b80..0000000
--- a/xalan2jdoc/src/main/java/ClassSubWriter.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ProgramElementDoc;
-
-public class ClassSubWriter extends AbstractSubWriter {
-   ClassSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      return this.eligibleMembers(cd.innerClasses());
-   }
-
-   protected void printBodyHtmlEnd(ClassDoc cd) {
-   }
-
-   protected void printDeprecatedLink(ProgramElementDoc member) {
-      super.writer.printQualifiedClassLink((ClassDoc)member);
-   }
-
-   protected void printHeader(ClassDoc cd) {
-   }
-
-   public void printInheritedSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("inner_classes_inherited_from_class_" + cd.qualifiedName());
-   }
-
-   public void printInheritedSummaryLabel(ClassDoc cd) {
-      String clslink = super.writer.getPreQualifiedClassLink(cd);
-      super.writer.bold();
-      super.writer.printText("doclet.Inner_Classes_Inherited_From_Class", clslink);
-      super.writer.boldEnd();
-   }
-
-   protected void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      this.printSummaryLink(cd, member);
-   }
-
-   protected void printMember(ProgramElementDoc member) {
-   }
-
-   protected void printMemberLink(ProgramElementDoc member) {
-   }
-
-   protected void printMembersSummaryLink(ClassDoc cd, ClassDoc icd, boolean link) {
-      if (link) {
-         super.writer
-            .printHyperLink(
-               cd.name() + ".html",
-               cd == icd ? "inner_class_summary" : "inner_classes_inherited_from_class_" + icd.qualifiedName(),
-               super.writer.getText("doclet.Inner_Class_Summary")
-            );
-      } else {
-         super.writer.printText("doclet.Inner_Class_Summary");
-      }
-   }
-
-   protected void printNavDetailLink(boolean link) {
-   }
-
-   protected void printNavSummaryLink(ClassDoc cd, boolean link) {
-      if (link) {
-         super.writer
-            .printHyperLink(
-               "", cd == null ? "inner_class_summary" : "inner_classes_inherited_from_class_" + cd.qualifiedName(), super.writer.getText("doclet.navInner")
-            );
-      } else {
-         super.writer.printText("doclet.navInner");
-      }
-   }
-
-   public void printSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("inner_class_summary");
-   }
-
-   public void printSummaryLabel(ClassDoc cd) {
-      super.writer.boldText("doclet.Inner_Class_Summary");
-   }
-
-   protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      super.writer.bold();
-      super.writer.printClassLink((ClassDoc)member);
-      super.writer.boldEnd();
-   }
-
-   protected void printSummaryType(ProgramElementDoc member) {
-      ClassDoc cd = (ClassDoc)member;
-      this.printModifierAndType(cd, null);
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ClassUseMapper.java b/xalan2jdoc/src/main/java/ClassUseMapper.java
deleted file mode 100644
index 2ca2650..0000000
--- a/xalan2jdoc/src/main/java/ClassUseMapper.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ConstructorDoc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DocletAbortException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class ClassUseMapper {
-   private final ClassTree classtree;
-   public Map classToPackage = new HashMap();
-   public Map classToClass = new HashMap();
-   public Map classToSubclass = new HashMap();
-   public Map classToSubinterface = new HashMap();
-   public Map classToImplementingClass = new HashMap();
-   public Map classToField = new HashMap();
-   public Map classToMethodReturn = new HashMap();
-   public Map classToMethodArgs = new HashMap();
-   public Map classToMethodThrows = new HashMap();
-   public Map classToConstructorArgs = new HashMap();
-   public Map classToConstructorThrows = new HashMap();
-
-   private ClassUseMapper(RootDoc root, ClassTree classtree) {
-      this.classtree = classtree;
-      Iterator it = classtree.baseclasses().iterator();
-
-      while(it.hasNext()) {
-         this.subclasses((ClassDoc)it.next());
-      }
-
-      Iterator itx = classtree.baseinterfaces().iterator();
-
-      while(itx.hasNext()) {
-         this.implementingClasses((ClassDoc)itx.next());
-      }
-
-      ClassDoc[] classes = root.classes();
-
-      for(int i = 0; i < classes.length; ++i) {
-         ClassDoc cd = classes[i];
-         FieldDoc[] fields = cd.fields();
-
-         for(int j = 0; j < fields.length; ++j) {
-            FieldDoc fd = fields[j];
-            ClassDoc tcd = fd.type().asClassDoc();
-            if (tcd != null) {
-               this.add(this.classToField, tcd, fd);
-            }
-         }
-
-         ConstructorDoc[] cons = cd.constructors();
-
-         for(int j = 0; j < cons.length; ++j) {
-            this.mapExecutable(cons[j]);
-         }
-
-         MethodDoc[] meths = cd.methods();
-
-         for(int j = 0; j < meths.length; ++j) {
-            MethodDoc md = meths[j];
-            this.mapExecutable(md);
-            ClassDoc tcd = md.returnType().asClassDoc();
-            if (tcd != null) {
-               this.add(this.classToMethodReturn, tcd, md);
-            }
-         }
-      }
-   }
-
-   private void add(Map map, ClassDoc cd, ProgramElementDoc ref) {
-      this.refList(map, cd).add(ref);
-      this.packageSet(cd).add(ref.containingPackage());
-      this.classSet(cd).add(ref instanceof MemberDoc ? ((MemberDoc)ref).containingClass() : ref);
-   }
-
-   private void addAll(Map map, ClassDoc cd, Collection refs) {
-      if (refs != null) {
-         this.refList(map, cd).addAll(refs);
-         Set pkgSet = this.packageSet(cd);
-         Set clsSet = this.classSet(cd);
-
-         for(ProgramElementDoc pedoc : refs) {
-            pkgSet.add(pedoc.containingPackage());
-            clsSet.add(pedoc instanceof MemberDoc ? ((MemberDoc)pedoc).containingClass() : pedoc);
-         }
-      }
-   }
-
-   private Set classSet(ClassDoc cd) {
-      Set clsSet = (Set)this.classToClass.get(cd);
-      if (clsSet == null) {
-         clsSet = new TreeSet();
-         this.classToClass.put(cd, clsSet);
-      }
-
-      return clsSet;
-   }
-
-   public static void generate(RootDoc root, ClassTree classtree) throws DocletAbortException {
-      ClassUseMapper mapper = new ClassUseMapper(root, classtree);
-      ClassDoc[] classes = root.classes();
-
-      for(int i = 0; i < classes.length; ++i) {
-         ClassUseWriter.generate(mapper, classes[i]);
-      }
-
-      PackageDoc[] pkgs = Standard.configuration().packages;
-
-      for(int i = 0; i < pkgs.length; ++i) {
-         PackageUseWriter.generate(mapper, pkgs[i]);
-      }
-   }
-
-   private Collection implementingClasses(ClassDoc cd) {
-      Collection ret = (List)this.classToImplementingClass.get(cd);
-      if (ret == null) {
-         ret = new TreeSet();
-         List impl = this.classtree.implementingclasses(cd);
-         if (impl != null) {
-            ret.addAll(impl);
-            Iterator it = impl.iterator();
-
-            while(it.hasNext()) {
-               ret.addAll(this.subclasses((ClassDoc)it.next()));
-            }
-         }
-
-         Iterator it = this.subinterfaces(cd).iterator();
-
-         while(it.hasNext()) {
-            ret.addAll(this.implementingClasses((ClassDoc)it.next()));
-         }
-
-         this.addAll(this.classToImplementingClass, cd, ret);
-      }
-
-      return ret;
-   }
-
-   private void mapExecutable(ExecutableMemberDoc em) {
-      Parameter[] params = em.parameters();
-      boolean isConstructor = em.isConstructor();
-      List classArgs = new ArrayList();
-
-      for(int k = 0; k < params.length; ++k) {
-         ClassDoc pcd = params[k].type().asClassDoc();
-         if (pcd != null && !classArgs.contains(pcd)) {
-            this.add(isConstructor ? this.classToConstructorArgs : this.classToMethodArgs, pcd, em);
-            classArgs.add(pcd);
-         }
-      }
-
-      ClassDoc[] thr = em.thrownExceptions();
-
-      for(int k = 0; k < thr.length; ++k) {
-         this.add(isConstructor ? this.classToConstructorThrows : this.classToMethodThrows, thr[k], em);
-      }
-   }
-
-   private Set packageSet(ClassDoc cd) {
-      Set pkgSet = (Set)this.classToPackage.get(cd);
-      if (pkgSet == null) {
-         pkgSet = new TreeSet();
-         this.classToPackage.put(cd, pkgSet);
-      }
-
-      return pkgSet;
-   }
-
-   private List refList(Map map, ClassDoc cd) {
-      List list = (List)map.get(cd);
-      if (list == null) {
-         list = new ArrayList();
-         map.put(cd, list);
-      }
-
-      return list;
-   }
-
-   private Collection subclasses(ClassDoc cd) {
-      Collection ret = (Collection)this.classToSubclass.get(cd);
-      if (ret == null) {
-         ret = new TreeSet();
-         List subs = this.classtree.subclasses(cd);
-         if (subs != null) {
-            ret.addAll(subs);
-            Iterator it = subs.iterator();
-
-            while(it.hasNext()) {
-               ret.addAll(this.subclasses((ClassDoc)it.next()));
-            }
-         }
-
-         this.addAll(this.classToSubclass, cd, ret);
-      }
-
-      return ret;
-   }
-
-   private Collection subinterfaces(ClassDoc cd) {
-      Collection ret = (Collection)this.classToSubinterface.get(cd);
-      if (ret == null) {
-         ret = new TreeSet();
-         List subs = this.classtree.subinterfaces(cd);
-         if (subs != null) {
-            ret.addAll(subs);
-            Iterator it = subs.iterator();
-
-            while(it.hasNext()) {
-               ret.addAll(this.subinterfaces((ClassDoc)it.next()));
-            }
-         }
-
-         this.addAll(this.classToSubinterface, cd, ret);
-      }
-
-      return ret;
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ClassUseWriter.java b/xalan2jdoc/src/main/java/ClassUseWriter.java
deleted file mode 100644
index 275374c..0000000
--- a/xalan2jdoc/src/main/java/ClassUseWriter.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-public class ClassUseWriter extends SubWriterHolderWriter {
-   final ClassDoc classdoc;
-   final Map pkgToSubclass;
-   final Map pkgToSubinterface;
-   final Map pkgToImplementingClass;
-   final Map pkgToField;
-   final Map pkgToMethodReturn;
-   final Map pkgToMethodArgs;
-   final Map pkgToMethodThrows;
-   final Map pkgToConstructorArgs;
-   final Map pkgToConstructorThrows;
-   final SortedSet pkgSet;
-   final MethodSubWriter methodSubWriter;
-   final ConstructorSubWriter constrSubWriter;
-   final FieldSubWriter fieldSubWriter;
-   final ClassSubWriter classSubWriter;
-
-   public ClassUseWriter(ClassUseMapper mapper, String path, String filename, String relpath, ClassDoc classdoc) throws IOException, DocletAbortException {
-      super(path, filename, relpath);
-      this.classdoc = classdoc;
-      HtmlStandardWriter.currentcd = classdoc;
-      this.pkgSet = new TreeSet();
-      this.pkgToSubclass = this.pkgDivide(mapper.classToSubclass);
-      this.pkgToSubinterface = this.pkgDivide(mapper.classToSubinterface);
-      this.pkgToImplementingClass = this.pkgDivide(mapper.classToImplementingClass);
-      this.pkgToField = this.pkgDivide(mapper.classToField);
-      this.pkgToMethodReturn = this.pkgDivide(mapper.classToMethodReturn);
-      this.pkgToMethodArgs = this.pkgDivide(mapper.classToMethodArgs);
-      this.pkgToMethodThrows = this.pkgDivide(mapper.classToMethodThrows);
-      this.pkgToConstructorArgs = this.pkgDivide(mapper.classToConstructorArgs);
-      this.pkgToConstructorThrows = this.pkgDivide(mapper.classToConstructorThrows);
-      if (!this.pkgSet.equals(mapper.classToPackage.get(classdoc))) {
-         System.err.println("Internal error: package sets don't match: " + this.pkgSet + " with: " + mapper.classToPackage.get(classdoc));
-      }
-
-      this.methodSubWriter = new MethodSubWriter(this);
-      this.constrSubWriter = new ConstructorSubWriter(this);
-      this.fieldSubWriter = new FieldSubWriter(this);
-      this.classSubWriter = new ClassSubWriter(this);
-   }
-
-   public static void generate(ClassUseMapper mapper, ClassDoc classdoc) throws DocletAbortException {
-      String path = DirectoryManager.getDirectoryPath(classdoc.containingPackage());
-      if (path.length() > 0) {
-         path = path + File.separator;
-      }
-
-      path = path + "class-use";
-      String filename = classdoc.name() + ".html";
-      String pkgname = classdoc.containingPackage().name();
-      pkgname = pkgname + (pkgname.length() > 0 ? ".class-use" : "class-use");
-      String relpath = DirectoryManager.getRelativePath(pkgname);
-
-      try {
-         ClassUseWriter clsgen = new ClassUseWriter(mapper, path, filename, relpath, classdoc);
-         clsgen.generateClassUseFile();
-         clsgen.close();
-      } catch (IOException var8) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var8.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateClassList() throws IOException {
-      for(PackageDoc pkg : this.pkgSet) {
-         this.anchor(pkg.name());
-         this.tableIndexSummary();
-         this.tableHeaderStart("#CCCCFF");
-         this.printText("doclet.ClassUse_Uses.of.0.in.1", this.getClassLink(this.classdoc), this.getPackageLink(pkg));
-         this.tableHeaderEnd();
-         this.tableEnd();
-         this.space();
-         this.p();
-         this.generateClassUse(pkg);
-      }
-   }
-
-   protected void generateClassUse() throws IOException {
-      if (Standard.configuration().packages.length > 1) {
-         this.generatePackageList();
-      }
-
-      this.generateClassList();
-   }
-
-   protected void generateClassUse(PackageDoc pkg) throws IOException {
-      String classLink = this.getClassLink(this.classdoc);
-      String pkgLink = this.getPackageLink(pkg);
-      this.classSubWriter.printUseInfo(this.pkgToSubclass.get(pkg), this.getText("doclet.ClassUse_Subclass", classLink, pkgLink));
-      this.classSubWriter.printUseInfo(this.pkgToSubinterface.get(pkg), this.getText("doclet.ClassUse_Subinterface", classLink, pkgLink));
-      this.classSubWriter.printUseInfo(this.pkgToImplementingClass.get(pkg), this.getText("doclet.ClassUse_ImplementingClass", classLink, pkgLink));
-      this.fieldSubWriter.printUseInfo(this.pkgToField.get(pkg), this.getText("doclet.ClassUse_Field", classLink, pkgLink));
-      this.methodSubWriter.printUseInfo(this.pkgToMethodReturn.get(pkg), this.getText("doclet.ClassUse_MethodReturn", classLink, pkgLink));
-      this.methodSubWriter.printUseInfo(this.pkgToMethodArgs.get(pkg), this.getText("doclet.ClassUse_MethodArgs", classLink, pkgLink));
-      this.methodSubWriter.printUseInfo(this.pkgToMethodThrows.get(pkg), this.getText("doclet.ClassUse_MethodThrows", classLink, pkgLink));
-      this.constrSubWriter.printUseInfo(this.pkgToConstructorArgs.get(pkg), this.getText("doclet.ClassUse_ConstructorArgs", classLink, pkgLink));
-      this.constrSubWriter.printUseInfo(this.pkgToConstructorThrows.get(pkg), this.getText("doclet.ClassUse_ConstructorThrows", classLink, pkgLink));
-   }
-
-   protected void generateClassUseFile() throws IOException {
-      this.printClassUseHeader();
-      if (this.pkgSet.size() > 0) {
-         this.generateClassUse();
-      } else {
-         this.printText("doclet.ClassUse_No.usage.of.0", this.classdoc.qualifiedName());
-         this.p();
-      }
-
-      this.printClassUseFooter();
-   }
-
-   protected void generatePackageList() throws IOException {
-      this.tableIndexSummary();
-      this.tableHeaderStart("#CCCCFF");
-      this.printText("doclet.ClassUse_Packages.that.use.0", this.getClassLink(this.classdoc));
-      this.tableHeaderEnd();
-
-      for(PackageDoc pkg : this.pkgSet) {
-         this.generatePackageUse(pkg);
-      }
-
-      this.tableEnd();
-      this.space();
-      this.p();
-   }
-
-   protected void generatePackageUse(PackageDoc pkg) throws IOException {
-      this.trBgcolorStyle("white", "TableRowColor");
-      this.summaryRow(0);
-      this.printHyperLink("", pkg.name(), pkg.name(), true);
-      this.summaryRowEnd();
-      this.summaryRow(0);
-      this.printSummaryComment(pkg);
-      this.space();
-      this.summaryRowEnd();
-      this.trEnd();
-   }
-
-   protected void navLinkClass() {
-      this.navCellStart();
-      this.printClassLink(this.classdoc, "", this.getText("doclet.Class"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkClassUse() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.navClassUse");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkPackage() {
-      this.navCellStart();
-      this.printHyperLink("../package-summary.html", "", this.getText("doclet.Package"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkTree() {
-      this.navCellStart();
-      if (this.classdoc.containingPackage().isIncluded()) {
-         this.printHyperLink("../package-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      } else {
-         this.printHyperLink(super.relativepath + "overview-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      }
-
-      this.navCellEnd();
-   }
-
-   private Map pkgDivide(Map classMap) {
-      Map map = new HashMap();
-      List list = (List)classMap.get(this.classdoc);
-      if (list != null) {
-         for(ProgramElementDoc doc : list) {
-            PackageDoc pkg = doc.containingPackage();
-            this.pkgSet.add(pkg);
-            List inPkg = (List)map.get(pkg);
-            if (inPkg == null) {
-               inPkg = new ArrayList();
-               map.put(pkg, inPkg);
-            }
-
-            inPkg.add(doc);
-         }
-      }
-
-      return map;
-   }
-
-   protected void printClassUseFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printClassUseHeader() {
-      String cltype = this.getText(this.classdoc.isInterface() ? "doclet.Interface" : "doclet.Class");
-      String clname = this.classdoc.qualifiedName();
-      this.printHeader(this.getText("doclet.Window_ClassUse_Header", Standard.configuration().windowtitle, cltype, clname));
-      this.navLinks(true);
-      this.hr();
-      this.center();
-      this.h2();
-      this.boldText("doclet.ClassUse_Title", cltype, clname);
-      this.h2End();
-      this.centerEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ClassWriter.java b/xalan2jdoc/src/main/java/ClassWriter.java
deleted file mode 100644
index 28a1608..0000000
--- a/xalan2jdoc/src/main/java/ClassWriter.java
+++ /dev/null
@@ -1,349 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.List;
-
-public class ClassWriter extends SubWriterHolderWriter {
-   protected ClassDoc classdoc;
-   protected ClassTree classtree;
-   protected ClassDoc prev;
-   protected ClassDoc next;
-   protected boolean nopackage;
-   protected MethodSubWriter methodSubWriter;
-   protected ConstructorSubWriter constrSubWriter;
-   protected FieldSubWriter fieldSubWriter;
-   protected ClassSubWriter innerSubWriter;
-
-   public ClassWriter(String path, String filename, ClassDoc classdoc, ClassDoc prev, ClassDoc next, ClassTree classtree, boolean nopackage) throws IOException, DocletAbortException {
-      super(path, filename, DirectoryManager.getRelativePath(classdoc.containingPackage().name()));
-      this.classdoc = classdoc;
-      HtmlStandardWriter.currentcd = classdoc;
-      this.classtree = classtree;
-      this.prev = prev;
-      this.next = next;
-      this.nopackage = nopackage;
-      this.methodSubWriter = new MethodSubWriter(this);
-      this.constrSubWriter = new ConstructorSubWriter(this);
-      this.fieldSubWriter = new FieldSubWriter(this);
-      this.innerSubWriter = new ClassSubWriter(this);
-   }
-
-   public static void generate(ClassDoc classdoc, ClassDoc prev, ClassDoc next, ClassTree classtree, boolean nopackage) throws DocletAbortException {
-      String path = DirectoryManager.getDirectoryPath(classdoc.containingPackage());
-      String filename = classdoc.name() + ".html";
-
-      try {
-         ClassWriter clsgen = new ClassWriter(path, filename, classdoc, prev, next, classtree, nopackage);
-         clsgen.generateClassFile();
-         clsgen.close();
-      } catch (IOException var9) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var9.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   public void generateClassFile() {
-      String cltype = this.getText(this.classdoc.isInterface() ? "doclet.Interface" : "doclet.Class") + " ";
-      PackageDoc pkg = this.classdoc.containingPackage();
-      String pkgname = pkg != null ? pkg.name() : "";
-      String clname = this.classdoc.name();
-      String label = cltype + ' ' + clname;
-      this.printHeader(this.getText("doclet.Window_ClassFile_label", Standard.configuration().windowtitle, label));
-      this.navLinks(true);
-      this.hr();
-      this.println("<!-- ======== START OF CLASS DATA ======== -->");
-      this.h2();
-      if (pkgname.length() > 0) {
-         this.font("-1");
-         this.print(pkgname);
-         this.fontEnd();
-         this.br();
-      }
-
-      this.print(label);
-      this.h2End();
-      if (!this.classdoc.isInterface()) {
-         this.pre();
-         this.printTreeForClass(this.classdoc);
-         this.preEnd();
-      }
-
-      this.printSubClassInterfaceInfo();
-      if (this.classdoc.isInterface()) {
-         this.printImplementingClasses();
-      }
-
-      this.hr();
-      this.printDeprecated();
-      this.printClassDescription();
-      this.p();
-      if (this.classdoc.inlineTags().length > 0) {
-         this.printInlineComment(this.classdoc);
-         this.p();
-      }
-
-      this.generateTagInfo(this.classdoc);
-      this.hr();
-      this.p();
-      this.printAllMembers();
-      this.println("<!-- ========= END OF CLASS DATA ========= -->");
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navDetailLinks() {
-      this.printText("doclet.Detail");
-      this.print("&nbsp;");
-      this.fieldSubWriter.navDetailLink(this.classdoc);
-      this.navGap();
-      this.constrSubWriter.navDetailLink(this.classdoc);
-      this.navGap();
-      this.methodSubWriter.navDetailLink(this.classdoc);
-   }
-
-   protected void navGap() {
-      this.space();
-      this.print('|');
-      this.space();
-   }
-
-   protected void navLinkClass() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Class");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkClassUse() {
-      this.navCellStart();
-      this.printHyperLink("class-use/" + super.filename, "", this.getText("doclet.navClassUse"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkNext() {
-      if (this.next == null) {
-         this.printText("doclet.Next_Class");
-      } else {
-         this.printClassLink(this.next, this.getText("doclet.Next_Class"), true);
-      }
-   }
-
-   protected void navLinkPackage() {
-      this.navCellStart();
-      this.printHyperLink("package-summary.html", "", this.getText("doclet.Package"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkPrevious() {
-      if (this.prev == null) {
-         this.printText("doclet.Prev_Class");
-      } else {
-         this.printClassLink(this.prev, this.getText("doclet.Prev_Class"), true);
-      }
-   }
-
-   protected void navLinkTree() {
-      this.navCellStart();
-      if (this.nopackage) {
-         this.printHyperLink(super.relativepath + "overview-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      } else {
-         this.printHyperLink("package-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      }
-
-      this.navCellEnd();
-   }
-
-   protected void navSummaryLinks() {
-      this.printText("doclet.Summary");
-      this.print("&nbsp;");
-      this.innerSubWriter.navSummaryLink(this.classdoc);
-      this.navGap();
-      this.fieldSubWriter.navSummaryLink(this.classdoc);
-      this.navGap();
-      this.constrSubWriter.navSummaryLink(this.classdoc);
-      this.navGap();
-      this.methodSubWriter.navSummaryLink(this.classdoc);
-   }
-
-   protected void printAllMembers() {
-      this.println("<!-- ======== INNER CLASS SUMMARY ======== -->");
-      this.println();
-      this.innerSubWriter.printMembersSummary(this.classdoc);
-      this.innerSubWriter.printInheritedMembersSummary(this.classdoc);
-      this.println();
-      this.println("<!-- =========== FIELD SUMMARY =========== -->");
-      this.println();
-      this.fieldSubWriter.printMembersSummary(this.classdoc);
-      this.fieldSubWriter.printInheritedMembersSummary(this.classdoc);
-      this.println();
-      this.println("<!-- ======== CONSTRUCTOR SUMMARY ======== -->");
-      this.println();
-      this.constrSubWriter.printMembersSummary(this.classdoc);
-      this.println();
-      this.println("<!-- ========== METHOD SUMMARY =========== -->");
-      this.println();
-      this.methodSubWriter.printMembersSummary(this.classdoc);
-      this.methodSubWriter.printInheritedMembersSummary(this.classdoc);
-      this.p();
-      this.println();
-      this.println("<!-- ============ FIELD DETAIL =========== -->");
-      this.println();
-      this.fieldSubWriter.printMembers(this.classdoc);
-      this.println();
-      this.println("<!-- ========= CONSTRUCTOR DETAIL ======== -->");
-      this.println();
-      this.constrSubWriter.printMembers(this.classdoc);
-      this.println();
-      this.println("<!-- ============ METHOD DETAIL ========== -->");
-      this.println();
-      this.methodSubWriter.printMembers(this.classdoc);
-   }
-
-   protected void printClassDescription() {
-      boolean isInterface = this.classdoc.isInterface();
-      this.dl();
-      this.dt();
-      this.print(this.classdoc.modifiers() + " ");
-      if (!isInterface) {
-         this.print("class ");
-      }
-
-      this.bold(this.classdoc.name());
-      if (!isInterface) {
-         ClassDoc superclass = this.classdoc.superclass();
-         if (superclass != null) {
-            this.dt();
-            this.print("extends ");
-            this.printClassLink(superclass);
-         }
-      }
-
-      ClassDoc[] implIntfacs = this.classdoc.interfaces();
-      if (implIntfacs != null && implIntfacs.length > 0) {
-         this.dt();
-         this.print(isInterface ? "extends " : "implements ");
-         this.printClassLink(implIntfacs[0]);
-
-         for(int i = 1; i < implIntfacs.length; ++i) {
-            this.print(", ");
-            this.printClassLink(implIntfacs[i]);
-         }
-      }
-
-      this.dlEnd();
-   }
-
-   protected void printDeprecated() {
-      Tag[] deprs = this.classdoc.tags("deprecated");
-      if (deprs.length > 0) {
-         Tag[] commentTags = deprs[0].inlineTags();
-         if (commentTags.length > 0) {
-            this.boldText("doclet.Deprecated");
-            this.space();
-            this.printInlineDeprecatedComment(deprs[0]);
-         }
-
-         this.p();
-      }
-   }
-
-   protected void printImplementingClasses() {
-      if (!this.classdoc.qualifiedName().equals("java.lang.Cloneable") && !this.classdoc.qualifiedName().equals("java.io.Serializable")) {
-         List implcl = this.classtree.implementingclasses(this.classdoc);
-         if (implcl.size() > 0) {
-            this.printSubClassInfoHeader(implcl);
-            this.boldText("doclet.Implementing_Classes");
-            this.printSubClassLinkInfo(implcl);
-         }
-      }
-   }
-
-   protected void printStep(int indent) {
-      String spc = this.spaces(6 * indent - 4);
-      this.print(spc);
-      this.println("|");
-      this.print(spc);
-      this.print("+--");
-   }
-
-   protected void printSubClassInfoHeader(List list) {
-      this.dl();
-      this.dt();
-   }
-
-   protected void printSubClassInterfaceInfo() {
-      if (!this.classdoc.qualifiedName().equals("java.lang.Object") && !this.classdoc.qualifiedName().equals("org.omg.CORBA.Object")) {
-         List subclasses = this.classdoc.isClass() ? this.classtree.subs(this.classdoc) : this.classtree.allSubs(this.classdoc);
-         if (subclasses.size() > 0) {
-            this.printSubClassInfoHeader(subclasses);
-            if (this.classdoc.isClass()) {
-               this.boldText("doclet.Subclasses");
-            } else {
-               this.boldText("doclet.Subinterfaces");
-            }
-
-            this.printSubClassLinkInfo(subclasses);
-         }
-      }
-   }
-
-   protected void printSubClassLinkInfo(List list) {
-      int i = 0;
-      this.print(' ');
-      this.dd();
-
-      while(i < list.size() - 1) {
-         this.printClassLink((ClassDoc)list.get(i));
-         this.print(", ");
-         ++i;
-      }
-
-      this.printClassLink((ClassDoc)list.get(i));
-      this.ddEnd();
-      this.dlEnd();
-   }
-
-   protected void printSummaryDetailLinks() {
-      this.tr();
-      this.tdVAlignClass("top", "NavBarCell3");
-      this.font("-2");
-      this.print("  ");
-      this.navSummaryLinks();
-      this.fontEnd();
-      this.tdEnd();
-      this.tdVAlignClass("top", "NavBarCell3");
-      this.font("-2");
-      this.navDetailLinks();
-      this.fontEnd();
-      this.tdEnd();
-      this.trEnd();
-   }
-
-   protected int printTreeForClass(ClassDoc cd) {
-      ClassDoc sup = cd.superclass();
-      int indent = 0;
-      if (sup != null) {
-         indent = this.printTreeForClass(sup);
-         this.printStep(indent);
-      }
-
-      if (cd.equals(this.classdoc)) {
-         this.bold(cd.qualifiedName());
-      } else {
-         this.printQualifiedClassLink(cd);
-      }
-
-      this.println();
-      return indent + 1;
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ConfigurationStandard.java b/xalan2jdoc/src/main/java/ConfigurationStandard.java
deleted file mode 100644
index 86be1fb..0000000
--- a/xalan2jdoc/src/main/java/ConfigurationStandard.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.Configuration;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.MessageRetriever;
-import java.io.File;
-import java.util.Arrays;
-import java.util.ResourceBundle;
-
-public class ConfigurationStandard extends Configuration {
-   public String header = "";
-   public String footer = "";
-   public String doctitle = "";
-   public String windowtitle = "";
-   public String bottom = "";
-   public String helpfile = "";
-   public String stylesheetfile = "";
-   public boolean nohelp = false;
-   public boolean splitindex = false;
-   public boolean createindex = true;
-   public boolean classuse = false;
-   public boolean createtree = true;
-   public boolean nodeprecatedlist = false;
-   public boolean nonavbar = false;
-   private boolean nooverview = false;
-   public boolean overview = false;
-   public boolean createoverview = false;
-   public static MessageRetriever standardmessage = null;
-   public String topFile = "";
-
-   public ConfigurationStandard() {
-      if (standardmessage == null) {
-         ResourceBundle rb = ResourceBundle.getBundle("xalanjdoc.resources.standard");
-         standardmessage = new MessageRetriever(rb);
-      }
-   }
-
-   protected void setCreateOverview() {
-      if ((this.overview || super.packages.length > 1) && !this.nooverview) {
-         this.createoverview = true;
-      }
-   }
-
-   public void setSpecificDocletOptions(RootDoc root) {
-      String[][] options = root.options();
-
-      for(int oi = 0; oi < options.length; ++oi) {
-         String[] os = options[oi];
-         String opt = os[0].toLowerCase();
-         if (opt.equals("-footer")) {
-            this.footer = os[1];
-         } else if (opt.equals("-header")) {
-            this.header = os[1];
-         } else if (opt.equals("-doctitle")) {
-            this.doctitle = os[1];
-         } else if (opt.equals("-windowtitle")) {
-            this.windowtitle = os[1];
-         } else if (opt.equals("-bottom")) {
-            this.bottom = os[1];
-         } else if (opt.equals("-helpfile")) {
-            this.helpfile = os[1];
-         } else if (opt.equals("-stylesheetfile")) {
-            this.stylesheetfile = os[1];
-         } else if (opt.equals("-nohelp")) {
-            this.nohelp = true;
-         } else if (opt.equals("-splitindex")) {
-            this.splitindex = true;
-         } else if (opt.equals("-noindex")) {
-            this.createindex = false;
-         } else if (opt.equals("-use")) {
-            this.classuse = true;
-         } else if (opt.equals("-notree")) {
-            this.createtree = false;
-         } else if (opt.equals("-nodeprecatedlist")) {
-            this.nodeprecatedlist = true;
-         } else if (opt.equals("-nonavbar")) {
-            this.nonavbar = true;
-         } else if (opt.equals("-nooverview")) {
-            this.nooverview = true;
-         } else if (opt.equals("-overview")) {
-            this.overview = true;
-         }
-      }
-
-      this.setCreateOverview();
-      this.setTopFile(root);
-   }
-
-   protected void setTopFile(RootDoc root) {
-      if (this.createoverview) {
-         this.topFile = "overview-summary.html";
-      } else if (super.packages.length == 0) {
-         if (root.classes().length > 0) {
-            ClassDoc[] classarr = root.classes();
-            Arrays.sort((Object[])classarr);
-            this.topFile = DirectoryManager.getPathToClass(classarr[0]);
-         }
-      } else {
-         this.topFile = DirectoryManager.getPathToPackage(super.packages[0], "package-summary.html");
-      }
-   }
-
-   public int specificDocletOptionLength(String option) {
-      if (option.equals("-nodeprecatedlist")
-         || option.equals("-noindex")
-         || option.equals("-notree")
-         || option.equals("-nohelp")
-         || option.equals("-splitindex")
-         || option.equals("-use")
-         || option.equals("-nonavbar")
-         || option.equals("-nooverview")) {
-         return 1;
-      } else if (option.equals("-help")) {
-         standardmessage.notice("doclet.usage");
-         return 1;
-      } else if (option.equals("-x")) {
-         standardmessage.notice("doclet.xusage");
-         return -1;
-      } else if (option.equals("-footer")
-         || option.equals("-header")
-         || option.equals("-doctitle")
-         || option.equals("-windowtitle")
-         || option.equals("-bottom")
-         || option.equals("-helpfile")
-         || option.equals("-stylesheetfile")
-         || option.equals("-link")
-         || option.equals("-overview")) {
-         return 2;
-      } else {
-         return !option.equals("-group") && !option.equals("-linkoffline") ? 0 : 3;
-      }
-   }
-
-   public boolean specificDocletValidOptions(String[][] options, DocErrorReporter reporter) {
-      boolean helpfile = false;
-      boolean nohelp = false;
-      boolean overview = false;
-      boolean nooverview = false;
-      boolean splitindex = false;
-      boolean noindex = false;
-
-      for(int oi = 0; oi < options.length; ++oi) {
-         String[] os = options[oi];
-         String opt = os[0].toLowerCase();
-         if (opt.equals("-helpfile")) {
-            if (nohelp) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-helpfile", "-nohelp"));
-               return false;
-            }
-
-            if (helpfile) {
-               reporter.printError(standardmessage.getText("doclet.Option_reuse", "-helpfile"));
-               return false;
-            }
-
-            File help = new File(os[1]);
-            if (!help.exists()) {
-               reporter.printError(standardmessage.getText("doclet.File_not_found", os[1]));
-               return false;
-            }
-
-            helpfile = true;
-         } else if (opt.equals("-nohelp")) {
-            if (helpfile) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-nohelp", "-helpfile"));
-               return false;
-            }
-
-            nohelp = true;
-         } else if (opt.equals("-overview")) {
-            if (nooverview) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-overview", "-nooverview"));
-               return false;
-            }
-
-            if (overview) {
-               reporter.printError(standardmessage.getText("doclet.Option_reuse", "-overview"));
-               return false;
-            }
-
-            overview = true;
-         } else if (opt.equals("-nooverview")) {
-            if (overview) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-nooverview", "-overview"));
-               return false;
-            }
-
-            nooverview = true;
-         } else if (opt.equals("-splitindex")) {
-            if (noindex) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-splitindex", "-noindex"));
-               return false;
-            }
-
-            splitindex = true;
-         } else if (opt.equals("-noindex")) {
-            if (splitindex) {
-               reporter.printError(standardmessage.getText("doclet.Option_conflict", "-noindex", "-splitindex"));
-               return false;
-            }
-
-            noindex = true;
-         } else if (opt.equals("-group")) {
-            if (!Group.checkPackageGroups(os[1], os[2], reporter)) {
-               return false;
-            }
-         } else if (opt.equals("-link")) {
-            String url = os[1];
-            if (!Extern.url(url, url, reporter)) {
-               return false;
-            }
-         } else if (opt.equals("-linkoffline")) {
-            String url = os[1];
-            String pkglisturl = os[2];
-            if (!Extern.url(url, pkglisturl, reporter)) {
-               return false;
-            }
-         }
-      }
-
-      return true;
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ConstructorSubWriter.java b/xalan2jdoc/src/main/java/ConstructorSubWriter.java
deleted file mode 100644
index f0bfc66..0000000
--- a/xalan2jdoc/src/main/java/ConstructorSubWriter.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ConstructorDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.Tag;
-import com.sun.javadoc.ThrowsTag;
-
-public class ConstructorSubWriter extends ExecutableMemberSubWriter {
-   protected boolean foundNonPublicMember = false;
-
-   ConstructorSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   protected void checkForNonPublicMembers(ProgramElementDoc[] members) {
-      for(int i = 0; i < members.length; ++i) {
-         if (!this.foundNonPublicMember && !members[i].isPublic()) {
-            this.foundNonPublicMember = true;
-            break;
-         }
-      }
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      ProgramElementDoc[] members = this.eligibleMembers(cd.constructors());
-      this.checkForNonPublicMembers(members);
-      return members;
-   }
-
-   protected void navSummaryLink(ClassDoc cd) {
-      this.printNavSummaryLink(cd, this.members(cd).length > 0);
-   }
-
-   protected void printHeader(ClassDoc cd) {
-      super.writer.anchor("constructor_detail");
-      super.writer.printTableHeadingBackground(super.writer.getText("doclet.Constructor_Detail"));
-   }
-
-   public void printInheritedSummaryAnchor(ClassDoc cd) {
-   }
-
-   public void printInheritedSummaryLabel(ClassDoc cd) {
-   }
-
-   protected void printNavDetailLink(boolean link) {
-      if (link) {
-         super.writer.printHyperLink("", "constructor_detail", super.writer.getText("doclet.navConstructor"));
-      } else {
-         super.writer.printText("doclet.navConstructor");
-      }
-   }
-
-   protected void printNavSummaryLink(ClassDoc cd, boolean link) {
-      if (link) {
-         super.writer.printHyperLink("", "constructor_summary", super.writer.getText("doclet.navConstructor"));
-      } else {
-         super.writer.printText("doclet.navConstructor");
-      }
-   }
-
-   public void printSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("constructor_summary");
-   }
-
-   public void printSummaryLabel(ClassDoc cd) {
-      super.writer.boldText("doclet.Constructor_Summary");
-   }
-
-   protected void printSummaryType(ProgramElementDoc member) {
-      if (this.foundNonPublicMember) {
-         super.writer.printTypeSummaryHeader();
-         if (member.isProtected()) {
-            this.print("protected ");
-         } else if (member.isPrivate()) {
-            this.print("private ");
-         } else if (member.isPublic()) {
-            super.writer.space();
-         } else {
-            super.writer.printText("doclet.Package_private");
-         }
-
-         super.writer.printTypeSummaryFooter();
-      }
-   }
-
-   protected void printTags(ProgramElementDoc member) {
-      ParamTag[] params = ((ConstructorDoc)member).paramTags();
-      ThrowsTag[] thrown = ((ConstructorDoc)member).throwsTags();
-      Tag[] sinces = member.tags("since");
-      SeeTag[] sees = member.seeTags();
-      Tag[] usages = member.tags("xsl.usage");
-      if (usages.length + params.length + thrown.length + sees.length + sinces.length > 0) {
-         super.writer.dd();
-         super.writer.dl();
-         this.printParamTags(params);
-         this.printThrowsTags(thrown);
-         super.writer.printSinceTag(member);
-         super.writer.printSeeTags(member);
-         super.writer.printUsageTags(member);
-         super.writer.dlEnd();
-         super.writer.ddEnd();
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/DeprecatedAPIListBuilder.java b/xalan2jdoc/src/main/java/DeprecatedAPIListBuilder.java
deleted file mode 100644
index 313a7d0..0000000
--- a/xalan2jdoc/src/main/java/DeprecatedAPIListBuilder.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.RootDoc;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class DeprecatedAPIListBuilder {
-   private List deprecatedclasses = new ArrayList();
-   private List deprecatedinterfaces = new ArrayList();
-   private List deprecatedexceptions = new ArrayList();
-   private List deprecatederrors = new ArrayList();
-   private List deprecatedfields = new ArrayList();
-   private List deprecatedmethods = new ArrayList();
-   private List deprecatedconstructors = new ArrayList();
-
-   public DeprecatedAPIListBuilder(RootDoc root) {
-      this.buildDeprecatedAPIInfo(root);
-   }
-
-   private void buildDeprecatedAPIInfo(RootDoc root) {
-      ClassDoc[] classes = root.classes();
-
-      for(int i = 0; i < classes.length; ++i) {
-         ClassDoc cd = classes[i];
-         if (cd.tags("deprecated").length > 0) {
-            if (cd.isOrdinaryClass()) {
-               this.deprecatedclasses.add(cd);
-            } else if (cd.isInterface()) {
-               this.deprecatedinterfaces.add(cd);
-            } else if (cd.isException()) {
-               this.deprecatedexceptions.add(cd);
-            } else {
-               this.deprecatederrors.add(cd);
-            }
-         }
-
-         this.composeDeprecatedList(this.deprecatedfields, cd.fields());
-         this.composeDeprecatedList(this.deprecatedmethods, cd.methods());
-         this.composeDeprecatedList(this.deprecatedconstructors, cd.constructors());
-      }
-
-      this.sortDeprecatedLists();
-   }
-
-   private void composeDeprecatedList(List list, MemberDoc[] members) {
-      for(int i = 0; i < members.length; ++i) {
-         if (members[i].tags("deprecated").length > 0) {
-            list.add(members[i]);
-         }
-      }
-   }
-
-   public List getDeprecatedClasses() {
-      return this.deprecatedclasses;
-   }
-
-   public List getDeprecatedConstructors() {
-      return this.deprecatedconstructors;
-   }
-
-   public List getDeprecatedErrors() {
-      return this.deprecatederrors;
-   }
-
-   public List getDeprecatedExceptions() {
-      return this.deprecatedexceptions;
-   }
-
-   public List getDeprecatedFields() {
-      return this.deprecatedfields;
-   }
-
-   public List getDeprecatedInterfaces() {
-      return this.deprecatedinterfaces;
-   }
-
-   public List getDeprecatedMethods() {
-      return this.deprecatedmethods;
-   }
-
-   private void sortDeprecatedLists() {
-      Collections.sort(this.deprecatedclasses);
-      Collections.sort(this.deprecatedinterfaces);
-      Collections.sort(this.deprecatedexceptions);
-      Collections.sort(this.deprecatederrors);
-      Collections.sort(this.deprecatedfields);
-      Collections.sort(this.deprecatedmethods);
-      Collections.sort(this.deprecatedconstructors);
-   }
-}
diff --git a/xalan2jdoc/src/main/java/DeprecatedListWriter.java b/xalan2jdoc/src/main/java/DeprecatedListWriter.java
deleted file mode 100644
index 144d7ea..0000000
--- a/xalan2jdoc/src/main/java/DeprecatedListWriter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class DeprecatedListWriter extends SubWriterHolderWriter {
-   public DeprecatedListWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate(RootDoc root) throws DocletAbortException {
-      String filename = "deprecated-list.html";
-
-      try {
-         DeprecatedListWriter depr = new DeprecatedListWriter(filename);
-         depr.generateDeprecatedListFile(new DeprecatedAPIListBuilder(root));
-         depr.close();
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateDeprecatedListFile(DeprecatedAPIListBuilder deprapi) throws IOException {
-      ClassSubWriter classW = new ClassSubWriter(this);
-      FieldSubWriter fieldW = new FieldSubWriter(this);
-      MethodSubWriter methodW = new MethodSubWriter(this);
-      ConstructorSubWriter consW = new ConstructorSubWriter(this);
-      this.printDeprecatedHeader();
-      classW.printDeprecatedAPI(deprapi.getDeprecatedClasses(), "doclet.Deprecated_Classes");
-      classW.printDeprecatedAPI(deprapi.getDeprecatedInterfaces(), "doclet.Deprecated_Interfaces");
-      classW.printDeprecatedAPI(deprapi.getDeprecatedExceptions(), "doclet.Deprecated_Exceptions");
-      classW.printDeprecatedAPI(deprapi.getDeprecatedErrors(), "doclet.Deprecated_Errors");
-      fieldW.printDeprecatedAPI(deprapi.getDeprecatedFields(), "doclet.Deprecated_Fields");
-      methodW.printDeprecatedAPI(deprapi.getDeprecatedMethods(), "doclet.Deprecated_Methods");
-      consW.printDeprecatedAPI(deprapi.getDeprecatedConstructors(), "doclet.Deprecated_Constructors");
-      this.printDeprecatedFooter();
-   }
-
-   protected void navLinkDeprecated() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.navDeprecated");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void printDeprecatedFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printDeprecatedHeader() {
-      this.printHeader(this.getText("doclet.Window_Deprecated_List", Standard.configuration().windowtitle));
-      this.navLinks(true);
-      this.hr();
-      this.center();
-      this.h2();
-      this.boldText("doclet.Deprecated_API");
-      this.h2End();
-      this.centerEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/ExecutableMemberSubWriter.java b/xalan2jdoc/src/main/java/ExecutableMemberSubWriter.java
deleted file mode 100644
index d3717df..0000000
--- a/xalan2jdoc/src/main/java/ExecutableMemberSubWriter.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.ThrowsTag;
-import com.sun.javadoc.Type;
-
-public abstract class ExecutableMemberSubWriter extends AbstractSubWriter {
-   ExecutableMemberSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   protected MethodDoc findMethod(ClassDoc cd, MethodDoc method) {
-      MethodDoc[] methods = cd.methods();
-
-      for(int i = 0; i < methods.length; ++i) {
-         if (method.name().equals(methods[i].name()) && method.signature().equals(methods[i].signature())) {
-            return methods[i];
-         }
-      }
-
-      return null;
-   }
-
-   protected int getReturnTypeLength(ExecutableMemberDoc member) {
-      if (member instanceof MethodDoc) {
-         MethodDoc method = (MethodDoc)member;
-         Type rettype = method.returnType();
-         ClassDoc cd = rettype.asClassDoc();
-         return cd == null
-            ? rettype.typeName().length() + rettype.dimension().length()
-            : rettype.dimension().length() + (super.writer.isCrossClassIncluded(cd) ? cd.name().length() : cd.qualifiedName().length());
-      } else {
-         return -1;
-      }
-   }
-
-   protected MethodDoc implementedMethod(MethodDoc method, ClassDoc[] intfacs) {
-      for(int i = 0; i < intfacs.length; ++i) {
-         MethodDoc found = this.findMethod(intfacs[i], method);
-         if (found != null) {
-            return found;
-         }
-      }
-
-      return null;
-   }
-
-   protected ClassDoc implementsMethodInIntfac(MethodDoc method, ClassDoc[] intfacs) {
-      for(int i = 0; i < intfacs.length; ++i) {
-         MethodDoc[] methods = intfacs[i].methods();
-         if (methods.length > 0) {
-            for(int j = 0; j < methods.length; ++j) {
-               if (methods[j].name().equals(method.name()) && methods[j].signature().equals(method.signature())) {
-                  return intfacs[i];
-               }
-            }
-         }
-      }
-
-      return null;
-   }
-
-   protected String name(ProgramElementDoc member) {
-      return member.name() + "()";
-   }
-
-   protected void printBodyHtmlEnd(ClassDoc cd) {
-   }
-
-   protected void printDeprecatedLink(ProgramElementDoc member) {
-      ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
-      super.writer.printClassLink(emd.containingClass(), emd.name() + emd.signature(), emd.qualifiedName() + emd.flatSignature());
-   }
-
-   protected void printExceptions(ExecutableMemberDoc member) {
-      ClassDoc[] except = member.thrownExceptions();
-      if (except.length > 0) {
-         int retlen = this.getReturnTypeLength(member);
-         String indent = this.makeSpace(this.modifierString(member).length() + member.name().length() + retlen - 4);
-         super.writer.print('\n');
-         super.writer.print(indent);
-         super.writer.print("throws ");
-         indent = indent + "       ";
-         super.writer.printClassLink(except[0]);
-
-         for(int i = 1; i < except.length; ++i) {
-            super.writer.print(",\n");
-            super.writer.print(indent);
-            super.writer.printClassLink(except[i]);
-         }
-      }
-   }
-
-   protected void printImplementsInfo(MethodDoc method) {
-      ClassDoc[] implIntfacs = method.containingClass().interfaces();
-      if (implIntfacs.length > 0) {
-         MethodDoc implementedMeth = this.implementedMethod(method, implIntfacs);
-         if (implementedMeth != null) {
-            ClassDoc intfac = implementedMeth.containingClass();
-            String methlink = "";
-            String intfaclink = super.writer.getClassLink(intfac);
-            super.writer.dt();
-            super.writer.boldText("doclet.Specified_By");
-            super.writer.dd();
-            methlink = super.writer.getDocLink(implementedMeth, implementedMeth.name());
-            super.writer.printText("doclet.in_interface", methlink, intfaclink);
-         }
-      }
-   }
-
-   protected void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
-      String name = emd.name();
-      super.writer.printClassLink(cd, name + emd.signature(), name, false);
-   }
-
-   protected void printMember(ProgramElementDoc member) {
-      ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
-      String name = emd.name();
-      super.writer.anchor(name + emd.signature());
-      this.printHead(emd);
-      this.printSignature(emd);
-      this.printFullComment(emd);
-   }
-
-   protected void printParam(Parameter param) {
-      this.printTypedName(param.type(), param.name());
-   }
-
-   protected void printParamTags(ParamTag[] params) {
-      if (params.length > 0) {
-         super.writer.dt();
-         super.writer.boldText("doclet.Parameters");
-
-         for(int i = 0; i < params.length; ++i) {
-            ParamTag pt = params[i];
-            super.writer.dd();
-            super.writer.code();
-            this.print(pt.parameterName());
-            super.writer.codeEnd();
-            this.print(" - ");
-            super.writer.printInlineComment(pt);
-         }
-      }
-   }
-
-   protected void printParameters(ExecutableMemberDoc member) {
-      int paramstart = 0;
-      this.print('(');
-      Parameter[] params = member.parameters();
-      String indent = this.makeSpace(super.writer.displayLength);
-
-      while(paramstart < params.length) {
-         Parameter param = params[paramstart++];
-         if (!param.name().startsWith("this$")) {
-            this.printParam(param);
-            break;
-         }
-      }
-
-      for(int i = paramstart; i < params.length; ++i) {
-         super.writer.print(',');
-         super.writer.print('\n');
-         super.writer.print(indent);
-         this.printParam(params[i]);
-      }
-
-      super.writer.print(')');
-   }
-
-   protected void printSignature(ExecutableMemberDoc member) {
-      super.writer.displayLength = 0;
-      super.writer.pre();
-      this.printModifiers(member);
-      this.bold(member.name());
-      this.printParameters(member);
-      this.printExceptions(member);
-      super.writer.preEnd();
-   }
-
-   protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
-      ClassDoc mcd = member.containingClass();
-      String name = emd.name();
-      super.writer.bold();
-      if (mcd != cd) {
-         super.writer.print(mcd.name() + ".");
-      }
-
-      super.writer.printClassLink(mcd, name + emd.signature(), name, false);
-      super.writer.boldEnd();
-      super.writer.displayLength = name.length();
-      this.printParameters(emd);
-   }
-
-   protected void printThrowsTags(ThrowsTag[] thrown) {
-      if (thrown.length > 0) {
-         super.writer.dt();
-         super.writer.boldText("doclet.Throws");
-
-         for(int i = 0; i < thrown.length; ++i) {
-            ThrowsTag tt = thrown[i];
-            super.writer.dd();
-            ClassDoc cd = tt.exception();
-            if (cd == null) {
-               super.writer.print(tt.exceptionName());
-            } else {
-               super.writer.printClassLink(cd);
-            }
-
-            this.print(" - ");
-            super.writer.printInlineComment(tt);
-         }
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/Extern.java b/xalan2jdoc/src/main/java/Extern.java
deleted file mode 100644
index d854923..0000000
--- a/xalan2jdoc/src/main/java/Extern.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.DocErrorReporter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Extern {
-   private static Map packageMap;
-   final String packageName;
-   final String path;
-   final boolean relative;
-
-   Extern(String packageName, String path, boolean relative) {
-      this.packageName = packageName;
-      this.path = path;
-      this.relative = relative;
-      if (packageMap == null) {
-         packageMap = new HashMap();
-      }
-
-      packageMap.put(packageName, this);
-   }
-
-   static String adjustEndFileSeparator(String url) {
-      String filesep = isRelativePath(url) ? File.separator : "/";
-      if (!url.endsWith(filesep)) {
-         url = url + filesep;
-      }
-
-      return url;
-   }
-
-   static String composeExternPackageList(String url, String pkglisturl) {
-      url = adjustEndFileSeparator(url);
-      pkglisturl = adjustEndFileSeparator(pkglisturl);
-      return !pkglisturl.startsWith("http://") && !pkglisturl.startsWith("file:")
-         ? readFileComposeExternPackageList(url, pkglisturl)
-         : fetchURLComposeExternPackageList(url, pkglisturl);
-   }
-
-   static String fetchURLComposeExternPackageList(String urlpath, String pkglisturlpath) {
-      String link = pkglisturlpath + "package-list";
-
-      try {
-         boolean relative = isRelativePath(urlpath);
-         readPackageList(new URL(link).openStream(), urlpath, relative);
-         return null;
-      } catch (MalformedURLException var4) {
-         return getText("doclet.MalformedURL", link);
-      } catch (IOException var5) {
-         return getText("doclet.URL_error", link);
-      }
-   }
-
-   public static Extern findPackage(String pkgName) {
-      return packageMap == null ? null : (Extern)packageMap.get(pkgName);
-   }
-
-   private static String getText(String msg) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(msg);
-   }
-
-   private static String getText(String prop, String link) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(prop, link);
-   }
-
-   static boolean isRelativePath(String url) {
-      return (url.startsWith("http://") || url.startsWith("file:")) ^ true;
-   }
-
-   static String readFileComposeExternPackageList(String urlpath, String relpath) {
-      String link = relpath + "package-list";
-
-      try {
-         File file = new File(link);
-         if (file.exists() && file.canRead()) {
-            boolean relative = isRelativePath(urlpath);
-            readPackageList(new FileInputStream(file), urlpath, relative);
-            return null;
-         } else {
-            return getText("doclet.File_error", link);
-         }
-      } catch (FileNotFoundException var5) {
-         return getText("doclet.File_error", link);
-      } catch (IOException var6) {
-         return getText("doclet.File_error", link);
-      }
-   }
-
-   static void readPackageList(InputStream input, String path, boolean relative) throws IOException {
-      InputStreamReader in = new InputStreamReader(input);
-      StringBuffer strbuf = new StringBuffer();
-
-      int c;
-      try {
-         while((c = in.read()) >= 0) {
-            char ch = (char)c;
-            if (ch != '\n' && ch != '\r') {
-               strbuf.append(ch);
-            } else if (strbuf.length() > 0) {
-               String packname = strbuf.toString();
-               String packpath = path + packname.replace('.', '/') + '/';
-               new Extern(packname, packpath, relative);
-               strbuf.setLength(0);
-            }
-         }
-      } finally {
-         input.close();
-      }
-   }
-
-   public String toString() {
-      return this.packageName + (this.relative ? " -> " : " => ") + this.path;
-   }
-
-   public static boolean url(String url, String pkglisturl, DocErrorReporter reporter) {
-      if (packageMap != null) {
-         reporter.printError(getText("doclet.link_option_twice"));
-         return false;
-      } else {
-         String errMsg = composeExternPackageList(url, pkglisturl);
-         if (errMsg != null) {
-            reporter.printError(errMsg);
-            return false;
-         } else {
-            return true;
-         }
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/FieldSubWriter.java b/xalan2jdoc/src/main/java/FieldSubWriter.java
deleted file mode 100644
index 09dc038..0000000
--- a/xalan2jdoc/src/main/java/FieldSubWriter.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.ProgramElementDoc;
-
-public class FieldSubWriter extends AbstractSubWriter {
-   FieldSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      return this.eligibleMembers(cd.fields());
-   }
-
-   protected void printBodyHtmlEnd(ClassDoc cd) {
-   }
-
-   protected void printDeprecatedLink(ProgramElementDoc member) {
-      super.writer.printClassLink(member.containingClass(), member.name(), ((FieldDoc)member).qualifiedName());
-   }
-
-   protected void printHeader(ClassDoc cd) {
-      super.writer.anchor("field_detail");
-      super.writer.printTableHeadingBackground(super.writer.getText("doclet.Field_Detail"));
-   }
-
-   public void printInheritedSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("fields_inherited_from_class_" + cd.qualifiedName());
-   }
-
-   public void printInheritedSummaryLabel(ClassDoc cd) {
-      String classlink = super.writer.getPreQualifiedClassLink(cd);
-      super.writer.bold();
-      super.writer.printText("doclet.Fields_Inherited_From_Class", classlink);
-      super.writer.boldEnd();
-   }
-
-   protected void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      String name = member.name();
-      super.writer.printClassLink(cd, name, name, false);
-   }
-
-   protected void printMember(ProgramElementDoc member) {
-      FieldDoc field = (FieldDoc)member;
-      super.writer.anchor(field.name());
-      this.printHead(field);
-      this.printSignature(field);
-      this.printFullComment(field);
-   }
-
-   protected void printNavDetailLink(boolean link) {
-      if (link) {
-         super.writer.printHyperLink("", "field_detail", super.writer.getText("doclet.navField"));
-      } else {
-         super.writer.printText("doclet.navField");
-      }
-   }
-
-   protected void printNavSummaryLink(ClassDoc cd, boolean link) {
-      if (link) {
-         super.writer
-            .printHyperLink("", cd == null ? "field_summary" : "fields_inherited_from_class_" + cd.qualifiedName(), super.writer.getText("doclet.navField"));
-      } else {
-         super.writer.printText("doclet.navField");
-      }
-   }
-
-   void printSignature(MemberDoc member) {
-      FieldDoc field = (FieldDoc)member;
-      super.writer.pre();
-      this.printModifiers(field);
-      this.printTypeLink(field.type());
-      this.print(' ');
-      this.bold(field.name());
-      super.writer.preEnd();
-   }
-
-   public void printSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("field_summary");
-   }
-
-   public void printSummaryLabel(ClassDoc cd) {
-      super.writer.boldText("doclet.Field_Summary");
-   }
-
-   protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-      String name = member.name();
-      ClassDoc mcd = member.containingClass();
-      super.writer.bold();
-      if (mcd != cd) {
-         super.writer.print(mcd.name() + ".");
-      }
-
-      super.writer.printClassLink(mcd, name, name, false);
-      super.writer.boldEnd();
-   }
-
-   protected void printSummaryType(ProgramElementDoc member) {
-      FieldDoc field = (FieldDoc)member;
-      this.printModifierAndType(field, field.type());
-   }
-}
diff --git a/xalan2jdoc/src/main/java/FrameOutputWriter.java b/xalan2jdoc/src/main/java/FrameOutputWriter.java
deleted file mode 100644
index 84ff079..0000000
--- a/xalan2jdoc/src/main/java/FrameOutputWriter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class FrameOutputWriter extends HtmlStandardWriter {
-   int noOfPackages = Standard.configuration().packages.length;
-
-   public FrameOutputWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate() throws DocletAbortException {
-      String filename = "";
-
-      try {
-         filename = "index.html";
-         FrameOutputWriter framegen = new FrameOutputWriter(filename);
-         framegen.generateFrameFile();
-         framegen.close();
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateFrameFile() {
-      if (Standard.configuration().windowtitle.length() > 0) {
-         this.printPartialHeader(Standard.configuration().windowtitle);
-      } else {
-         this.printPartialHeader(this.getText("doclet.Generated_Docs_Untitled"));
-      }
-
-      this.printFrameDetails();
-      this.printFrameWarning();
-      this.printFrameFooter();
-   }
-
-   protected void printFrameDetails() {
-      this.frameSet("cols=\"20%,80%\"");
-      if (this.noOfPackages <= 1) {
-         this.frame("src=\"allclasses-frame.html\" name=\"packageFrame\"");
-         this.frame("src=\"" + Standard.configuration().topFile + "\" name=\"classFrame\"");
-      } else if (this.noOfPackages > 1) {
-         this.frameSet("rows=\"30%,70%\"");
-         this.frame("src=\"overview-frame.html\" name=\"packageListFrame\"");
-         this.frame("src=\"allclasses-frame.html\" name=\"packageFrame\"");
-         this.frameSetEnd();
-         this.frame("src=\"" + Standard.configuration().topFile + "\" name=\"classFrame\"");
-      }
-
-      this.frameSetEnd();
-   }
-
-   protected void printFrameWarning() {
-      this.noFrames();
-      this.h2();
-      this.printText("doclet.Frame_Alert");
-      this.h2End();
-      this.p();
-      this.printText("doclet.Frame_Warning_Message");
-      this.br();
-      this.printText("doclet.Link_To");
-      this.printHyperLink(Standard.configuration().topFile, this.getText("doclet.Non_Frame_Version"));
-      this.noFramesEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/Group.java b/xalan2jdoc/src/main/java/Group.java
deleted file mode 100644
index 124dae3..0000000
--- a/xalan2jdoc/src/main/java/Group.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.PackageDoc;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-public class Group {
-   private static Map regExpGroupMap = new HashMap();
-   private static List sortedRegExpList = new ArrayList();
-   private static List groupList = new ArrayList();
-   private static Map pkgNameGroupMap = new HashMap();
-
-   static List asList(Object[] arr) {
-      List list = new ArrayList();
-
-      for(int i = 0; i < arr.length; ++i) {
-         list.add(arr[i]);
-      }
-
-      return list;
-   }
-
-   public static boolean checkPackageGroups(String groupname, String pkgNameFormList, DocErrorReporter reporter) {
-      StringTokenizer strtok = new StringTokenizer(pkgNameFormList, ":");
-      if (groupList.contains(groupname)) {
-         reporter.printError(getText("doclet.Groupname_already_used", groupname));
-         return false;
-      } else {
-         groupList.add(groupname);
-
-         while(strtok.hasMoreTokens()) {
-            String id = strtok.nextToken();
-            if (id.length() == 0) {
-               reporter.printError(getText("doclet.Error_in_packagelist", groupname, pkgNameFormList));
-               return false;
-            }
-
-            if (id.endsWith("*")) {
-               id = id.substring(0, id.length() - 1);
-               if (foundGroupFormat(regExpGroupMap, id, reporter)) {
-                  return false;
-               }
-
-               regExpGroupMap.put(id, groupname);
-               sortedRegExpList.add(id);
-            } else {
-               if (foundGroupFormat(pkgNameGroupMap, id, reporter)) {
-                  return false;
-               }
-
-               pkgNameGroupMap.put(id, groupname);
-            }
-         }
-
-         Collections.sort(sortedRegExpList, new Group.MapKeyComparator());
-         return true;
-      }
-   }
-
-   static boolean foundGroupFormat(Map map, String pkgFormat, DocErrorReporter reporter) {
-      if (map.containsKey(pkgFormat)) {
-         reporter.printError(getText("doclet.Same_package_name_used", pkgFormat));
-         return true;
-      } else {
-         return false;
-      }
-   }
-
-   public static List getGroupList() {
-      return groupList;
-   }
-
-   static List getPkgList(Map map, String groupname) {
-      List list = (List)map.get(groupname);
-      if (list == null) {
-         list = new ArrayList();
-         map.put(groupname, list);
-      }
-
-      return list;
-   }
-
-   private static String getText(String text) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(text);
-   }
-
-   private static String getText(String text, String arg) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(text, arg);
-   }
-
-   private static String getText(String text, String arg1, String arg2) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(text, arg1, arg2);
-   }
-
-   public static Map groupPackages(PackageDoc[] packages) {
-      Map groupPackageMap = new HashMap();
-      String defaultGroupName = pkgNameGroupMap.isEmpty() && regExpGroupMap.isEmpty() ? getText("doclet.Packages") : getText("doclet.Other_Packages");
-      if (!groupList.contains(defaultGroupName)) {
-         groupList.add(defaultGroupName);
-      }
-
-      for(int i = 0; i < packages.length; ++i) {
-         PackageDoc pkg = packages[i];
-         String pkgName = pkg.name();
-         String groupName = (String)pkgNameGroupMap.get(pkgName);
-         if (groupName == null) {
-            groupName = regExpGroupName(pkgName);
-         }
-
-         if (groupName == null) {
-            groupName = defaultGroupName;
-         }
-
-         getPkgList(groupPackageMap, groupName).add(pkg);
-      }
-
-      return groupPackageMap;
-   }
-
-   static String regExpGroupName(String pkgName) {
-      for(int j = 0; j < sortedRegExpList.size(); ++j) {
-         String regexp = (String)sortedRegExpList.get(j);
-         if (pkgName.startsWith(regexp)) {
-            return (String)regExpGroupMap.get(regexp);
-         }
-      }
-
-      return null;
-   }
-
-   private static class MapKeyComparator implements Comparator {
-      MapKeyComparator() {
-      }
-
-      public int compare(Object key1, Object key2) {
-         return ((String)key2).length() - ((String)key1).length();
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/HelpWriter.java b/xalan2jdoc/src/main/java/HelpWriter.java
deleted file mode 100644
index b440751..0000000
--- a/xalan2jdoc/src/main/java/HelpWriter.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class HelpWriter extends HtmlStandardWriter {
-   public HelpWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate() throws DocletAbortException {
-      String filename = "";
-
-      try {
-         if (Standard.configuration().helpfile.length() == 0 && !Standard.configuration().nohelp) {
-            filename = "help-doc.html";
-            HelpWriter helpgen = new HelpWriter(filename);
-            helpgen.generateHelpFile();
-            helpgen.close();
-         }
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateHelpFile() {
-      this.printHeader(this.getText("doclet.Window_Help_title", Standard.configuration().windowtitle));
-      this.navLinks(true);
-      this.hr();
-      this.printHelpFileContents();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navLinkHelp() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.Help");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void printHelpFileContents() {
-      this.center();
-      this.h1();
-      this.printText("doclet.Help_line_1");
-      this.h1End();
-      this.centerEnd();
-      this.printText("doclet.Help_line_2");
-      if (Standard.configuration().createoverview) {
-         this.h3();
-         this.printText("doclet.Overview");
-         this.h3End();
-         this.blockquote();
-         this.p();
-         this.printText("doclet.Help_line_3", this.getHyperLink("overview-summary.html", this.getText("doclet.Overview")));
-         this.blockquoteEnd();
-      }
-
-      this.h3();
-      this.printText("doclet.Package");
-      this.h3End();
-      this.blockquote();
-      this.p();
-      this.printText("doclet.Help_line_4");
-      this.ul();
-      this.li();
-      this.printText("doclet.Interfaces_Italic");
-      this.li();
-      this.printText("doclet.Classes");
-      this.li();
-      this.printText("doclet.Exceptions");
-      this.li();
-      this.printText("doclet.Errors");
-      this.ulEnd();
-      this.blockquoteEnd();
-      this.h3();
-      this.printText("doclet.Help_line_5");
-      this.h3End();
-      this.blockquote();
-      this.p();
-      this.printText("doclet.Help_line_6");
-      this.ul();
-      this.li();
-      this.printText("doclet.Help_line_7");
-      this.li();
-      this.printText("doclet.Help_line_8");
-      this.li();
-      this.printText("doclet.Help_line_9");
-      this.li();
-      this.printText("doclet.Help_line_10");
-      this.li();
-      this.printText("doclet.Help_line_11");
-      this.li();
-      this.printText("doclet.Help_line_12");
-      this.p();
-      this.li();
-      this.printText("doclet.Inner_Class_Summary");
-      this.li();
-      this.printText("doclet.Field_Summary");
-      this.li();
-      this.printText("doclet.Constructor_Summary");
-      this.li();
-      this.printText("doclet.Method_Summary");
-      this.p();
-      this.li();
-      this.printText("doclet.Field_Detail");
-      this.li();
-      this.printText("doclet.Constructor_Detail");
-      this.li();
-      this.printText("doclet.Method_Detail");
-      this.ulEnd();
-      this.printText("doclet.Help_line_13");
-      this.blockquoteEnd();
-      if (Standard.configuration().classuse) {
-         this.h3();
-         this.printText("doclet.Help_line_14");
-         this.h3End();
-         this.blockquote();
-         this.printText("doclet.Help_line_15");
-         this.blockquoteEnd();
-      }
-
-      if (Standard.configuration().createtree) {
-         this.h3();
-         this.printText("doclet.Help_line_16");
-         this.h3End();
-         this.blockquote();
-         this.printText("doclet.Help_line_17_with_tree_link", this.getHyperLink("overview-tree.html", this.getText("doclet.Class_Hierarchy")));
-         this.ul();
-         this.li();
-         this.printText("doclet.Help_line_18");
-         this.li();
-         this.printText("doclet.Help_line_19");
-         this.ulEnd();
-         this.blockquoteEnd();
-      }
-
-      if (!Standard.configuration().nodeprecatedlist && !Standard.configuration().nodeprecated) {
-         this.h3();
-         this.printText("doclet.Deprecated_API");
-         this.h3End();
-         this.blockquote();
-         this.printText("doclet.Help_line_20_with_deprecated_api_link", this.getHyperLink("deprecated-list.html", this.getText("doclet.Deprecated_API")));
-         this.blockquoteEnd();
-      }
-
-      if (Standard.configuration().createindex) {
-         String indexlink;
-         if (Standard.configuration().splitindex) {
-            indexlink = this.getHyperLink("index-files/index-1.html", this.getText("doclet.Index"));
-         } else {
-            indexlink = this.getHyperLink("index-all.html", this.getText("doclet.Index"));
-         }
-
-         this.h3();
-         this.printText("doclet.Help_line_21");
-         this.h3End();
-         this.blockquote();
-         this.printText("doclet.Help_line_22", indexlink);
-         this.blockquoteEnd();
-      }
-
-      this.h3();
-      this.printText("doclet.Help_line_23");
-      this.h3End();
-      this.printText("doclet.Help_line_24");
-      this.h3();
-      this.printText("doclet.Help_line_25");
-      this.h3End();
-      this.printText("doclet.Help_line_26");
-      this.p();
-      this.h3();
-      this.printText("doclet.Serialized_Form");
-      this.h3End();
-      this.printText("doclet.Help_line_27");
-      this.p();
-      this.font("-1");
-      this.em();
-      this.printText("doclet.Help_line_28");
-      this.emEnd();
-      this.fontEnd();
-      this.br();
-      this.hr();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/HtmlStandardWriter.java b/xalan2jdoc/src/main/java/HtmlStandardWriter.java
deleted file mode 100644
index ccfea62..0000000
--- a/xalan2jdoc/src/main/java/HtmlStandardWriter.java
+++ /dev/null
@@ -1,1113 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.Doc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.HtmlDocWriter;
-import java.io.File;
-import java.io.IOException;
-
-public class HtmlStandardWriter extends HtmlDocWriter {
-   public static final String destdir = Standard.configuration().destdirname;
-   public String relativepath = "";
-   public String path = "";
-   public String filename = "";
-   public String backpath = DirectoryManager.getBackPath(destdir);
-   public int displayLength = 0;
-   public static ClassDoc currentcd = null;
-
-   public HtmlStandardWriter(String filename) throws IOException {
-      super(filename);
-      this.filename = filename;
-   }
-
-   public HtmlStandardWriter(String path, String filename, String relativepath) throws IOException {
-      super(path, filename);
-      this.path = path;
-      this.relativepath = relativepath;
-      this.filename = filename;
-   }
-
-   public void boldText(String key) {
-      this.bold(this.getText(key));
-   }
-
-   public void boldText(String key, String a1) {
-      this.bold(this.getText(key, a1));
-   }
-
-   public void boldText(String key, String a1, String a2) {
-      this.bold(this.getText(key, a1, a2));
-   }
-
-   public void error(String key, String a1) {
-      Standard.configuration();
-      ConfigurationStandard.standardmessage.notice(key, a1);
-   }
-
-   public void error(String key, String a1, String a2) {
-      Standard.configuration();
-      ConfigurationStandard.standardmessage.notice(key, a1, a2);
-   }
-
-   public void frame(String arg) {
-      this.println("<FRAME " + arg + ">");
-   }
-
-   public void frameEnd() {
-      this.println("</FRAME>");
-   }
-
-   public void frameSet(String arg) {
-      this.println("<FRAMESET " + arg + ">");
-   }
-
-   public void frameSetEnd() {
-      this.println("</FRAMESET>");
-   }
-
-   public void generateTagInfo(Doc doc) {
-      Tag[] sinces = doc.tags("since");
-      Tag[] sees = doc.seeTags();
-      Tag[] usages = doc.tags("xsl.usage");
-      Tag[] authors;
-      if (HtmlDocWriter.configuration.showauthor) {
-         authors = doc.tags("author");
-      } else {
-         authors = new Tag[0];
-      }
-
-      Tag[] versions;
-      if (HtmlDocWriter.configuration.showversion) {
-         versions = doc.tags("version");
-      } else {
-         versions = new Tag[0];
-      }
-
-      if (sinces.length > 0
-         || sees.length > 0
-         || authors.length > 0
-         || versions.length > 0
-         || usages.length > 0
-         || doc.isClass() && ((ClassDoc)doc).isSerializable()) {
-         this.dl();
-         this.printSinceTag(doc);
-         if (versions.length > 0) {
-            this.dt();
-            this.boldText("doclet.Version");
-            this.dd();
-            this.printInlineComment(versions[0]);
-            this.ddEnd();
-         }
-
-         if (authors.length > 0) {
-            this.dt();
-            this.boldText("doclet.Author");
-            this.dd();
-
-            for(int i = 0; i < authors.length; ++i) {
-               if (i > 0) {
-                  this.print(", ");
-               }
-
-               this.printInlineComment(authors[i]);
-            }
-
-            this.ddEnd();
-         }
-
-         this.printSeeTags(doc);
-         this.printUsageTags(doc);
-         this.dlEnd();
-      }
-   }
-
-   public String getClassLink(ClassDoc cd) {
-      return this.getClassLink(cd, false);
-   }
-
-   public String getClassLink(ClassDoc cd, String label) {
-      return this.getClassLink(cd, "", label, false);
-   }
-
-   public String getClassLink(ClassDoc cd, String where, String label) {
-      return this.getClassLink(cd, where, label, false);
-   }
-
-   public String getClassLink(ClassDoc cd, String where, String label, boolean bold) {
-      return this.getClassLink(cd, where, label, bold, "");
-   }
-
-   public String getClassLink(ClassDoc cd, String where, String label, boolean bold, String color) {
-      boolean nameUnspecified = label.length() == 0;
-      if (nameUnspecified) {
-         label = cd.name();
-      }
-
-      this.displayLength += label.length();
-      if (cd.isIncluded()) {
-         String filename = this.pathToClass(cd);
-         return this.getHyperLink(filename, where, label, bold, color);
-      } else {
-         String crosslink = this.getCrossClassLink(cd);
-         if (crosslink != null) {
-            return this.getHyperLink(crosslink, where, label, bold, color);
-         } else {
-            if (nameUnspecified) {
-               this.displayLength -= label.length();
-               label = cd.qualifiedName();
-               this.displayLength += label.length();
-            }
-
-            return label;
-         }
-      }
-   }
-
-   public String getClassLink(ClassDoc cd, boolean bold) {
-      return this.getClassLink(cd, "", "", bold);
-   }
-
-   public String getCrossClassLink(ClassDoc cd) {
-      return this.getCrossLink(cd.containingPackage().name(), cd.name() + ".html");
-   }
-
-   public String getCrossLink(String packagename, String link) {
-      Extern fnd = Extern.findPackage(packagename);
-      if (fnd != null) {
-         String externlink = fnd.path + link;
-         return fnd.relative ? this.relativepath + externlink : externlink;
-      } else {
-         return null;
-      }
-   }
-
-   public String getCrossPackageLink(String packagename) {
-      return this.getCrossLink(packagename, "package-summary.html");
-   }
-
-   public String getDocLink(Doc doc, String label) {
-      return this.getDocLink(doc, label, false);
-   }
-
-   public String getDocLink(Doc doc, String label, boolean bold) {
-      if (doc instanceof PackageDoc) {
-         return this.getPackageLink((PackageDoc)doc, label);
-      } else if (doc instanceof ClassDoc) {
-         return this.getClassLink((ClassDoc)doc, "", label, bold);
-      } else if (doc instanceof ExecutableMemberDoc) {
-         ExecutableMemberDoc emd = (ExecutableMemberDoc)doc;
-         return this.getClassLink(emd.containingClass(), emd.name() + emd.signature(), label, bold);
-      } else if (doc instanceof MemberDoc) {
-         MemberDoc md = (MemberDoc)doc;
-         return this.getClassLink(md.containingClass(), md.name(), label, bold);
-      } else {
-         return doc instanceof RootDoc ? this.getHyperLink("overview-summary.html", label) : label;
-      }
-   }
-
-   public String getPackageLink(PackageDoc pkg) {
-      return this.getPackageLink(pkg, pkg.name());
-   }
-
-   public String getPackageLink(PackageDoc pkg, String linklabel) {
-      if (pkg.isIncluded()) {
-         return this.getHyperLink(this.pathString(pkg, "package-summary.html"), linklabel);
-      } else {
-         String crossPkgLink = this.getCrossPackageLink(pkg.name());
-         return crossPkgLink != null ? this.getHyperLink(crossPkgLink, linklabel) : linklabel;
-      }
-   }
-
-   public String getPreQualifiedClassLink(ClassDoc cd) {
-      return this.getPreQualifiedClassLink(cd, false);
-   }
-
-   public String getPreQualifiedClassLink(ClassDoc cd, boolean bold) {
-      String classlink = this.getPkgName(cd);
-      return classlink + this.getClassLink(cd, "", cd.name(), bold);
-   }
-
-   public String getQualifiedClassLink(ClassDoc cd) {
-      return this.getClassLink(cd, "", cd.qualifiedName());
-   }
-
-   public String getTargetHyperLink(String link, String where, String target, String label, boolean bold) {
-      StringBuffer str = new StringBuffer();
-      str.append("<A HREF=\"");
-      str.append(link);
-      if (where.length() > 0) {
-         str.append("#" + where);
-      }
-
-      str.append("\"");
-      str.append(" TARGET=\"");
-      str.append(target);
-      str.append("\">");
-      if (bold) {
-         str.append("<B>");
-      }
-
-      str.append(label);
-      if (bold) {
-         str.append("</B>");
-      }
-
-      str.append("</A>");
-      return str.toString();
-   }
-
-   public String getText(String key) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(key);
-   }
-
-   public String getText(String key, String a1) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(key, a1);
-   }
-
-   public String getText(String key, String a1, String a2) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(key, a1, a2);
-   }
-
-   public String getText(String key, String a1, String a2, String a3) {
-      Standard.configuration();
-      return ConfigurationStandard.standardmessage.getText(key, a1, a2, a3);
-   }
-
-   public boolean isCoreClass(ClassDoc cd) {
-      return cd.containingClass() == null || cd.isStatic();
-   }
-
-   public boolean isCrossClassIncluded(ClassDoc cd) {
-      if (cd.isIncluded()) {
-         return true;
-      } else {
-         return Extern.findPackage(cd.containingPackage().name()) != null;
-      }
-   }
-
-   public String italicsClassName(ClassDoc cd, boolean qual) {
-      String name = qual ? cd.qualifiedName() : cd.name();
-      return cd.isInterface() ? this.italicsText(name) : name;
-   }
-
-   protected void navCellEnd() {
-      this.space();
-      this.tdEnd();
-   }
-
-   protected void navCellRevStart() {
-      this.print("  ");
-      this.tdBgcolorStyle("#FFFFFF", "NavBarCell1Rev");
-      this.print(" ");
-      this.space();
-   }
-
-   protected void navCellStart() {
-      this.print("  ");
-      this.tdBgcolorStyle("#EEEEFF", "NavBarCell1");
-      this.print("    ");
-   }
-
-   protected void navDetail() {
-      this.printText("doclet.Detail");
-   }
-
-   protected void navHideLists() {
-      this.navHideLists(this.filename);
-   }
-
-   protected void navHideLists(String link) {
-      this.printBoldTargetHyperLink(link, "_top", this.getText("doclet.NO_FRAMES"));
-   }
-
-   protected void navLinkClass() {
-      this.navCellStart();
-      this.fontStyle("NavBarFont1");
-      this.printText("doclet.Class");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkClassUse() {
-      this.navCellStart();
-      this.fontStyle("NavBarFont1");
-      this.printText("doclet.navClassUse");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkContents() {
-      this.navCellStart();
-      this.printHyperLink(this.relativepath + "overview-summary.html", "", this.getText("doclet.Overview"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkDeprecated() {
-      this.navCellStart();
-      this.printHyperLink(this.relativepath + "deprecated-list.html", "", this.getText("doclet.navDeprecated"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkHelp() {
-      String helpfilenm = Standard.configuration().helpfile;
-      if (helpfilenm.equals("")) {
-         helpfilenm = "help-doc.html";
-      } else {
-         int lastsep;
-         if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) {
-            helpfilenm = helpfilenm.substring(lastsep + 1);
-         }
-      }
-
-      this.navCellStart();
-      this.printHyperLink(this.relativepath + helpfilenm, "", this.getText("doclet.Help"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkIndex() {
-      this.navCellStart();
-      this.printHyperLink(
-         this.relativepath
-            + (Standard.configuration().splitindex ? DirectoryManager.getPath("index-files") + "/" : "")
-            + (Standard.configuration().splitindex ? "index-1.html" : "index-all.html"),
-         "",
-         this.getText("doclet.Index"),
-         true,
-         "NavBarFont1"
-      );
-      this.navCellEnd();
-   }
-
-   protected void navLinkMainTree(String label) {
-      this.printHyperLink(this.relativepath + "overview-tree.html", label);
-   }
-
-   protected void navLinkNext() {
-      this.navLinkNext(null);
-   }
-
-   public void navLinkNext(String next) {
-      String tag = this.getText("doclet.Next");
-      if (next != null) {
-         this.printHyperLink(next, "", tag, true);
-      } else {
-         this.print(tag);
-      }
-   }
-
-   protected void navLinkPackage() {
-      this.navCellStart();
-      this.fontStyle("NavBarFont1");
-      this.printText("doclet.Package");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkPackage(PackageDoc pkg) {
-      this.printPackageLink(pkg, this.getFontColor("NavBarFont1") + this.getBold() + this.getText("doclet.Package") + this.getBoldEnd() + this.getFontEnd());
-   }
-
-   protected void navLinkPrevious() {
-      this.navLinkPrevious(null);
-   }
-
-   public void navLinkPrevious(String prev) {
-      String tag = this.getText("doclet.Prev");
-      if (prev != null) {
-         this.printHyperLink(prev, "", tag, true);
-      } else {
-         this.print(tag);
-      }
-   }
-
-   protected void navLinkTree() {
-      this.navCellStart();
-      PackageDoc[] packages = Standard.configuration().packages;
-      if (packages.length == 1) {
-         this.printHyperLink(this.pathString(packages[0], "package-tree.html"), "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      } else {
-         this.printHyperLink(this.relativepath + "overview-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      }
-
-      this.navCellEnd();
-   }
-
-   protected void navLinks(boolean header) {
-      this.println("");
-      this.println("<!-- ========== START OF NAVBAR ========== -->");
-      if (!Standard.configuration().nonavbar) {
-         if (header) {
-            this.anchor("navbar_top");
-         } else {
-            this.anchor("navbar_bottom");
-         }
-
-         this.table(0, "100%", 1, 0);
-         this.tr();
-         this.tdColspanBgcolorStyle(2, "#EEEEFF", "NavBarCell1");
-         this.println("");
-         if (header) {
-            this.anchor("navbar_top_firstrow");
-         } else {
-            this.anchor("navbar_bottom_firstrow");
-         }
-
-         this.table(0, 0, 3);
-         this.print("  ");
-         this.trAlignVAlign("center", "top");
-         if (Standard.configuration().createoverview) {
-            this.navLinkContents();
-         }
-
-         if (Standard.configuration().packages.length > 0) {
-            this.navLinkPackage();
-         }
-
-         this.navLinkClass();
-         if (Standard.configuration().classuse) {
-            this.navLinkClassUse();
-         }
-
-         if (Standard.configuration().createtree) {
-            this.navLinkTree();
-         }
-
-         if (!Standard.configuration().nodeprecated && !Standard.configuration().nodeprecatedlist) {
-            this.navLinkDeprecated();
-         }
-
-         if (Standard.configuration().createindex) {
-            this.navLinkIndex();
-         }
-
-         if (!Standard.configuration().nohelp) {
-            this.navLinkHelp();
-         }
-
-         this.print("  ");
-         this.trEnd();
-         this.tableEnd();
-         this.tdEnd();
-         this.tdAlignVAlignRowspan("right", "top", 3);
-         this.printUserHeaderFooter(header);
-         this.tdEnd();
-         this.trEnd();
-         this.println("");
-         this.tr();
-         this.tdBgcolorStyle("white", "NavBarCell2");
-         this.font("-2");
-         this.space();
-         this.navLinkPrevious();
-         this.space();
-         this.println("");
-         this.space();
-         this.navLinkNext();
-         this.fontEnd();
-         this.tdEnd();
-         this.tdBgcolorStyle("white", "NavBarCell2");
-         this.font("-2");
-         this.print("  ");
-         this.navShowLists();
-         this.print("  ");
-         this.space();
-         this.println("");
-         this.space();
-         this.navHideLists();
-         this.fontEnd();
-         this.tdEnd();
-         this.trEnd();
-         this.printSummaryDetailLinks();
-         this.tableEnd();
-         this.println("<!-- =========== END OF NAVBAR =========== -->");
-         this.println("");
-      }
-   }
-
-   protected void navShowLists() {
-      this.navShowLists(this.relativepath + "index.html");
-   }
-
-   protected void navShowLists(String link) {
-      this.printBoldTargetHyperLink(link, "_top", this.getText("doclet.FRAMES"));
-   }
-
-   protected void navSummary() {
-      this.printText("doclet.Summary");
-   }
-
-   public void notice(String key, String a1) {
-      Standard.configuration();
-      ConfigurationStandard.standardmessage.notice(key, a1);
-   }
-
-   public void notice(String key, String a1, String a2) {
-      Standard.configuration();
-      ConfigurationStandard.standardmessage.notice(key, a1, a2);
-   }
-
-   protected String pathString(ClassDoc cd, String name) {
-      return this.pathString(cd.containingPackage(), name);
-   }
-
-   protected String pathString(PackageDoc pd, String name) {
-      StringBuffer buf = new StringBuffer(this.relativepath);
-      buf.append(DirectoryManager.getPathToPackage(pd, name));
-      return buf.toString();
-   }
-
-   protected String pathToClass(ClassDoc cd) {
-      return this.pathString(cd.containingPackage(), cd.name() + ".html");
-   }
-
-   public void printBoldTargetHyperLink(String link, String target, String label) {
-      this.printTargetHyperLink(link, target, label, true);
-   }
-
-   public void printBottom() {
-      this.hr();
-      this.print(Standard.configuration().bottom);
-   }
-
-   public void printClassLink(ClassDoc cd) {
-      this.print(this.getClassLink(cd, false));
-   }
-
-   public void printClassLink(ClassDoc cd, String label) {
-      this.print(this.getClassLink(cd, "", label, false));
-   }
-
-   public void printClassLink(ClassDoc cd, String where, String label) {
-      this.print(this.getClassLink(cd, where, label, false));
-   }
-
-   public void printClassLink(ClassDoc cd, String where, String label, boolean bold) {
-      this.print(this.getClassLink(cd, where, label, bold));
-   }
-
-   public void printClassLink(ClassDoc cd, String where, String label, boolean bold, String color) {
-      this.print(this.getClassLink(cd, where, label, bold, color));
-   }
-
-   public void printClassLink(ClassDoc cd, String label, boolean bold) {
-      this.print(this.getClassLink(cd, "", label, bold));
-   }
-
-   public void printClassLink(ClassDoc cd, boolean bold) {
-      this.print(this.getClassLink(cd, bold));
-   }
-
-   public void printClassLinkForSameDir(ClassDoc cd) {
-      if (cd.isIncluded()) {
-         this.printHyperLink(cd.name() + ".html", "", this.italicsClassName(cd, false));
-      } else {
-         this.print(this.italicsClassName(cd, true));
-      }
-   }
-
-   private void printCommentTags(Tag[] tags, boolean depr, boolean first) {
-      if (depr) {
-         this.italic();
-      }
-
-      for(int i = 0; i < tags.length; ++i) {
-         Tag tagelem = tags[i];
-         if (tagelem instanceof SeeTag) {
-            this.printSeeTag((SeeTag)tagelem);
-         } else {
-            String text = tagelem.text();
-            if (first) {
-               text = this.removeNonInlineTags(text);
-            }
-
-            this.print(text);
-         }
-      }
-
-      if (depr) {
-         this.italicEnd();
-      }
-
-      if (tags.length == 0) {
-         this.space();
-      }
-   }
-
-   private void printCommentTags(Tag[] tags, boolean depr, boolean first, int usagePattern) {
-      switch(usagePattern) {
-         case 2:
-            this.print("<i><font size=\"-1\" color=\"#00FF00\">**For advanced use only** ");
-            this.print("</font></i>");
-            this.printCommentTags(tags, depr, first);
-            break;
-         case 3:
-            this.print("<i><font size=\"-1\" color=\"#FF0000\">**For internal use only** ");
-            this.print("</font></i>");
-            this.printCommentTags(tags, depr, first);
-            break;
-         case 4:
-            this.print("<i><font size=\"-1\" color=\"#0000FF\">**Experimental** ");
-            this.print("</font></i>");
-            this.printCommentTags(tags, depr, first);
-            break;
-         default:
-            this.printCommentTags(tags, depr, first);
-      }
-   }
-
-   public void printDocLink(Doc doc, String label) {
-      this.printDocLink(doc, label, false);
-   }
-
-   public void printDocLink(Doc doc, String label, boolean bold) {
-      this.print(this.getDocLink(doc, label, bold));
-   }
-
-   public void printHeader(String title) {
-      this.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">");
-      this.println("<!--NewPage-->");
-      this.html();
-      this.head();
-      this.print("<!-- Generated by javadoc on ");
-      this.print(this.today());
-      this.println(" -->");
-      this.title();
-      this.println(title);
-      this.titleEnd();
-      this.printStyleSheetProperties();
-      this.headEnd();
-      this.body("white");
-   }
-
-   public void printIndexHeading(String str) {
-      this.h2();
-      this.print(str);
-      this.h2End();
-   }
-
-   public void printInlineComment(Doc doc) {
-      this.printCommentTags(doc.inlineTags(), false, false, Usage.usagePattern(doc));
-   }
-
-   public void printInlineComment(Tag tag) {
-      this.printCommentTags(tag.inlineTags(), false, false);
-   }
-
-   public void printInlineDeprecatedComment(Doc doc) {
-      this.printCommentTags(doc.inlineTags(), true, false);
-   }
-
-   public void printInlineDeprecatedComment(Tag tag) {
-      this.printCommentTags(tag.inlineTags(), true, false);
-   }
-
-   public void printPackageLink(PackageDoc pkg) {
-      this.print(this.getPackageLink(pkg));
-   }
-
-   public void printPackageLink(PackageDoc pkg, String linklabel) {
-      this.print(this.getPackageLink(pkg, linklabel));
-   }
-
-   public void printPreQualifiedBoldClassLink(ClassDoc cd) {
-      this.print(this.getPreQualifiedClassLink(cd, true));
-   }
-
-   public void printPreQualifiedClassLink(ClassDoc cd) {
-      this.print(this.getPreQualifiedClassLink(cd, false));
-   }
-
-   public void printQualifiedClassLink(ClassDoc cd) {
-      this.printClassLink(cd, "", cd.qualifiedName());
-   }
-
-   public void printSeeTag(SeeTag see) {
-      PackageDoc refPackage = see.referencedPackage();
-      ClassDoc refClass = see.referencedClass();
-      String refClassName = see.referencedClassName();
-      MemberDoc refMem = see.referencedMember();
-      String refMemName = see.referencedMemberName();
-      String label = see.label();
-      String seetext = see.text();
-      String text = this.getCode() + seetext + this.getCodeEnd();
-      if (seetext.startsWith("<")) {
-         this.print(seetext);
-      } else {
-         if (refClass == null) {
-            if (refPackage != null && refPackage.isIncluded()) {
-               this.printPackageLink(refPackage);
-            } else if (refClassName != null && refClassName.length() > 0) {
-               String crosslink = this.getCrossPackageLink(refClassName);
-               if (crosslink != null) {
-                  this.printHyperLink(crosslink, "", refClassName, false);
-               } else {
-                  this.warning("doclet.see.class_or_package_not_found", seetext);
-                  this.print(label.length() == 0 ? text : label);
-               }
-            } else {
-               this.error("doclet.see.malformed_tag", seetext);
-            }
-         } else if (refMemName == null) {
-            if (label.length() == 0) {
-               label = this.getCode() + refClass.name() + this.getCodeEnd();
-               this.printClassLink(refClass, label);
-            } else {
-               this.printClassLink(refClass, label.length() == 0 ? text : label);
-            }
-         } else if (refMem == null) {
-            this.print(label.length() == 0 ? text : label);
-         } else {
-            ClassDoc containing = refMem.containingClass();
-            if (currentcd != containing) {
-               refMemName = containing.name() + "." + refMemName;
-            }
-
-            if (refMem instanceof ExecutableMemberDoc && refMemName.indexOf(40) < 0) {
-               refMemName = refMemName + ((ExecutableMemberDoc)refMem).signature();
-            }
-
-            text = this.getCode() + refMemName + this.getCodeEnd();
-            this.printDocLink(refMem, label.length() == 0 ? text : label);
-         }
-      }
-   }
-
-   public void printSeeTags(Doc doc) {
-      SeeTag[] sees = doc.seeTags();
-      if (sees.length > 0) {
-         this.dt();
-         this.boldText("doclet.See_Also");
-         this.dd();
-
-         for(int i = 0; i < sees.length; ++i) {
-            if (i > 0) {
-               this.println(", ");
-            }
-
-            this.printSeeTag(sees[i]);
-         }
-      }
-
-      if (doc.isClass() && ((ClassDoc)doc).isSerializable()) {
-         if (sees.length > 0) {
-            this.print(", ");
-         } else {
-            this.dt();
-            this.boldText("doclet.See_Also");
-            this.dd();
-         }
-
-         this.printHyperLink(this.relativepath + "serialized-form.html", ((ClassDoc)doc).qualifiedName(), this.getText("doclet.Serialized_Form"));
-      }
-   }
-
-   public void printSinceTag(Doc doc) {
-      Tag[] sinces = doc.tags("since");
-      if (sinces.length > 0) {
-         this.dt();
-         this.boldText("doclet.Since");
-         this.dd();
-         this.printInlineComment(sinces[0]);
-         this.ddEnd();
-      }
-   }
-
-   public void printStyleSheetProperties() {
-      String filename = Standard.configuration().stylesheetfile;
-      if (filename.length() > 0) {
-         File stylefile = new File(filename);
-         String parent = stylefile.getParent();
-         filename = parent == null ? filename : filename.substring(parent.length() + 1);
-      } else {
-         filename = "stylesheet.css";
-      }
-
-      filename = this.relativepath + filename;
-      this.link("REL =\"stylesheet\" TYPE=\"text/css\" HREF=\"" + filename + "\" " + "TITLE=\"Style\"");
-   }
-
-   public void printSummaryComment(Doc doc) {
-      this.printCommentTags(doc.firstSentenceTags(), false, true, Usage.usagePattern(doc));
-   }
-
-   public void printSummaryDeprecatedComment(Doc doc) {
-      this.printCommentTags(doc.firstSentenceTags(), true, true);
-   }
-
-   public void printSummaryDeprecatedComment(Tag tag) {
-      this.printCommentTags(tag.firstSentenceTags(), true, true);
-   }
-
-   protected void printSummaryDetailLinks() {
-   }
-
-   public void printTargetClassLink(ClassDoc cd, String target) {
-      String filename = cd.name() + ".html";
-      this.printTargetHyperLink(filename, target, cd.isInterface() ? this.italicsText(cd.name()) : cd.name());
-   }
-
-   public void printTargetHyperLink(String link, String target, String label) {
-      this.printTargetHyperLink(link, "", target, label, false);
-   }
-
-   public void printTargetHyperLink(String link, String where, String target, String label, boolean bold) {
-      this.print(this.getTargetHyperLink(link, where, target, label, bold));
-   }
-
-   public void printTargetHyperLink(String link, String target, String label, boolean bold) {
-      this.printTargetHyperLink(link, "", target, label, bold);
-   }
-
-   public void printTargetPackageLink(PackageDoc pd, String target, String label) {
-      this.printTargetHyperLink(this.pathString(pd, "package-summary.html"), target, label);
-   }
-
-   public void printText(String key) {
-      this.print(this.getText(key));
-   }
-
-   public void printText(String key, String a1) {
-      this.print(this.getText(key, a1));
-   }
-
-   public void printText(String key, String a1, String a2) {
-      this.print(this.getText(key, a1, a2));
-   }
-
-   public void printUsageTags(Doc doc) {
-      Tag[] usages = doc.tags("xsl.usage");
-      if (usages.length > 0) {
-         this.dt();
-         this.boldText("doclet.xsl.usage.header");
-         this.dd();
-
-         for(int i = 0; i < usages.length - 1; ++i) {
-            this.print(XSLUsage.getHTML(usages[i]) + ", ");
-         }
-
-         this.print(XSLUsage.getHTML(usages[usages.length - 1]));
-         this.ddEnd();
-      }
-   }
-
-   public void printUserHeaderFooter(boolean header) {
-      this.em();
-      if (header) {
-         this.print(Standard.configuration().header);
-      } else if (Standard.configuration().footer.length() != 0) {
-         this.print(Standard.configuration().footer);
-      } else {
-         this.print(Standard.configuration().header);
-      }
-
-      this.emEnd();
-   }
-
-   public String removeNonInlineTags(String text) {
-      if (text.indexOf(60) < 0) {
-         return text;
-      } else {
-         String[] noninlinetags = new String[]{
-            "<ul>",
-            "</ul>",
-            "<ol>",
-            "</ol>",
-            "<dl>",
-            "</dl>",
-            "<table>",
-            "</table>",
-            "<tr>",
-            "</tr>",
-            "<td>",
-            "</td>",
-            "<th>",
-            "</th>",
-            "<p>",
-            "</p>",
-            "<li>",
-            "</li>",
-            "<dd>",
-            "</dd>",
-            "<dir>",
-            "</dir>",
-            "<dt>",
-            "</dt>",
-            "<h1>",
-            "</h1>",
-            "<h2>",
-            "</h2>",
-            "<h3>",
-            "</h3>",
-            "<h4>",
-            "</h4>",
-            "<h5>",
-            "</h5>",
-            "<h6>",
-            "</h6>",
-            "<pre>",
-            "</pre>",
-            "<menu>",
-            "</menu>",
-            "<listing>",
-            "</listing>",
-            "<hr>",
-            "<blockquote>",
-            "</blockquote>",
-            "<center>",
-            "</center>",
-            "<UL>",
-            "</UL>",
-            "<OL>",
-            "</OL>",
-            "<DL>",
-            "</DL>",
-            "<TABLE>",
-            "</TABLE>",
-            "<TR>",
-            "</TR>",
-            "<TD>",
-            "</TD>",
-            "<TH>",
-            "</TH>",
-            "<P>",
-            "</P>",
-            "<LI>",
-            "</LI>",
-            "<DD>",
-            "</DD>",
-            "<DIR>",
-            "</DIR>",
-            "<DT>",
-            "</DT>",
-            "<H1>",
-            "</H1>",
-            "<H2>",
-            "</H2>",
-            "<H3>",
-            "</H3>",
-            "<H4>",
-            "</H4>",
-            "<H5>",
-            "</H5>",
-            "<H6>",
-            "</H6>",
-            "<PRE>",
-            "</PRE>",
-            "<MENU>",
-            "</MENU>",
-            "<LISTING>",
-            "</LISTING>",
-            "<HR>",
-            "<BLOCKQUOTE>",
-            "</BLOCKQUOTE>",
-            "<CENTER>",
-            "</CENTER>"
-         };
-
-         for(int i = 0; i < noninlinetags.length; ++i) {
-            text = this.replace(text, noninlinetags[i], "");
-         }
-
-         return text;
-      }
-   }
-
-   public String replace(String text, String tobe, String by) {
-      while(true) {
-         int startindex = text.indexOf(tobe);
-         if (startindex < 0) {
-            return text;
-         }
-
-         int endindex = startindex + tobe.length();
-         StringBuffer replaced = new StringBuffer();
-         if (startindex > 0) {
-            replaced.append(text.substring(0, startindex));
-         }
-
-         replaced.append(by);
-         if (text.length() > endindex) {
-            replaced.append(text.substring(endindex));
-         }
-
-         text = replaced.toString();
-      }
-   }
-
-   public void summaryRow(int width) {
-      if (width != 0) {
-         this.tdWidth(width + "%");
-      } else {
-         this.td();
-      }
-   }
-
-   public void summaryRowEnd() {
-      this.tdEnd();
-   }
-
-   public void tableHeaderEnd() {
-      this.fontEnd();
-      this.tdEnd();
-      this.trEnd();
-   }
-
-   public void tableHeaderStart() {
-      this.tableHeaderStart(2);
-   }
-
-   public void tableHeaderStart(int span) {
-      this.tableHeaderStart("#CCCCFF", span);
-   }
-
-   public void tableHeaderStart(String color) {
-      this.tableHeaderStart(color, 2);
-   }
-
-   public void tableHeaderStart(String color, int span) {
-      this.trBgcolorStyle(color, "TableHeadingColor");
-      this.tdColspan(span);
-      this.font("+2");
-   }
-
-   public void tableIndexDetail() {
-      this.println("\n<TABLE BORDER=\"1\" CELLPADDING=\"3\" CELLSPACING=\"0\" WIDTH=\"100%\">");
-   }
-
-   public void tableIndexSummary() {
-      this.println("\n<TABLE BORDER=\"1\" CELLPADDING=\"3\" CELLSPACING=\"0\" WIDTH=\"100%\">");
-   }
-
-   public void tableInheritedHeaderEnd() {
-      this.tdEnd();
-      this.trEnd();
-   }
-
-   public void tableInheritedHeaderStart(String color) {
-      this.trBgcolorStyle(color, "TableSubHeadingColor");
-      this.td();
-   }
-
-   public void tableUseInfoHeaderStart(String color) {
-      this.trBgcolorStyle(color, "TableSubHeadingColor");
-      this.tdColspan(2);
-   }
-
-   public void tdIndex() {
-      this.print("<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\">");
-   }
-
-   public void warning(String key, String a1) {
-      Standard.configuration();
-      ConfigurationStandard.standardmessage.warning(key, a1);
-   }
-}
diff --git a/xalan2jdoc/src/main/java/MethodSubWriter.java b/xalan2jdoc/src/main/java/MethodSubWriter.java
deleted file mode 100644
index 1f2188f..0000000
--- a/xalan2jdoc/src/main/java/MethodSubWriter.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ParamTag;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.Tag;
-import com.sun.javadoc.ThrowsTag;
-import com.sun.javadoc.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class MethodSubWriter extends ExecutableMemberSubWriter {
-   MethodSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   protected void composeInheritedMethodMap(ClassDoc icd, List tcms, Map imsmap, List hierarchy) {
-      MethodDoc[] methods = icd.methods();
-      List methodlist = new ArrayList();
-
-      for(int i = 0; i < methods.length; ++i) {
-         if (!this.contains(tcms, methods[i])) {
-            methodlist.add(methods[i]);
-            tcms.add(methods[i]);
-         }
-      }
-
-      imsmap.put(icd, methodlist);
-      hierarchy.add(icd);
-   }
-
-   protected boolean contains(List tcmethods, MethodDoc method) {
-      for(int i = 0; i < tcmethods.size(); ++i) {
-         MethodDoc tcmethod = (MethodDoc)tcmethods.get(i);
-         if (tcmethod.name().equals(method.name()) && tcmethod.signature().equals(method.signature())) {
-            return true;
-         }
-      }
-
-      return false;
-   }
-
-   protected Map getInheritedMethodMapForClass(ClassDoc cd, List tcms, Map imsmap, List hierarchy) {
-      for(ClassDoc icd = cd.superclass(); icd != null; icd = icd.superclass()) {
-         this.composeInheritedMethodMap(icd, tcms, imsmap, hierarchy);
-      }
-
-      return imsmap;
-   }
-
-   protected Map getInheritedMethodMapForInterface(ClassDoc cd, List tims, Map imsmap, List hierarchy) {
-      ClassDoc[] iin = cd.interfaces();
-
-      for(int i = 0; i < iin.length; ++i) {
-         this.composeInheritedMethodMap(iin[i], tims, imsmap, hierarchy);
-      }
-
-      for(int i = 0; i < iin.length; ++i) {
-         this.getInheritedMethodMapForInterface(iin[i], tims, imsmap, hierarchy);
-      }
-
-      return imsmap;
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      return this.eligibleMembers(cd.methods());
-   }
-
-   protected void printHeader(ClassDoc cd) {
-      super.writer.anchor("method_detail");
-      super.writer.printTableHeadingBackground(super.writer.getText("doclet.Method_Detail"));
-   }
-
-   protected void printInheritedMembersInfo(ClassDoc icd, List members) {
-      if (members.size() > 0) {
-         Collections.sort(members);
-         this.printInheritedSummaryHeader(icd);
-         this.printInheritedSummaryMember(icd, (ProgramElementDoc)members.get(0));
-
-         for(int i = 1; i < members.size(); ++i) {
-            super.writer.println(", ");
-            this.printInheritedSummaryMember(icd, (ProgramElementDoc)members.get(i));
-         }
-
-         this.printInheritedSummaryFooter(icd);
-      }
-   }
-
-   public void printInheritedMembersSummary(ClassDoc cd) {
-      List tcms = Group.asList(cd.methods());
-      Map imsmap = new HashMap();
-      List hierarchy = new ArrayList();
-      if (cd.isClass()) {
-         imsmap = this.getInheritedMethodMapForClass(cd, tcms, imsmap, hierarchy);
-      } else {
-         imsmap = this.getInheritedMethodMapForInterface(cd, tcms, imsmap, hierarchy);
-      }
-
-      if (hierarchy.size() > 0) {
-         for(int i = 0; i < hierarchy.size(); ++i) {
-            ClassDoc classkey = (ClassDoc)hierarchy.get(i);
-            List methodlist = (List)imsmap.get(classkey);
-            this.printInheritedMembersInfo(classkey, methodlist);
-         }
-      }
-   }
-
-   public void printInheritedSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("methods_inherited_from_class_" + cd.qualifiedName());
-   }
-
-   public void printInheritedSummaryLabel(ClassDoc cd) {
-      String classlink = super.writer.getPreQualifiedClassLink(cd);
-      super.writer.bold();
-      if (cd.isClass()) {
-         super.writer.printText("doclet.Methods_Inherited_From_Class", classlink);
-      } else {
-         super.writer.printText("doclet.Methods_Inherited_From_Interface", classlink);
-      }
-
-      super.writer.boldEnd();
-   }
-
-   protected void printNavDetailLink(boolean link) {
-      if (link) {
-         super.writer.printHyperLink("", "method_detail", super.writer.getText("doclet.navMethod"));
-      } else {
-         super.writer.printText("doclet.navMethod");
-      }
-   }
-
-   protected void printNavSummaryLink(ClassDoc cd, boolean link) {
-      if (link) {
-         super.writer
-            .printHyperLink("", cd == null ? "method_summary" : "methods_inherited_from_class_" + cd.qualifiedName(), super.writer.getText("doclet.navMethod"));
-      } else {
-         super.writer.printText("doclet.navMethod");
-      }
-   }
-
-   protected void printOverridden(ClassDoc overridden, MethodDoc method) {
-      if (overridden != null) {
-         String overriddenclasslink = super.writer.getClassLink(overridden);
-         String methlink = "";
-         String name = method.name();
-         super.writer.dt();
-         super.writer.boldText("doclet.Overrides");
-         super.writer.dd();
-         methlink = super.writer.getClassLink(overridden, name + method.signature(), name, false);
-         super.writer.printText("doclet.in_class", methlink, overriddenclasslink);
-      }
-   }
-
-   protected void printReturnTag(Tag[] returns) {
-      if (returns.length > 0) {
-         super.writer.dt();
-         super.writer.boldText("doclet.Returns");
-         super.writer.dd();
-         super.writer.printInlineComment(returns[0]);
-      }
-   }
-
-   protected void printReturnType(MethodDoc method) {
-      Type type = method.returnType();
-      if (type != null) {
-         this.printTypeLink(type);
-         this.print(' ');
-      }
-   }
-
-   protected void printSignature(ExecutableMemberDoc member) {
-      super.writer.displayLength = 0;
-      super.writer.pre();
-      this.printModifiers(member);
-      this.printReturnType((MethodDoc)member);
-      this.bold(member.name());
-      this.printParameters(member);
-      this.printExceptions(member);
-      super.writer.preEnd();
-   }
-
-   public void printSummaryAnchor(ClassDoc cd) {
-      super.writer.anchor("method_summary");
-   }
-
-   public void printSummaryLabel(ClassDoc cd) {
-      super.writer.boldText("doclet.Method_Summary");
-   }
-
-   protected void printSummaryType(ProgramElementDoc member) {
-      MethodDoc meth = (MethodDoc)member;
-      this.printModifierAndType(meth, meth.returnType());
-   }
-
-   protected void printTags(ProgramElementDoc member) {
-      MethodDoc method = (MethodDoc)member;
-      ParamTag[] params = method.paramTags();
-      Tag[] returns = method.tags("return");
-      Tag[] sinces = method.tags("since");
-      ThrowsTag[] thrown = method.throwsTags();
-      SeeTag[] sees = method.seeTags();
-      ClassDoc[] intfacs = member.containingClass().interfaces();
-      ClassDoc overridden = method.overriddenClass();
-      Tag[] usages = member.tags("xsl.usage");
-      if (usages.length + params.length + returns.length + thrown.length + sinces.length + intfacs.length + sees.length > 0 || overridden != null) {
-         super.writer.dd();
-         super.writer.dl();
-         this.printImplementsInfo(method);
-         this.printParamTags(params);
-         this.printReturnTag(returns);
-         this.printThrowsTags(thrown);
-         this.printOverridden(overridden, method);
-         super.writer.printSinceTag(method);
-         super.writer.printSeeTags(method);
-         super.writer.printUsageTags(method);
-         super.writer.dlEnd();
-         super.writer.ddEnd();
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageFrameWriter.java b/xalan2jdoc/src/main/java/PackageFrameWriter.java
deleted file mode 100644
index 164a521..0000000
--- a/xalan2jdoc/src/main/java/PackageFrameWriter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.Arrays;
-
-public class PackageFrameWriter extends AbstractPackageWriter {
-   public PackageFrameWriter(String path, String filename, PackageDoc packagedoc) throws IOException, DocletAbortException {
-      super(path, filename, packagedoc);
-   }
-
-   public static void generate(PackageDoc pkg) throws DocletAbortException {
-      String path = DirectoryManager.getDirectoryPath(pkg);
-      String filename = "package-frame.html";
-
-      try {
-         PackageFrameWriter packgen = new PackageFrameWriter(path, filename, pkg);
-         packgen.generatePackageFile();
-         packgen.close();
-      } catch (IOException var5) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var5.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateClassKindListing(ClassDoc[] arr, String label) {
-      if (arr.length > 0) {
-         Arrays.sort((Object[])arr);
-         this.printPackageTableHeader();
-         this.fontSizeStyle("+1", "FrameHeadingFont");
-         this.print(label);
-         this.fontEnd();
-         this.println("&nbsp;");
-         this.fontStyle("FrameItemFont");
-
-         for(int i = 0; i < arr.length; ++i) {
-            if (this.isCoreClass(arr[i])) {
-               this.br();
-               this.printTargetClassLink(arr[i], "classFrame");
-            }
-         }
-
-         this.fontEnd();
-         this.printPackageTableFooter();
-         this.println();
-      }
-   }
-
-   protected void generateClassListing() {
-      this.generateClassKindListing(super.packagedoc.interfaces(), this.getText("doclet.Interfaces"));
-      this.generateClassKindListing(super.packagedoc.ordinaryClasses(), this.getText("doclet.Classes"));
-      this.generateClassKindListing(super.packagedoc.exceptions(), this.getText("doclet.Exceptions"));
-      this.generateClassKindListing(super.packagedoc.errors(), this.getText("doclet.Errors"));
-   }
-
-   protected void printPackageDescription() throws IOException {
-   }
-
-   protected void printPackageFooter() {
-   }
-
-   protected void printPackageHeader(String heading) {
-      this.fontSizeStyle("+1", "FrameTitleFont");
-      this.printTargetPackageLink(super.packagedoc, "classFrame", heading);
-      this.fontEnd();
-   }
-
-   protected void printPackageTableFooter() {
-      this.tdEnd();
-      this.trEnd();
-      this.tableEnd();
-   }
-
-   protected void printPackageTableHeader() {
-      this.table();
-      this.tr();
-      this.tdNowrap();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageIndexFrameWriter.java b/xalan2jdoc/src/main/java/PackageIndexFrameWriter.java
deleted file mode 100644
index 2b13b37..0000000
--- a/xalan2jdoc/src/main/java/PackageIndexFrameWriter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class PackageIndexFrameWriter extends AbstractPackageIndexWriter {
-   public PackageIndexFrameWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate() throws DocletAbortException {
-      String filename = "overview-frame.html";
-
-      try {
-         PackageIndexFrameWriter packgen = new PackageIndexFrameWriter(filename);
-         packgen.generatePackageIndexFile();
-         packgen.close();
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void printAllClassesPackagesLink() {
-      this.fontStyle("FrameItemFont");
-      this.printTargetHyperLink("allclasses-frame.html", "packageFrame", this.getText("doclet.All_Classes"));
-      this.fontEnd();
-      this.p();
-      this.fontSizeStyle("+1", "FrameHeadingFont");
-      this.printText("doclet.Packages");
-      this.fontEnd();
-      this.br();
-   }
-
-   protected void printIndexFooter() {
-      this.printTableFooter();
-   }
-
-   protected void printIndexHeader(String text) {
-      this.printTableHeader();
-   }
-
-   protected void printIndexRow(PackageDoc pd) {
-      this.fontStyle("FrameItemFont");
-      this.printTargetHyperLink(this.pathString(pd, "package-frame.html"), "packageFrame", pd.name());
-      this.fontEnd();
-      this.br();
-   }
-
-   protected void printNavigationBarFooter() {
-      this.p();
-      this.space();
-   }
-
-   protected void printNavigationBarHeader() {
-      if (Standard.configuration().header != null) {
-         this.printTableHeader();
-         this.fontSizeStyle("+1", "FrameTitleFont");
-         this.bold(Standard.configuration().header);
-         this.fontEnd();
-         this.printTableFooter();
-      }
-   }
-
-   protected void printOverviewHeader() {
-   }
-
-   protected void printTableFooter() {
-      this.tdEnd();
-      this.trEnd();
-      this.tableEnd();
-   }
-
-   protected void printTableHeader() {
-      this.table();
-      this.tr();
-      this.tdNowrap();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageIndexWriter.java b/xalan2jdoc/src/main/java/PackageIndexWriter.java
deleted file mode 100644
index a15c9ed..0000000
--- a/xalan2jdoc/src/main/java/PackageIndexWriter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-public class PackageIndexWriter extends AbstractPackageIndexWriter {
-   private RootDoc root;
-   private Map groupPackageMap;
-   private List groupList;
-
-   public PackageIndexWriter(String filename, RootDoc root) throws IOException {
-      super(filename);
-      this.root = root;
-      this.groupPackageMap = Group.groupPackages(super.packages);
-      this.groupList = Group.getGroupList();
-   }
-
-   public static void generate(RootDoc root) throws DocletAbortException {
-      String filename = "overview-summary.html";
-
-      try {
-         PackageIndexWriter packgen = new PackageIndexWriter(filename, root);
-         packgen.generatePackageIndexFile();
-         packgen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateIndex() {
-      for(int i = 0; i < this.groupList.size(); ++i) {
-         String groupname = (String)this.groupList.get(i);
-         List list = (List)this.groupPackageMap.get(groupname);
-         if (list != null && list.size() > 0) {
-            this.printIndexContents(list.toArray(new PackageDoc[list.size()]), groupname);
-         }
-      }
-   }
-
-   protected void printIndexFooter() {
-      this.tableEnd();
-      this.p();
-      this.space();
-   }
-
-   protected void printIndexHeader(String text) {
-      this.tableIndexSummary();
-      this.tableHeaderStart("#CCCCFF");
-      this.bold(text);
-      this.tableHeaderEnd();
-   }
-
-   protected void printIndexRow(PackageDoc packagedoc) {
-      this.trBgcolorStyle("white", "TableRowColor");
-      this.summaryRow(20);
-      this.bold();
-      this.printPackageLink(packagedoc);
-      this.boldEnd();
-      this.summaryRowEnd();
-      this.summaryRow(0);
-      this.printSummaryComment(packagedoc);
-      this.summaryRowEnd();
-      this.trEnd();
-   }
-
-   protected void printNavigationBarFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-   }
-
-   protected void printNavigationBarHeader() {
-      this.navLinks(true);
-      this.hr();
-      this.printConfigurationTitle();
-   }
-
-   protected void printOverview() throws IOException {
-      this.printOverviewComment();
-      this.generateTagInfo(this.root);
-   }
-
-   protected void printOverviewComment() {
-      if (this.root.inlineTags().length > 0) {
-         this.anchor("overview_description");
-         this.p();
-         this.printInlineComment(this.root);
-         this.p();
-      }
-   }
-
-   protected void printOverviewHeader() {
-      if (this.root.inlineTags().length > 0) {
-         this.printSummaryComment(this.root);
-         this.p();
-         this.bold(this.getText("doclet.See"));
-         this.br();
-         this.printNbsps();
-         this.printHyperLink("", "overview_description", this.getText("doclet.Description"), true);
-         this.p();
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageListWriter.java b/xalan2jdoc/src/main/java/PackageListWriter.java
deleted file mode 100644
index 176e5a4..0000000
--- a/xalan2jdoc/src/main/java/PackageListWriter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class PackageListWriter extends HtmlStandardWriter {
-   public PackageListWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate(RootDoc root) throws DocletAbortException {
-      String filename = "package-list";
-
-      try {
-         PackageListWriter packgen = new PackageListWriter(filename);
-         packgen.generatePackageListFile(root);
-         packgen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generatePackageListFile(RootDoc root) {
-      PackageDoc[] packages = Standard.configuration().packages;
-
-      for(int i = 0; i < packages.length; ++i) {
-         this.println(packages[i].name());
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageTreeWriter.java b/xalan2jdoc/src/main/java/PackageTreeWriter.java
deleted file mode 100644
index 8d529eb..0000000
--- a/xalan2jdoc/src/main/java/PackageTreeWriter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class PackageTreeWriter extends AbstractTreeWriter {
-   protected PackageDoc packagedoc;
-   protected PackageDoc prev;
-   protected PackageDoc next;
-
-   public PackageTreeWriter(String path, String filename, PackageDoc packagedoc, PackageDoc prev, PackageDoc next, boolean noDeprecated) throws IOException, DocletAbortException {
-      super(path, filename, new ClassTree(packagedoc.allClasses(), noDeprecated), packagedoc);
-      this.packagedoc = packagedoc;
-      this.prev = prev;
-      this.next = next;
-   }
-
-   public static void generate(PackageDoc pkg, PackageDoc prev, PackageDoc next, boolean noDeprecated) throws DocletAbortException {
-      String path = DirectoryManager.getDirectoryPath(pkg);
-      String filename = "package-tree.html";
-
-      try {
-         PackageTreeWriter packgen = new PackageTreeWriter(path, filename, pkg, prev, next, noDeprecated);
-         packgen.generatePackageTreeFile();
-         packgen.close();
-      } catch (IOException var8) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var8.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generatePackageTreeFile() throws IOException {
-      this.printHeader(this.getText("doclet.Window_Package_Class_Hierarchy", Standard.configuration().windowtitle, this.packagedoc.name()));
-      this.printPackageTreeHeader();
-      if (Standard.configuration().packages.length > 1) {
-         this.printLinkToMainTree();
-      }
-
-      this.generateTree(super.classtree.baseclasses(), "doclet.Class_Hierarchy");
-      this.generateTree(super.classtree.baseinterfaces(), "doclet.Interface_Hierarchy");
-      this.printPackageTreeFooter();
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navLinkNext() {
-      if (this.next == null) {
-         this.navLinkNext(null);
-      } else {
-         String path = DirectoryManager.getRelativePath(this.packagedoc.name(), this.next.name());
-         this.navLinkNext(path + "package-tree.html");
-      }
-   }
-
-   protected void navLinkPackage() {
-      this.navCellStart();
-      this.printHyperLink("package-summary.html", "", this.getText("doclet.Package"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkPrevious() {
-      if (this.prev == null) {
-         this.navLinkPrevious(null);
-      } else {
-         String path = DirectoryManager.getRelativePath(this.packagedoc.name(), this.prev.name());
-         this.navLinkPrevious(path + "package-tree.html");
-      }
-   }
-
-   protected void printLinkToMainTree() {
-      this.dl();
-      this.dt();
-      this.boldText("doclet.Package_Hierarchies");
-      this.dd();
-      this.navLinkMainTree(this.getText("doclet.All_Packages"));
-      this.dlEnd();
-      this.hr();
-   }
-
-   protected void printPackageTreeFooter() {
-      this.hr();
-      this.navLinks(false);
-   }
-
-   protected void printPackageTreeHeader() {
-      this.navLinks(true);
-      this.hr();
-      this.center();
-      this.h2(this.getText("doclet.Hierarchy_For_Package", this.packagedoc.name()));
-      this.centerEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageUseWriter.java b/xalan2jdoc/src/main/java/PackageUseWriter.java
deleted file mode 100644
index 6e49b33..0000000
--- a/xalan2jdoc/src/main/java/PackageUseWriter.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-public class PackageUseWriter extends SubWriterHolderWriter {
-   final PackageDoc pkgdoc;
-   final SortedMap usingPackageToUsedClasses = new TreeMap();
-
-   public PackageUseWriter(ClassUseMapper mapper, String filename, PackageDoc pkgdoc) throws IOException, DocletAbortException {
-      super(DirectoryManager.getDirectoryPath(pkgdoc), filename, DirectoryManager.getRelativePath(pkgdoc.name()));
-      this.pkgdoc = pkgdoc;
-      ClassDoc[] content = pkgdoc.allClasses();
-
-      for(int i = 0; i < content.length; ++i) {
-         ClassDoc usedClass = content[i];
-         Set usingClasses = (Set)mapper.classToClass.get(usedClass);
-         if (usingClasses != null) {
-            for(ClassDoc usingClass : usingClasses) {
-               PackageDoc usingPackage = usingClass.containingPackage();
-               Set usedClasses = (Set)this.usingPackageToUsedClasses.get(usingPackage);
-               if (usedClasses == null) {
-                  usedClasses = new TreeSet();
-                  this.usingPackageToUsedClasses.put(usingPackage, usedClasses);
-               }
-
-               usedClasses.add(usedClass);
-            }
-         }
-      }
-   }
-
-   public static void generate(ClassUseMapper mapper, PackageDoc pkgdoc) throws DocletAbortException {
-      String filename = "package-use.html";
-
-      try {
-         PackageUseWriter pkgusegen = new PackageUseWriter(mapper, filename, pkgdoc);
-         pkgusegen.generatePackageUseFile();
-         pkgusegen.close();
-      } catch (IOException var5) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var5.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateClassList() throws IOException {
-      for(PackageDoc usingPackage : this.usingPackageToUsedClasses.keySet()) {
-         this.anchor(usingPackage.name());
-         this.tableIndexSummary();
-         this.tableHeaderStart("#CCCCFF");
-         this.printText("doclet.ClassUse_Classes.in.0.used.by.1", this.getPackageLink(this.pkgdoc), this.getPackageLink(usingPackage));
-         Iterator itc = ((Collection)this.usingPackageToUsedClasses.get(usingPackage)).iterator();
-
-         while(itc.hasNext()) {
-            this.printClassRow((ClassDoc)itc.next(), usingPackage);
-         }
-
-         this.tableHeaderEnd();
-         this.tableEnd();
-         this.space();
-         this.p();
-      }
-   }
-
-   protected void generatePackageList() throws IOException {
-      this.tableIndexSummary();
-      this.tableHeaderStart("#CCCCFF");
-      this.printText("doclet.ClassUse_Packages.that.use.0", this.getPackageLink(this.pkgdoc));
-      this.tableHeaderEnd();
-
-      for(PackageDoc pkg : this.usingPackageToUsedClasses.keySet()) {
-         this.generatePackageUse(pkg);
-      }
-
-      this.tableEnd();
-      this.space();
-      this.p();
-   }
-
-   protected void generatePackageUse() throws IOException {
-      if (Standard.configuration().packages.length > 1) {
-         this.generatePackageList();
-      }
-
-      this.generateClassList();
-   }
-
-   protected void generatePackageUse(PackageDoc pkg) throws IOException {
-      this.trBgcolorStyle("white", "TableRowColor");
-      this.summaryRow(0);
-      this.printHyperLink("", pkg.name(), pkg.name(), true);
-      this.summaryRowEnd();
-      this.summaryRow(0);
-      this.printSummaryComment(pkg);
-      this.space();
-      this.summaryRowEnd();
-      this.trEnd();
-   }
-
-   protected void generatePackageUseFile() throws IOException {
-      this.printPackageUseHeader();
-      if (this.usingPackageToUsedClasses.isEmpty()) {
-         this.printText("doclet.ClassUse_No.usage.of.0", this.pkgdoc.name());
-         this.p();
-      } else {
-         this.generatePackageUse();
-      }
-
-      this.printPackageUseFooter();
-   }
-
-   protected void navLinkClassUse() {
-      this.navCellRevStart();
-      this.fontStyle("NavBarFont1Rev");
-      this.boldText("doclet.navClassUse");
-      this.fontEnd();
-      this.navCellEnd();
-   }
-
-   protected void navLinkPackage() {
-      this.navCellStart();
-      this.printHyperLink("package-summary.html", "", this.getText("doclet.Package"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkTree() {
-      this.navCellStart();
-      this.printHyperLink("package-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void printClassRow(ClassDoc usedClass, PackageDoc usingPackage) {
-      String path = this.pathString(usedClass, "class-use/" + usedClass.name() + ".html");
-      this.trBgcolorStyle("white", "TableRowColor");
-      this.summaryRow(0);
-      this.bold();
-      this.printHyperLink(path, usingPackage.name(), usedClass.name(), true);
-      this.boldEnd();
-      this.println();
-      this.br();
-      this.printNbsps();
-      this.printIndexComment(usedClass);
-      this.summaryRowEnd();
-      this.trEnd();
-   }
-
-   protected void printPackageUseFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printPackageUseHeader() {
-      String packageLabel = this.getText("doclet.Package");
-      String name = this.pkgdoc.name();
-      this.printHeader(this.getText("doclet.Window_ClassUse_Header", Standard.configuration().windowtitle, packageLabel, name));
-      this.navLinks(true);
-      this.hr();
-      this.center();
-      this.h2();
-      this.boldText("doclet.ClassUse_Title", packageLabel, name);
-      this.h2End();
-      this.centerEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackageWriter.java b/xalan2jdoc/src/main/java/PackageWriter.java
deleted file mode 100644
index 8ce0ac6..0000000
--- a/xalan2jdoc/src/main/java/PackageWriter.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import com.sun.tools.doclets.SourcePath;
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-public class PackageWriter extends AbstractPackageWriter {
-   protected PackageDoc prev;
-   protected PackageDoc next;
-
-   public PackageWriter(String path, String filename, PackageDoc packagedoc, PackageDoc prev, PackageDoc next) throws IOException, DocletAbortException {
-      super(path, filename, packagedoc);
-      this.prev = prev;
-      this.next = next;
-   }
-
-   protected void copyDocFiles(String path) throws DocletAbortException {
-      SourcePath sourcePath = new SourcePath(Standard.configuration().sourcepath);
-      String docfilesdir = path + "/" + "doc-files";
-      File sourcedir = sourcePath.getDirectory(docfilesdir);
-      if (sourcedir != null) {
-         String destname = HtmlStandardWriter.destdir;
-         if (destname.length() > 0 && !destname.endsWith("/")) {
-            destname = destname + "/";
-         }
-
-         String src = sourcedir.toString();
-         String dest = destname + path + "/" + "doc-files";
-
-         try {
-            File srcdir = new File(src);
-            File destdir = new File(dest);
-            DirectoryManager.createDirectory(dest);
-            String[] files = srcdir.list();
-
-            for(int i = 0; i < files.length; ++i) {
-               File srcfile = new File(srcdir, files[i]);
-               File destfile = new File(destdir, files[i]);
-               if (srcfile.isFile()) {
-                  this.notice("doclet.Copying_File_0_To_Dir_1", srcfile.toString(), destdir.toString());
-                  Standard.copyFile(destfile, srcfile);
-               }
-            }
-         } catch (SecurityException var14) {
-            throw new DocletAbortException();
-         } catch (IOException var15) {
-            throw new DocletAbortException();
-         }
-      }
-   }
-
-   public static void generate(PackageDoc pkg, PackageDoc prev, PackageDoc next) throws DocletAbortException {
-      String path = DirectoryManager.getDirectoryPath(pkg);
-      String filename = "package-summary.html";
-
-      try {
-         PackageWriter packgen = new PackageWriter(path, filename, pkg, prev, next);
-         packgen.generatePackageFile();
-         packgen.close();
-         packgen.copyDocFiles(path);
-      } catch (IOException var7) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var7.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateClassKindListing(ClassDoc[] arr, String label) {
-      if (arr.length > 0) {
-         Arrays.sort((Object[])arr);
-         this.tableIndexSummary();
-         this.printFirstRow(label);
-
-         for(int i = 0; i < arr.length; ++i) {
-            boolean deprecated = arr[i].tags("deprecated").length > 0;
-            if ((!Standard.configuration().nodeprecated || !deprecated) && this.isCoreClass(arr[i])) {
-               this.trBgcolorStyle("white", "TableRowColor");
-               this.summaryRow(15);
-               this.bold();
-               this.printClassLinkForSameDir(arr[i]);
-               this.boldEnd();
-               this.summaryRowEnd();
-               this.summaryRow(0);
-               if (deprecated) {
-                  this.boldText("doclet.Deprecated");
-                  this.space();
-                  this.printSummaryDeprecatedComment(arr[i].tags("deprecated")[0]);
-               } else {
-                  this.printSummaryComment(arr[i]);
-               }
-
-               this.summaryRowEnd();
-               this.trEnd();
-            }
-         }
-
-         this.tableEnd();
-         this.println("&nbsp;");
-         this.p();
-      }
-   }
-
-   protected void generateClassListing() {
-      this.generateClassKindListing(super.packagedoc.interfaces(), this.getText("doclet.Interface_Summary"));
-      this.generateClassKindListing(super.packagedoc.ordinaryClasses(), this.getText("doclet.Class_Summary"));
-      this.generateClassKindListing(super.packagedoc.exceptions(), this.getText("doclet.Exception_Summary"));
-      this.generateClassKindListing(super.packagedoc.errors(), this.getText("doclet.Error_Summary"));
-   }
-
-   protected void navLinkClassUse() {
-      this.navCellStart();
-      this.printHyperLink("package-use.html", "", this.getText("doclet.navClassUse"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void navLinkNext() {
-      if (this.next == null) {
-         this.printText("doclet.Next_Package");
-      } else {
-         String path = DirectoryManager.getRelativePath(super.packagedoc.name(), this.next.name());
-         this.printHyperLink(path + "package-summary.html", "", this.getText("doclet.Next_Package"), true);
-      }
-   }
-
-   protected void navLinkPrevious() {
-      if (this.prev == null) {
-         this.printText("doclet.Prev_Package");
-      } else {
-         String path = DirectoryManager.getRelativePath(super.packagedoc.name(), this.prev.name());
-         this.printHyperLink(path + "package-summary.html", "", this.getText("doclet.Prev_Package"), true);
-      }
-   }
-
-   protected void navLinkTree() {
-      this.navCellStart();
-      this.printHyperLink("package-tree.html", "", this.getText("doclet.Tree"), true, "NavBarFont1");
-      this.navCellEnd();
-   }
-
-   protected void printFirstRow(String label) {
-      this.tableHeaderStart("#CCCCFF");
-      this.bold(label);
-      this.tableHeaderEnd();
-   }
-
-   protected void printPackageComment() {
-      if (super.packagedoc.inlineTags().length > 0) {
-         this.anchor("package_description");
-         this.h2(this.getText("doclet.Package_Description", super.packagedoc.name()));
-         this.p();
-         this.printInlineComment(super.packagedoc);
-         this.p();
-      }
-   }
-
-   protected void printPackageDescription() throws IOException {
-      this.printPackageComment();
-      this.generateTagInfo(super.packagedoc);
-   }
-
-   protected void printPackageFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-   }
-
-   protected void printPackageHeader(String heading) {
-      this.navLinks(true);
-      this.hr();
-      this.h2(this.getText("doclet.Package") + " " + heading);
-      if (super.packagedoc.inlineTags().length > 0) {
-         this.printSummaryComment(super.packagedoc);
-         this.p();
-         this.bold(this.getText("doclet.See"));
-         this.br();
-         this.printNbsps();
-         this.printHyperLink("", "package_description", this.getText("doclet.Description"), true);
-         this.p();
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/PackagesFileWriter.java b/xalan2jdoc/src/main/java/PackagesFileWriter.java
deleted file mode 100644
index 75dab45..0000000
--- a/xalan2jdoc/src/main/java/PackagesFileWriter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class PackagesFileWriter extends HtmlStandardWriter {
-   public PackagesFileWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate() throws DocletAbortException {
-      String filename = "";
-
-      try {
-         filename = "packages.html";
-         PackagesFileWriter packgen = new PackagesFileWriter(filename);
-         packgen.generatePackagesFile();
-         packgen.close();
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generatePackagesFile() {
-      this.printHeader(this.getText("doclet.Window_Packages_title", Standard.configuration().windowtitle));
-      this.printPackagesFileContents();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printPackagesFileContents() {
-      this.br();
-      this.br();
-      this.br();
-      this.center();
-      this.printText("doclet.Packages_File_line_1");
-      this.printText("doclet.Packages_File_line_2");
-      this.br();
-      this.printNbsps();
-      this.printHyperLink("index.html", this.getText("doclet.Frame_Version"));
-      this.br();
-      this.printNbsps();
-      this.printHyperLink(Standard.configuration().topFile, this.getText("doclet.Non_Frame_Version"));
-      this.centerEnd();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SerialFieldSubWriter.java b/xalan2jdoc/src/main/java/SerialFieldSubWriter.java
deleted file mode 100644
index a433c92..0000000
--- a/xalan2jdoc/src/main/java/SerialFieldSubWriter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.FieldDoc;
-import com.sun.javadoc.MemberDoc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.SerialFieldTag;
-import com.sun.javadoc.Tag;
-import java.util.Arrays;
-
-public class SerialFieldSubWriter extends FieldSubWriter {
-   ProgramElementDoc[] members = null;
-
-   SerialFieldSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      if (this.members == null) {
-         FieldDoc[] array = cd.serializableFields();
-         Arrays.sort((Object[])array);
-         this.members = this.eligibleMembers(array);
-      }
-
-      return this.members;
-   }
-
-   protected void printBodyHtmlEnd(ClassDoc cd) {
-   }
-
-   protected void printComment(ProgramElementDoc member) {
-      String fieldComment = member.commentText();
-      if (fieldComment.length() > 0) {
-         super.writer.dd();
-         this.print(fieldComment);
-      }
-
-      Tag[] tags = member.tags("serial");
-      if (tags.length > 0 && tags[0].text().length() > 0) {
-         String serialComment = tags[0].text();
-         super.writer.dd();
-         this.print(serialComment);
-      }
-   }
-
-   private void printComment(SerialFieldTag sftag) {
-      super.writer.dl();
-      super.writer.dd();
-      super.writer.print(sftag.description());
-      super.writer.dlEnd();
-   }
-
-   protected void printDeprecatedLink(ProgramElementDoc member) {
-   }
-
-   protected void printHeader(ClassDoc cd) {
-      super.writer.anchor("serializedForm");
-      this.printSerializableClassComment(cd);
-      super.writer.printTableHeadingBackground(super.writer.getText("doclet.Serialized_Form_fields"));
-   }
-
-   public void printInheritedSummaryLabel(ClassDoc cd) {
-   }
-
-   protected void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-   }
-
-   protected void printMember(ProgramElementDoc member) {
-      FieldDoc field = (FieldDoc)member;
-      ClassDoc cd = field.containingClass();
-      if (cd.definesSerializableFields()) {
-         SerialFieldTag[] tags = field.serialFieldTags();
-         Arrays.sort((Object[])tags);
-
-         for(int i = 0; i < tags.length; ++i) {
-            if (i > 0) {
-               super.writer.printMemberHeader();
-            }
-
-            this.printSignature(tags[i]);
-            this.printComment(tags[i]);
-            super.writer.printMemberFooter();
-         }
-      } else {
-         if (field.tags("serial").length == 0 && !field.isSynthetic()) {
-            Standard.configuration();
-            ConfigurationStandard.standardmessage.warning("doclet.MissingSerialTag", cd.qualifiedName(), field.name());
-         }
-
-         this.printSignature(field);
-         this.printFullComment(field);
-      }
-   }
-
-   private void printSerializableClassComment(ClassDoc cd) {
-      if (cd.definesSerializableFields()) {
-         FieldDoc serialPersistentFields = (FieldDoc)this.members(cd)[0];
-         String comment = serialPersistentFields.commentText();
-         if (comment.length() > 0) {
-            super.writer.printTableHeadingBackground(super.writer.getText("doclet.Serialized_Form_class"));
-            this.printFullComment(serialPersistentFields);
-         }
-      }
-   }
-
-   void printSignature(MemberDoc member) {
-      FieldDoc field = (FieldDoc)member;
-      this.printHead(member);
-      super.writer.pre();
-      this.printTypeLink(field.type());
-      this.print(' ');
-      this.bold(field.name());
-      super.writer.preEnd();
-   }
-
-   void printSignature(SerialFieldTag sftag) {
-      super.writer.pre();
-      ClassDoc fieldTypeDoc = sftag.fieldTypeDoc();
-      if (fieldTypeDoc != null) {
-         super.writer.printClassLink(fieldTypeDoc);
-      } else {
-         super.writer.print(sftag.fieldType());
-      }
-
-      this.print(' ');
-      this.bold(sftag.fieldName());
-      super.writer.preEnd();
-   }
-
-   public void printSummaryLabel(ClassDoc cd) {
-   }
-
-   protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
-   }
-
-   protected void printSummaryType(ProgramElementDoc member) {
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SerialMethodSubWriter.java b/xalan2jdoc/src/main/java/SerialMethodSubWriter.java
deleted file mode 100644
index 3c7938c..0000000
--- a/xalan2jdoc/src/main/java/SerialMethodSubWriter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.MethodDoc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.SeeTag;
-import com.sun.javadoc.Tag;
-
-public class SerialMethodSubWriter extends MethodSubWriter {
-   SerialMethodSubWriter(SubWriterHolderWriter writer) {
-      super(writer);
-   }
-
-   public ProgramElementDoc[] members(ClassDoc cd) {
-      return this.eligibleMembers(cd.serializationMethods());
-   }
-
-   protected void printHeader(ClassDoc cd) {
-      super.writer.anchor("serialized_methods");
-      super.writer.printTableHeadingBackground(super.writer.getText("doclet.Serialized_Form_methods"));
-      super.writer.p();
-      if (cd.isSerializable() && !cd.isExternalizable() && this.members(cd).length == 0) {
-         String msg = super.writer.getText("doclet.Serializable_no_customization");
-         super.writer.print(msg);
-         super.writer.p();
-      }
-   }
-
-   protected void printMember(ClassDoc cd, ProgramElementDoc member) {
-      ExecutableMemberDoc emd = (ExecutableMemberDoc)member;
-      String name = emd.name();
-      this.printHead(emd);
-      this.printFullComment(emd);
-   }
-
-   public void printMembers(ClassDoc cd) {
-      if (this.members(cd).length > 0) {
-         super.printMembers(cd);
-      }
-   }
-
-   protected void printSerialDataTag(Tag[] serialData) {
-      if (serialData != null && serialData.length > 0) {
-         super.writer.dt();
-         super.writer.boldText("doclet.SerialData");
-         super.writer.dd();
-
-         for(int i = 0; i < serialData.length; ++i) {
-            super.writer.print(serialData[i].text());
-         }
-      }
-   }
-
-   protected void printTags(ProgramElementDoc member) {
-      MethodDoc method = (MethodDoc)member;
-      Tag[] serialData = method.tags("serialData");
-      Tag[] sinces = method.tags("since");
-      Tag[] usages = member.tags("xsl.usage");
-      SeeTag[] sees = method.seeTags();
-      if (serialData.length + sees.length + sinces.length > 0) {
-         super.writer.dd();
-         super.writer.dl();
-         this.printSerialDataTag(serialData);
-         super.writer.printSinceTag(method);
-         super.writer.printSeeTags(method);
-         super.writer.printUsageTags(method);
-         super.writer.dlEnd();
-         super.writer.ddEnd();
-      } else if (method.name().compareTo("writeExternal") == 0) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.warning("doclet.MissingSerialDataTag", method.containingClass().qualifiedName(), method.name());
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SerializedFormWriter.java b/xalan2jdoc/src/main/java/SerializedFormWriter.java
deleted file mode 100644
index d2ec9ad..0000000
--- a/xalan2jdoc/src/main/java/SerializedFormWriter.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-import java.util.Arrays;
-
-public class SerializedFormWriter extends SubWriterHolderWriter {
-   public SerializedFormWriter(String filename) throws IOException, DocletAbortException {
-      super(filename);
-   }
-
-   public static void generate(RootDoc root) throws DocletAbortException {
-      String filename = "serialized-form.html";
-
-      try {
-         SerializedFormWriter serialgen = new SerializedFormWriter(filename);
-         serialgen.generateSerializedFormFile(root);
-         serialgen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateContents(RootDoc root) {
-      PackageDoc[] packages = Standard.configuration().packages;
-      ClassDoc[] cmdlineClasses = root.specifiedClasses();
-      boolean first = true;
-
-      for(int i = 0; i < packages.length; ++i) {
-         ClassDoc[] classes = packages[i].allClasses();
-         boolean printPackageName = true;
-         Arrays.sort((Object[])classes);
-
-         for(int j = 0; j < classes.length; ++j) {
-            ClassDoc classdoc = classes[j];
-            if (classdoc.isClass() && classdoc.isSerializable()) {
-               if (printPackageName) {
-                  this.hr(4, "noshade");
-                  this.printPackageName(packages[i].name());
-                  printPackageName = false;
-               }
-
-               first = false;
-               this.printSerialMemberInfo(classdoc);
-            }
-         }
-      }
-
-      if (cmdlineClasses.length > 0) {
-         Arrays.sort((Object[])cmdlineClasses);
-
-         for(int i = 0; i < cmdlineClasses.length; ++i) {
-            ClassDoc classdoc = cmdlineClasses[i];
-            if (classdoc.isClass() && classdoc.isSerializable()) {
-               if (!first) {
-                  this.hr(4, "noshade");
-               }
-
-               first = false;
-               this.printSerialMemberInfo(classdoc);
-            }
-         }
-      }
-   }
-
-   public void generateSerializedFormFile(RootDoc root) {
-      this.printHeader(this.getText("doclet.Serialized_Form"));
-      this.navLinks(true);
-      this.hr();
-      this.center();
-      this.h1();
-      this.printText("doclet.Serialized_Form");
-      this.h1End();
-      this.centerEnd();
-      this.generateContents(root);
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printClassName(String classstr) {
-      this.tableHeader();
-      this.tdColspan(2);
-      this.font("+2");
-      this.bold(classstr);
-      this.tableFooter();
-   }
-
-   protected void printMembers(ClassDoc cd) {
-      new SerialMethodSubWriter(this).printMembers(cd);
-      new SerialFieldSubWriter(this).printMembers(cd);
-   }
-
-   protected void printPackageName(String pkgname) {
-      this.tableHeader();
-      this.tdAlign("center");
-      this.font("+2");
-      this.boldText("doclet.Package");
-      this.print(' ');
-      this.bold(pkgname);
-      this.tableFooter();
-   }
-
-   protected void printSerialMemberInfo(ClassDoc cd) {
-      String classlink = this.getQualifiedClassLink(cd);
-      this.anchor(cd.qualifiedName());
-      this.printClassName(this.getText("doclet.Class_0_implements_serializable", classlink));
-      this.printMembers(cd);
-      this.p();
-   }
-
-   protected void tableFooter() {
-      this.fontEnd();
-      this.tdEnd();
-      this.trEnd();
-      this.tableEnd();
-      this.p();
-   }
-
-   protected void tableHeader() {
-      this.tableIndexSummary();
-      this.trBgcolorStyle("#CCCCFF", "TableSubHeadingColor");
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SingleIndexWriter.java b/xalan2jdoc/src/main/java/SingleIndexWriter.java
deleted file mode 100644
index dde878b..0000000
--- a/xalan2jdoc/src/main/java/SingleIndexWriter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DocletAbortException;
-import com.sun.tools.doclets.IndexBuilder;
-import java.io.IOException;
-
-public class SingleIndexWriter extends AbstractIndexWriter {
-   public SingleIndexWriter(String filename, IndexBuilder indexbuilder) throws IOException {
-      super(filename, indexbuilder);
-   }
-
-   public static void generate(IndexBuilder indexbuilder) throws DocletAbortException {
-      String filename = "index-all.html";
-
-      try {
-         SingleIndexWriter indexgen = new SingleIndexWriter(filename, indexbuilder);
-         indexgen.generateIndexFile();
-         indexgen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateIndexFile() throws IOException {
-      this.printHeader(this.getText("doclet.Window_Single_Index", Standard.configuration().windowtitle));
-      this.navLinks(true);
-      this.printLinksForIndexes();
-      this.hr();
-
-      for(int i = 0; i < super.indexbuilder.elements().length; ++i) {
-         Character unicode = (Character)super.indexbuilder.elements()[i];
-         this.generateContents(unicode, super.indexbuilder.getMemberList(unicode));
-      }
-
-      this.printLinksForIndexes();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printLinksForIndexes() {
-      for(int i = 0; i < super.indexbuilder.elements().length; ++i) {
-         String unicode = super.indexbuilder.elements()[i].toString();
-         this.printHyperLink("#_" + unicode + "_", unicode);
-         this.print(' ');
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SplitIndexWriter.java b/xalan2jdoc/src/main/java/SplitIndexWriter.java
deleted file mode 100644
index dd9f272..0000000
--- a/xalan2jdoc/src/main/java/SplitIndexWriter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DirectoryManager;
-import com.sun.tools.doclets.DocletAbortException;
-import com.sun.tools.doclets.IndexBuilder;
-import java.io.IOException;
-
-public class SplitIndexWriter extends AbstractIndexWriter {
-   protected int prev;
-   protected int next;
-
-   public SplitIndexWriter(String path, String filename, String relpath, IndexBuilder indexbuilder, int prev, int next) throws IOException {
-      super(path, filename, relpath, indexbuilder);
-      this.prev = prev;
-      this.next = next;
-   }
-
-   public static void generate(IndexBuilder indexbuilder) throws DocletAbortException {
-      String filename = "";
-      String path = DirectoryManager.getPath("index-files");
-      String relpath = DirectoryManager.getRelativePath("index-files");
-
-      try {
-         for(int i = 0; i < indexbuilder.elements().length; ++i) {
-            int j = i + 1;
-            int prev = j == 1 ? -1 : i;
-            int next = j == indexbuilder.elements().length ? -1 : j + 1;
-            filename = "index-" + j + ".html";
-            SplitIndexWriter indexgen = new SplitIndexWriter(path, filename, relpath, indexbuilder, prev, next);
-            indexgen.generateIndexFile((Character)indexbuilder.elements()[i]);
-            indexgen.close();
-         }
-      } catch (IOException var9) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var9.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateIndexFile(Character unicode) throws IOException {
-      this.printHeader(this.getText("doclet.Window_Split_Index", Standard.configuration().windowtitle, unicode.toString()));
-      this.navLinks(true);
-      this.printLinksForIndexes();
-      this.hr();
-      this.generateContents(unicode, super.indexbuilder.getMemberList(unicode));
-      this.navLinks(false);
-      this.printLinksForIndexes();
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void navLinkNext() {
-      if (this.next == -1) {
-         this.printText("doclet.Next_Letter");
-      } else {
-         this.printHyperLink("index-" + this.next + ".html", "", this.getText("doclet.Next_Letter"), true);
-      }
-   }
-
-   protected void navLinkPrevious() {
-      if (this.prev == -1) {
-         this.printText("doclet.Prev_Letter");
-      } else {
-         this.printHyperLink("index-" + this.prev + ".html", "", this.getText("doclet.Prev_Letter"), true);
-      }
-   }
-
-   protected void printLinksForIndexes() {
-      for(int i = 0; i < super.indexbuilder.elements().length; ++i) {
-         int j = i + 1;
-         this.printHyperLink("index-" + j + ".html", super.indexbuilder.elements()[i].toString());
-         this.print(' ');
-      }
-   }
-}
diff --git a/xalan2jdoc/src/main/java/Standard.java b/xalan2jdoc/src/main/java/Standard.java
deleted file mode 100644
index a845eab..0000000
--- a/xalan2jdoc/src/main/java/Standard.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.DocErrorReporter;
-import com.sun.javadoc.PackageDoc;
-import com.sun.javadoc.RootDoc;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DocletAbortException;
-import com.sun.tools.doclets.HtmlDocWriter;
-import com.sun.tools.doclets.IndexBuilder;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class Standard {
-   protected String classFileName(ClassDoc cd) {
-      return cd.qualifiedName() + ".html";
-   }
-
-   public static ConfigurationStandard configuration() {
-      if (HtmlDocWriter.configuration == null) {
-         HtmlDocWriter.configuration = new ConfigurationStandard();
-      }
-
-      return (ConfigurationStandard)HtmlDocWriter.configuration;
-   }
-
-   public static void copyFile(File destfile, File srcfile) throws DocletAbortException, IOException {
-      byte[] bytearr = new byte[512];
-      int len = 0;
-      FileInputStream input = new FileInputStream(srcfile);
-      FileOutputStream output = new FileOutputStream(destfile);
-
-      try {
-         while((len = input.read(bytearr)) != -1) {
-            output.write(bytearr, 0, len);
-         }
-      } catch (FileNotFoundException var11) {
-         throw new DocletAbortException();
-      } catch (SecurityException var12) {
-         throw new DocletAbortException();
-      } finally {
-         input.close();
-         output.close();
-      }
-   }
-
-   protected void generateClassCycle(ClassDoc[] arr, ClassTree classtree, boolean nopackage) throws DocletAbortException {
-      Arrays.sort((Object[])arr);
-
-      for(int i = 0; i < arr.length; ++i) {
-         if (!configuration().nodeprecated || arr[i].tags("deprecated").length <= 0) {
-            ClassDoc prev = i == 0 ? null : arr[i - 1];
-            ClassDoc curr = arr[i];
-            ClassDoc next = i + 1 == arr.length ? null : arr[i + 1];
-            ClassWriter.generate(curr, prev, next, classtree, nopackage);
-         }
-      }
-   }
-
-   protected void generateClassFiles(RootDoc root, ClassTree classtree) throws DocletAbortException {
-      ClassDoc[] classes = root.specifiedClasses();
-      List incl = new ArrayList();
-
-      for(int i = 0; i < classes.length; ++i) {
-         ClassDoc cd = classes[i];
-         if (cd.isIncluded()) {
-            incl.add(cd);
-         }
-      }
-
-      ClassDoc[] inclClasses = new ClassDoc[incl.size()];
-
-      for(int i = 0; i < inclClasses.length; ++i) {
-         inclClasses[i] = (ClassDoc)incl.get(i);
-      }
-
-      this.generateClassCycle(inclClasses, classtree, true);
-      PackageDoc[] packages = configuration().packages;
-
-      for(int i = 0; i < packages.length; ++i) {
-         PackageDoc pkg = packages[i];
-         this.generateClassCycle(pkg.interfaces(), classtree, false);
-         this.generateClassCycle(pkg.ordinaryClasses(), classtree, false);
-         this.generateClassCycle(pkg.exceptions(), classtree, false);
-         this.generateClassCycle(pkg.errors(), classtree, false);
-      }
-   }
-
-   public static int optionLength(String option) {
-      return configuration().optionLength(option);
-   }
-
-   protected void performCopy(String configdestdir, String filename) throws DocletAbortException {
-      try {
-         String destdir = configdestdir.length() > 0 ? configdestdir + File.separatorChar : "";
-         if (filename.length() > 0) {
-            File helpstylefile = new File(filename);
-            String parent = helpstylefile.getParent();
-            String helpstylefilename = parent == null ? filename : filename.substring(parent.length() + 1);
-            File desthelpfile = new File(destdir + helpstylefilename);
-            if (!desthelpfile.getCanonicalPath().equals(helpstylefile.getCanonicalPath())) {
-               configuration();
-               ConfigurationStandard.standardmessage.notice("doclet.Copying_File_0_To_File_1", helpstylefile.toString(), desthelpfile.toString());
-               copyFile(desthelpfile, helpstylefile);
-            }
-         }
-      } catch (IOException var8) {
-         configuration();
-         ConfigurationStandard.standardmessage.error("doclet.perform_copy_exception_encountered", var8.toString());
-         throw new DocletAbortException();
-      }
-   }
-
-   public static boolean start(RootDoc root) throws IOException {
-      try {
-         configuration().setOptions(root);
-         new Standard().startGeneration(root);
-         return true;
-      } catch (DocletAbortException var2) {
-         var2.printStackTrace();
-         return false;
-      }
-   }
-
-   protected void startGeneration(RootDoc root) throws DocletAbortException {
-      if (root.classes().length == 0) {
-         configuration();
-         ConfigurationStandard.standardmessage.notice("doclet.No_Public_Classes_To_Document");
-      } else {
-         String configdestdir = configuration().destdirname;
-         String confighelpfile = configuration().helpfile;
-         String configstylefile = configuration().stylesheetfile;
-         boolean nodeprecated = configuration().nodeprecated;
-         this.performCopy(configdestdir, confighelpfile);
-         this.performCopy(configdestdir, configstylefile);
-         ClassTree classtree = new ClassTree(root, nodeprecated);
-         if (configuration().classuse) {
-            ClassUseMapper.generate(root, classtree);
-         }
-
-         IndexBuilder indexbuilder = new IndexBuilder(root, nodeprecated);
-         PackageDoc[] packages = configuration().packages;
-         if (configuration().createtree) {
-            TreeWriter.generate(classtree);
-         }
-
-         if (configuration().createindex) {
-            if (configuration().splitindex) {
-               SplitIndexWriter.generate(indexbuilder);
-            } else {
-               SingleIndexWriter.generate(indexbuilder);
-            }
-         }
-
-         if (!configuration().nodeprecatedlist && !nodeprecated) {
-            DeprecatedListWriter.generate(root);
-         }
-
-         AllClassesFrameWriter.generate(new IndexBuilder(root, nodeprecated, true));
-         FrameOutputWriter.generate();
-         PackagesFileWriter.generate();
-         if (configuration().createoverview) {
-            PackageIndexWriter.generate(root);
-         }
-
-         if (packages.length > 1) {
-            PackageIndexFrameWriter.generate();
-         }
-
-         for(int i = 0; i < packages.length; ++i) {
-            PackageDoc prev = i == 0 ? null : packages[i - 1];
-            PackageDoc packagedoc = packages[i];
-            PackageDoc next = i + 1 == packages.length ? null : packages[i + 1];
-            PackageWriter.generate(packages[i], prev, next);
-            PackageTreeWriter.generate(packages[i], prev, next, nodeprecated);
-            PackageFrameWriter.generate(packages[i]);
-         }
-
-         this.generateClassFiles(root, classtree);
-         SerializedFormWriter.generate(root);
-         PackageListWriter.generate(root);
-         HelpWriter.generate();
-         StylesheetWriter.generate();
-      }
-   }
-
-   public static boolean validOptions(String[][] options, DocErrorReporter reporter) throws IOException {
-      return configuration().validOptions(options, reporter);
-   }
-}
diff --git a/xalan2jdoc/src/main/java/StylesheetWriter.java b/xalan2jdoc/src/main/java/StylesheetWriter.java
deleted file mode 100644
index 543528a..0000000
--- a/xalan2jdoc/src/main/java/StylesheetWriter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package xalanjdoc;
-
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class StylesheetWriter extends HtmlStandardWriter {
-   public StylesheetWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public static void generate() throws DocletAbortException {
-      String filename = "";
-
-      try {
-         if (Standard.configuration().stylesheetfile.length() == 0) {
-            filename = "stylesheet.css";
-            StylesheetWriter stylegen = new StylesheetWriter(filename);
-            stylegen.generateStyleFile();
-            stylegen.close();
-         }
-      } catch (IOException var3) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var3.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   protected void generateStyleFile() {
-      this.print("/* ");
-      this.printText("doclet.Style_line_1");
-      this.println(" */");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_2");
-      this.println(" */");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_3");
-      this.println(" */");
-      this.println("body { background-color: #FFFFFF }");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_4");
-      this.println(" */");
-      this.print("#TableHeadingColor     { background: #CCCCFF }");
-      this.print(" /* ");
-      this.printText("doclet.Style_line_5");
-      this.println(" */");
-      this.print("#TableSubHeadingColor  { background: #EEEEFF }");
-      this.print(" /* ");
-      this.printText("doclet.Style_line_6");
-      this.println(" */");
-      this.print("#TableRowColor         { background: #FFFFFF }");
-      this.print(" /* ");
-      this.printText("doclet.Style_line_7");
-      this.println(" */");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_8");
-      this.println(" */");
-      this.println("#FrameTitleFont   { font-size: normal; font-family: normal }");
-      this.println("#FrameHeadingFont { font-size: normal; font-family: normal }");
-      this.println("#FrameItemFont    { font-size: normal; font-family: normal }");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_9");
-      this.println(" */");
-      this.print("/* ");
-      this.print("#FrameItemFont  { font-size: 10pt; font-family: ");
-      this.print("Helvetica, Arial, sans-serif }");
-      this.println(" */");
-      this.println("");
-      this.print("/* ");
-      this.printText("doclet.Style_line_10");
-      this.println(" */");
-      this.print("#NavBarCell1    { background-color:#EEEEFF;}");
-      this.print("/* ");
-      this.printText("doclet.Style_line_6");
-      this.println(" */");
-      this.print("#NavBarCell1Rev { background-color:#00008B;}");
-      this.print("/* ");
-      this.printText("doclet.Style_line_11");
-      this.println(" */");
-      this.print("#NavBarFont1    { font-family: Arial, Helvetica, sans-serif; ");
-      this.println("color:#000000;}");
-      this.print("#NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; ");
-      this.println("color:#FFFFFF;}");
-      this.println("");
-      this.print("#NavBarCell2    { font-family: Arial, Helvetica, sans-serif; ");
-      this.println("background-color:#FFFFFF;}");
-      this.print("#NavBarCell3    { font-family: Arial, Helvetica, sans-serif; ");
-      this.println("background-color:#FFFFFF;}");
-      this.println("");
-   }
-}
diff --git a/xalan2jdoc/src/main/java/SubWriterHolderWriter.java b/xalan2jdoc/src/main/java/SubWriterHolderWriter.java
deleted file mode 100644
index aa0b8e8..0000000
--- a/xalan2jdoc/src/main/java/SubWriterHolderWriter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.Doc;
-import com.sun.javadoc.ProgramElementDoc;
-import com.sun.javadoc.Tag;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public abstract class SubWriterHolderWriter extends HtmlStandardWriter {
-   public SubWriterHolderWriter(String filename) throws IOException {
-      super(filename);
-   }
-
-   public SubWriterHolderWriter(String path, String filename, String relpath) throws IOException, DocletAbortException {
-      super(path, filename, relpath);
-   }
-
-   protected void printCommentDef(Doc member) {
-      this.printNbsps();
-      this.printIndexComment(member);
-   }
-
-   protected void printIndexComment(Doc member) {
-      Tag[] deprs = member.tags("deprecated");
-      boolean deprecated = false;
-      if (deprs.length > 0) {
-         this.boldText("doclet.Deprecated");
-         this.space();
-         this.printInlineDeprecatedComment(deprs[0]);
-      } else {
-         ClassDoc cd = ((ProgramElementDoc)member).containingClass();
-         if (cd != null && cd.tags("deprecated").length > 0) {
-            this.boldText("doclet.Deprecated");
-            this.space();
-         }
-
-         this.printSummaryComment(member);
-      }
-   }
-
-   public void printInheritedSummaryFooter(AbstractSubWriter mw, ClassDoc cd) {
-      this.codeEnd();
-      this.summaryRowEnd();
-      this.trEnd();
-      this.tableEnd();
-      this.space();
-   }
-
-   public void printInheritedSummaryHeader(AbstractSubWriter mw, ClassDoc cd) {
-      mw.printInheritedSummaryAnchor(cd);
-      this.tableIndexSummary();
-      this.tableInheritedHeaderStart("#EEEEFF");
-      mw.printInheritedSummaryLabel(cd);
-      this.tableInheritedHeaderEnd();
-      this.trBgcolorStyle("white", "TableRowColor");
-      this.summaryRow(0);
-      this.code();
-   }
-
-   public void printInheritedSummaryMember(AbstractSubWriter mw, ClassDoc cd, ProgramElementDoc member) {
-      mw.printInheritedSummaryLink(cd, member);
-   }
-
-   public void printMemberFooter() {
-   }
-
-   public void printMemberHeader() {
-      this.hr();
-   }
-
-   public void printSummaryFooter(AbstractSubWriter mw, ClassDoc cd) {
-      this.tableEnd();
-      this.space();
-   }
-
-   public void printSummaryHeader(AbstractSubWriter mw, ClassDoc cd) {
-      mw.printSummaryAnchor(cd);
-      this.tableIndexSummary();
-      this.tableHeaderStart("#CCCCFF");
-      mw.printSummaryLabel(cd);
-      this.tableHeaderEnd();
-   }
-
-   public void printSummaryMember(AbstractSubWriter mw, ClassDoc cd, ProgramElementDoc member) {
-      this.trBgcolorStyle("white", "TableRowColor");
-      mw.printSummaryType(member);
-      this.summaryRow(0);
-      this.code();
-      mw.printSummaryLink(cd, member);
-      this.codeEnd();
-      this.println();
-      this.br();
-      this.printCommentDef(member);
-      this.summaryRowEnd();
-      this.trEnd();
-   }
-
-   public void printTableHeadingBackground(String str) {
-      this.tableIndexDetail();
-      this.tableHeaderStart("#CCCCFF", 1);
-      this.bold(str);
-      this.tableHeaderEnd();
-      this.tableEnd();
-   }
-
-   public void printTypeSummaryFooter() {
-      this.codeEnd();
-      this.fontEnd();
-      this.tdEnd();
-   }
-
-   public void printTypeSummaryHeader() {
-      this.tdIndex();
-      this.font("-1");
-      this.code();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/TreeWriter.java b/xalan2jdoc/src/main/java/TreeWriter.java
deleted file mode 100644
index d932a62..0000000
--- a/xalan2jdoc/src/main/java/TreeWriter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.PackageDoc;
-import com.sun.tools.doclets.ClassTree;
-import com.sun.tools.doclets.DocletAbortException;
-import java.io.IOException;
-
-public class TreeWriter extends AbstractTreeWriter {
-   private PackageDoc[] packages;
-   private boolean classesonly;
-
-   public TreeWriter(String filename, ClassTree classtree) throws IOException, DocletAbortException {
-      super(filename, classtree);
-      this.packages = Standard.configuration().packages;
-      this.classesonly = this.packages.length == 0;
-   }
-
-   public static void generate(ClassTree classtree) throws DocletAbortException {
-      String filename = "overview-tree.html";
-
-      try {
-         TreeWriter treegen = new TreeWriter(filename, classtree);
-         treegen.generateTreeFile();
-         treegen.close();
-      } catch (IOException var4) {
-         Standard.configuration();
-         ConfigurationStandard.standardmessage.error("doclet.exception_encountered", var4.toString(), filename);
-         throw new DocletAbortException();
-      }
-   }
-
-   public void generateTreeFile() throws IOException {
-      this.printHeader(this.getText("doclet.Window_Class_Hierarchy", Standard.configuration().windowtitle));
-      this.printTreeHeader();
-      this.printPageHeading();
-      this.printPackageTreeLinks();
-      this.generateTree(super.classtree.baseclasses(), "doclet.Class_Hierarchy");
-      this.generateTree(super.classtree.baseinterfaces(), "doclet.Interface_Hierarchy");
-      this.printTreeFooter();
-   }
-
-   protected void printPackageTreeLinks() {
-      if (!this.classesonly) {
-         this.dl();
-         this.dt();
-         this.boldText("doclet.Package_Hierarchies");
-         this.dd();
-
-         for(int i = 0; i < this.packages.length; ++i) {
-            String filename = this.pathString(this.packages[i], "package-tree.html");
-            this.printHyperLink(filename, "", this.packages[i].name());
-            if (i < this.packages.length - 1) {
-               this.print(", ");
-            }
-         }
-
-         this.dlEnd();
-         this.hr();
-      }
-   }
-
-   protected void printPageHeading() {
-      this.center();
-      this.h2();
-      this.printText("doclet.Hierarchy_For_All_Packages");
-      this.h2End();
-      this.centerEnd();
-   }
-
-   protected void printTreeFooter() {
-      this.hr();
-      this.navLinks(false);
-      this.printBottom();
-      this.printBodyHtmlEnd();
-   }
-
-   protected void printTreeHeader() {
-      this.navLinks(true);
-      this.hr();
-   }
-}
diff --git a/xalan2jdoc/src/main/java/Usage.java b/xalan2jdoc/src/main/java/Usage.java
deleted file mode 100644
index b9b4f0f..0000000
--- a/xalan2jdoc/src/main/java/Usage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.Doc;
-import java.util.StringTokenizer;
-
-public class Usage {
-   public static final int UNSPECIFIED = 0;
-   public static final int GENERAL = 1;
-   public static final int ADVANCED = 2;
-   public static final int INTERNAL = 3;
-   public static final int EXPERIMENTAL = 4;
-
-   static int findUsage(Doc doc) {
-      String token0 = "meta";
-      String token1 = "name";
-      String token2 = "\"usage\"";
-      String token3 = "content";
-      String adv = "\"advanced\"";
-      String intern = "\"internal\"";
-      String experiment = "\"experimental\"";
-      String commentAll = doc.commentText().toLowerCase();
-      String comment;
-      if (commentAll.length() > 50) {
-         comment = commentAll.substring(0, 50);
-      } else {
-         comment = commentAll;
-      }
-
-      StringTokenizer tokens = new StringTokenizer(comment, " \n\t\r<>=/");
-      if (tokens.countTokens() < 5) {
-         return 0;
-      } else if (token0.equals(tokens.nextToken())
-         && token1.equals(tokens.nextToken())
-         && token2.equals(tokens.nextToken())
-         && token3.equals(tokens.nextToken())) {
-         String token4 = tokens.nextToken();
-         if (token4.equals(adv)) {
-            return 2;
-         } else if (token4.equals(intern)) {
-            return 3;
-         } else {
-            return token4.equals(experiment) ? 4 : 1;
-         }
-      } else {
-         return 0;
-      }
-   }
-
-   public static int usagePattern(Doc doc) {
-      return findUsage(doc);
-   }
-}
diff --git a/xalan2jdoc/src/main/java/XSLUsage.java b/xalan2jdoc/src/main/java/XSLUsage.java
deleted file mode 100644
index 0691d8b..0000000
--- a/xalan2jdoc/src/main/java/XSLUsage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package xalanjdoc;
-
-import com.sun.javadoc.Tag;
-
-public class XSLUsage {
-   public static final String TAG = "xsl.usage";
-   private static final int INTERNAL = 0;
-   private static final int ADVANCED = 1;
-   private static final int EXPERIMENTAL = 2;
-   private static final int UNSPECIFIED = -1;
-   private static final String[] names = new String[]{"internal", "advanced", "experimental"};
-   private static final String[] colours = new String[]{"FF0000", "00FF00", "0000FF"};
-   private static final String[] messages = new String[]{"**For internal use only**", "**For advanced use only**", "**Experimental**"};
-
-   public static String getHTML(Tag usageTag) {
-      int key = getKey(usageTag);
-      return key == -1 ? "" : "<i><font size=\"-1\" color=\"#" + colours[key] + "\"> " + messages[key] + "</font></i></DD>\n";
-   }
-
-   private static int getKey(Tag usageTag) {
-      for(int i = 0; i < names.length; ++i) {
-         if (names[i].equals(usageTag.text())) {
-            return i;
-         }
-      }
-
-      return -1;
-   }
-}
diff --git a/xalan2jdoc/src/main/java/resources/standard.properties b/xalan2jdoc/src/main/java/resources/standard.properties
deleted file mode 100644
index b1a9c14..0000000
--- a/xalan2jdoc/src/main/java/resources/standard.properties
+++ /dev/null
@@ -1,261 +0,0 @@
-#
-# @(#)standard.properties	1.35 98/08/27
-#
-doclet.exception_encountered= {0} encountered \n\
-\twhile attempting to create file: {1}
-doclet.perform_copy_exception_encountered= {0} encountered while \n\
-performing copy.
-doclet.Contents=Contents
-doclet.Overview=Overview
-doclet.Window_Overview={0}: Overview
-doclet.Package=Package
-doclet.Window_Package={0}: Package {1}
-doclet.Window_ClassFile_label={0}: {1}
-doclet.Window_Packages_title={0}
-doclet.All_Packages=All Packages
-doclet.Tree=Tree
-doclet.Class_Hierarchy=Class Hierarchy
-doclet.Window_Class_Hierarchy={0}: Class Hierarchy
-doclet.Window_Package_Class_Hierarchy={0}: {1} Class Hierarchy
-doclet.Interface_Hierarchy=Interface Hierarchy
-doclet.Prev=PREV
-doclet.Next=NEXT
-doclet.Prev_Class=PREV CLASS
-doclet.Next_Class=NEXT CLASS
-doclet.Prev_Package=PREV PACKAGE
-doclet.Next_Package=NEXT PACKAGE
-doclet.Prev_Letter=PREV LETTER
-doclet.Next_Letter=NEXT LETTER
-doclet.Show_Lists=SHOW LISTS
-doclet.Hide_Lists=HIDE LISTS
-doclet.Summary=SUMMARY: 
-doclet.Detail=DETAIL: 
-doclet.navInner=INNER
-doclet.navField=FIELD
-doclet.navConstructor=CONSTR
-doclet.navMethod=METHOD
-doclet.Index=Index
-doclet.Window_Single_Index={0}: Index
-doclet.Window_Split_Index={0}: {1}-Index
-doclet.Help=Help
-doclet.Interface=Interface
-doclet.Class=Class
-doclet.interface=interface
-doclet.class=class
-doclet.error=error
-doclet.exception=exception
-doclet.extends=extends
-doclet.Package_private=(package private)
-doclet.implements=implements
-doclet.Since=Since: 
-doclet.Version=Version: 
-doclet.Author=Author: 
-doclet.See_Also=See Also: 
-doclet.See=See: 
-doclet.File_not_found=File not found: {0}
-doclet.Package_Summary=Package Summary
-doclet.Interface_Summary=Interface Summary
-doclet.Exception_Summary=Exception Summary
-doclet.Error_Summary=Error Summary
-doclet.Class_Summary=Class Summary
-doclet.Inner_Class_Summary=Inner Class Summary
-doclet.Field_Summary=Field Summary
-doclet.Constructor_Summary=Constructor Summary
-doclet.Method_Summary=Method Summary
-doclet.Option_conflict=Option {0} conflicts with {1} 
-doclet.Option_reuse=Option reused: {0}
-doclet.MissingSerialTag=in class {0}, missing @serial tag for default serializable field: {1}.
-doclet.MissingSerialDataTag=in class {0}, missing @serialData tag in method {1}.
-doclet.Interfaces=Interfaces
-doclet.Exceptions=Exceptions
-doclet.Errors=Errors
-doclet.Classes=Classes
-doclet.Packages=Packages
-doclet.All_Classes=All Classes
-doclet.Members=Members
-doclet.None=None
-doclet.CLASSES=CLASSES
-doclet.MEMBERS=MEMBERS
-doclet.NONE=NONE
-doclet.Inner_Classes_Inherited_From_Class=Inner classes inherited from class {0}
-doclet.Methods_Inherited_From_Class=Methods inherited from class {0}
-doclet.Methods_Inherited_From_Interface=Methods inherited from interface {0}
-doclet.Fields_Inherited_From_Class=Fields inherited from class {0}
-doclet.Serializable=Serializable
-doclet.Externalizable=Externalizable
-doclet.Class_0_implements_serializable=Class {0} implements Serializable
-doclet.Serialized_Form=Serialized Form
-doclet.Serialized_Form_methods=Serialization Methods
-doclet.Serialized_Form_fields=Serialized Fields
-doclet.Serialized_Form_class=Serialization Overview
-doclet.Serializable_no_customization=No readObject or writeObject method declared.
-doclet.Field_Detail=Field Detail
-doclet.Method_Detail=Method Detail
-doclet.Constructor_Detail=Constructor Detail
-doclet.Deprecated=Deprecated.
-doclet.Deprecated_class=This class is deprecated.
-doclet.navDeprecated=Deprecated
-doclet.Deprecated_List=Deprecated List
-doclet.Window_Deprecated_List={0}: Deprecated List
-doclet.Note_0_is_deprecated=Note: {0} is deprecated.
-doclet.Parameters=Parameters:
-doclet.Returns=Returns:
-doclet.SerialData=Serial Data:
-doclet.Throws=Throws:
-doclet.Overrides=Overrides:
-doclet.in_class={0} in class {1}
-doclet.Generating_0=Generating {0}...
-doclet.0_Fields_and_Methods=&quot;{0}&quot; Fields and Methods
-doclet.Index_of_Fields_and_Methods=Index of Fields and Methods
-doclet.Static_variable_in=Static variable in {0}
-doclet.Variable_in=Variable in {0}
-doclet.Constructor_for=Constructor for {0}
-doclet.Static_method_in=Static method in {0}
-doclet.Method_in=Method in {0}
-doclet.throws=throws
-doclet.package=package
-doclet.destination_directory_not_found_0=destination directory not found: {0} 
-doclet.MalformedURL=Malformed URL: {0}
-doclet.File_error=Error reading file: {0}
-doclet.URL_error=Error fetching URL: {0}
-doclet.Method_Summary=Method Summary
-doclet.No_Package_Comment_File=For Package {0} Package.Comment file not found
-doclet.No_Source_For_Class=Source information for class {0} not available.
-doclet.see.class_or_package_not_found=Class or Package not found, in @see tag: {0}
-doclet.see.malformed_tag=Malformed See Tag: {0}
-doclet.Inherited_API_Summary=Inherited API Summary
-doclet.Deprecated_API=Deprecated API
-doclet.Deprecated_Classes=Deprecated Classes
-doclet.Deprecated_Interfaces=Deprecated Interfaces
-doclet.Deprecated_Exceptions=Deprecated Exceptions
-doclet.Deprecated_Errors=Deprecated Errors
-doclet.Deprecated_Fields=Deprecated Fields
-doclet.Deprecated_Constructors=Deprecated Constructors
-doclet.Deprecated_Methods=Deprecated Methods
-doclet.Frame_Output=Frame Output
-doclet.Docs_generated_by_Javadoc=Documentation generated by Javadoc.
-doclet.Generated_Docs_Untitled=Generated Documentation (Untitled)
-doclet.Blank=Blank
-doclet.Other_Packages=Other Packages
-doclet.Package_Description=Package {0} Description
-doclet.Description=Description
-doclet.Specified_By=Specified by: 
-doclet.in_interface={0} in interface {1}
-doclet.Subclasses=Direct Known Subclasses:
-doclet.Subinterfaces=All Known Subinterfaces:
-doclet.Implementing_Classes=All Known Implementing Classes:
-doclet.also=also
-doclet.Option=Option
-doclet.Or=Or
-doclet.Frames=Frames
-doclet.FRAMES=FRAMES
-doclet.NO_FRAMES=NO FRAMES
-doclet.Package_Hierarchies=Package Hierarchies: 
-doclet.Hierarchy_For_Package=Hierarchy For Package {0}
-doclet.Source_Code=Source Code:
-doclet.Help=Help
-doclet.Hierarchy_For_All_Packages=Hierarchy For All Packages
-doclet.Cannot_handle_no_packages=Cannot handle no packages.
-doclet.Frame_Alert=Frame Alert
-doclet.Overview-Member-Frame=Overview Member Frame
-doclet.Frame_Warning_Message=This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-doclet.Non_Frame_Version=Non-frame version.
-doclet.Frame_Version=Frame version
-doclet.Link_To=Link to 
-doclet.Description_From_Interface=Description from interface: 
-doclet.Description_From_Class=Description from class: 
-doclet.Copying_File_0_To_Dir_1=Copying file {0} to directory {1}...
-doclet.Copying_File_0_To_File_1=Copying file {0} to file {1}...
-doclet.Standard_doclet_invoked=Standard doclet invoked...
-doclet.No_Public_Classes_To_Document=No public or protected classes found to document.
-doclet.Interfaces_Italic=Interfaces (italic)
-doclet.Help_title=API Help
-doclet.Window_Help_title={0}: API Help
-doclet.Help_line_1=How This API Document Is Organized
-doclet.Help_line_2=This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-doclet.Help_line_3=The {0} page is the front page of this API document and provides a list of all packages with a summary for each.  This page can also contain an overall description of the set of packages.
-doclet.Help_line_4=Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:
-doclet.Help_line_5=Class/Interface
-doclet.Help_line_6=Each class, interface, inner class and inner interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:
-doclet.Help_line_7=Class inheritance diagram
-doclet.Help_line_8=Direct Subclasses
-doclet.Help_line_9=All Known Subinterfaces
-doclet.Help_line_10=All Known Implementing Classes
-doclet.Help_line_11=Class/interface declaration
-doclet.Help_line_12=Class/interface description
-doclet.Help_line_13=Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
-doclet.Help_line_14=Use
-doclet.Help_line_15=Each documented package, class and interface has its own Use page.  This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A.  You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-doclet.Help_line_16=Tree (Class Hierarchy)
-doclet.Help_line_17_with_tree_link=There is a {0} page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.
-doclet.Help_line_18=When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
-doclet.Help_line_19=When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-doclet.Help_line_20_with_deprecated_api_link=The {0} page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-doclet.Help_line_21=Index
-doclet.Help_line_22=The {0} contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-doclet.Help_line_23=Prev/Next
-doclet.Help_line_24=These links take you to the next or previous class, interface, package, or related page.
-doclet.Help_line_25=Frames/No Frames
-doclet.Help_line_26=These links show and hide the HTML frames.  All pages are available with or without frames.
-doclet.Help_line_27=Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
-doclet.Help_line_28=This help file applies to API documentation generated using the standard doclet. 
-doclet.The=The
-doclet.Style_line_1=Javadoc style sheet
-doclet.Style_line_2=Define colors, fonts and other style attributes here to override the defaults 
-doclet.Style_line_3=Page background color
-doclet.Style_line_4=Table colors
-doclet.Style_line_5=Dark mauve
-doclet.Style_line_6=Light mauve
-doclet.Style_line_7=White
-doclet.Style_line_8=Font used in left-hand frame lists
-doclet.Style_line_9=Example of smaller, sans-serif font in frames
-doclet.Style_line_10=Navigation bar fonts and colors
-doclet.Style_line_11=Dark Blue
-doclet.ClassUse_Packages.that.use.0=Packages that use {0}
-doclet.ClassUse_Uses.of.0.in.1=Uses of {0} in {1}
-doclet.ClassUse_Classes.in.0.used.by.1=Classes in {0} used by {1}
-doclet.ClassUse_Subclass=Subclasses of {0} in {1}
-doclet.ClassUse_Subinterface=Subinterfaces of {0} in {1}
-doclet.ClassUse_ImplementingClass=Classes in {1} that implement {0}
-doclet.ClassUse_Field=Fields in {1} declared as {0}
-doclet.ClassUse_MethodReturn=Methods in {1} that return {0}
-doclet.ClassUse_MethodArgs=Methods in {1} with parameters of type {0}
-doclet.ClassUse_MethodThrows=Methods in {1} that throw {0}
-doclet.ClassUse_ConstructorArgs=Constructors in {1} with parameters of type {0}
-doclet.ClassUse_ConstructorThrows=Constructors in {1} that throw {0}
-doclet.ClassUse_No.usage.of.0=No usage of {0}
-doclet.Window_ClassUse_Header={0}: Uses of {1} {2}
-doclet.ClassUse_Title=Uses of {0}<br>{1}
-doclet.navClassUse=Use
-doclet.link_option_twice=Extern URL link option(link or linkoffline) used twice.
-doclet.Error_in_packagelist=Error in using -group option: {0} {1} 
-doclet.Groupname_already_used=In -group option, groupname already used: {0}
-doclet.Same_package_name_used=Package name format used twice: {0}
-doclet.Packages_File_line_1=The front page has been renamed.
-doclet.Packages_File_line_2=Please see:
-doclet.usage=Provided by Standard doclet:\n\
-  -d <directory>            Destination directory for output files\n\
-  -use                      Create class and package usage pages\n\
-  -version                  Include @version paragraphs\n\
-  -author                   Include @author paragraphs\n\
-  -splitindex               Split index into one file per letter\n\
-  -windowtitle <text>       Browser window title for the documenation\n\
-  -doctitle <html-code>     Include title for the package index(first) page\n\
-  -header <html-code>       Include header text for each page\n\
-  -footer <html-code>       Include footer text for each page\n\
-  -bottom <html-code>       Include bottom text for each page\n\
-  -link <url>               Create links to javadoc output at <url>\n\
-  -linkoffline <url> <url2> Link to docs at <url> using package list at <url2>\n\
-  -group <name> <p1>:<p2>.. Group specified packages together in overview page\n\
-  -nodeprecated             Do not include @deprecated information\n\
-  -nodeprecatedlist         Do not generate deprecated list\n\
-  -notree                   Do not generate class hierarchy\n\
-  -noindex                  Do not generate index\n\
-  -nohelp                   Do not generate help link\n\
-  -nonavbar                 Do not generate navigation bar\n\
-  -helpfile <file>          Include file that help link links to\n\
-  -stylesheetfile <path>    File to change style of the generated documentation\n\
-  -docencoding <name>       Output encoding name
-doclet.xusage=Special  options:\n\
-  -Xnodate                  Do not include generation date in output
-doclet.xsl.usage.header=Usage:
diff --git a/xalan2jdoc/src/main/java/resources/standard_ja.properties b/xalan2jdoc/src/main/java/resources/standard_ja.properties
deleted file mode 100644
index 07a76bf..0000000
--- a/xalan2jdoc/src/main/java/resources/standard_ja.properties
+++ /dev/null
@@ -1,261 +0,0 @@
-#
-# @(#)standard_ja.properties	1.35 98/08/27
-#
-doclet.exception_encountered= \u30d5\u30a1\u30a4\u30eb {1} \u306e\u751f\u6210\u4e2d\u306b\n\
-\t{0} \u304c\u767a\u751f\u3057\u307e\u3057\u305f
-doclet.perform_copy_exception_encountered= \u30b3\u30d4\u30fc\u306e\u5b9f\u884c\u4e2d\u306b\n\
-{0} \u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-doclet.Contents=\u30b3\u30f3\u30c6\u30f3\u30c4
-doclet.Overview=\u6982\u8981
-doclet.Window_Overview={0}: \u6982\u8981
-doclet.Package=\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.Window_Package={0}: \u30d1\u30c3\u30b1\u30fc\u30b8 {1}
-doclet.Window_ClassFile_label={0}: {1}
-doclet.Window_Packages_title={0}
-doclet.All_Packages=\u3059\u3079\u3066\u306e\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.Tree=\u968e\u5c64\u30c4\u30ea\u30fc
-doclet.Class_Hierarchy=\u30af\u30e9\u30b9\u968e\u5c64
-doclet.Window_Class_Hierarchy={0}: \u30af\u30e9\u30b9\u968e\u5c64
-doclet.Window_Package_Class_Hierarchy={0}: {1} \u30af\u30e9\u30b9\u968e\u5c64
-doclet.Interface_Hierarchy=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u968e\u5c64
-doclet.Prev=\u524d
-doclet.Next=\u6b21
-doclet.Prev_Class=\u524d\u306e\u30af\u30e9\u30b9
-doclet.Next_Class=\u6b21\u306e\u30af\u30e9\u30b9
-doclet.Prev_Package=\u524d\u306e\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.Next_Package=\u6b21\u306e\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.Prev_Letter=\u524d\u306e\u6587\u5b57
-doclet.Next_Letter=\u6b21\u306e\u6587\u5b57
-doclet.Show_Lists=\u30ea\u30b9\u30c8\u306e\u8868\u793a
-doclet.Hide_Lists=\u30ea\u30b9\u30c8\u306e\u975e\u8868\u793a
-doclet.Summary=\u6982\u8981: 
-doclet.Detail=\u8a73\u7d30: 
-doclet.navInner=\u5185\u90e8\u30af\u30e9\u30b9
-doclet.navField=\u30d5\u30a3\u30fc\u30eb\u30c9
-doclet.navConstructor=\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf
-doclet.navMethod=\u30e1\u30bd\u30c3\u30c9
-doclet.Index=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-doclet.Window_Single_Index={0}: \u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-doclet.Window_Split_Index={0}: {1}-\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-doclet.Help=\u30d8\u30eb\u30d7
-doclet.Interface=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.Class=\u30af\u30e9\u30b9
-doclet.interface=interface
-doclet.class=class
-doclet.error=\u30a8\u30e9\u30fc
-doclet.exception=\u4f8b\u5916
-doclet.extends=extends
-doclet.Package_private=(\u30d1\u30c3\u30b1\u30fc\u30b8\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8)
-doclet.implements=implements
-doclet.Since=\u5c0e\u5165\u3055\u308c\u305f\u30d0\u30fc\u30b8\u30e7\u30f3: 
-doclet.Version=\u30d0\u30fc\u30b8\u30e7\u30f3: 
-doclet.Author=\u4f5c\u6210\u8005: 
-doclet.See_Also=\u95a2\u9023\u9805\u76ee: 
-doclet.See=\u53c2\u7167: 
-doclet.File_not_found=\u30d5\u30a1\u30a4\u30eb {0} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-doclet.Package_Summary=\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u6982\u8981
-doclet.Interface_Summary=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u6982\u8981
-doclet.Exception_Summary=\u4f8b\u5916\u306e\u6982\u8981
-doclet.Error_Summary=\u30a8\u30e9\u30fc\u306e\u6982\u8981
-doclet.Class_Summary=\u30af\u30e9\u30b9\u306e\u6982\u8981
-doclet.Inner_Class_Summary=\u5185\u90e8\u30af\u30e9\u30b9\u306e\u6982\u8981
-doclet.Field_Summary=\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u6982\u8981
-doclet.Constructor_Summary=\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u306e\u6982\u8981
-doclet.Method_Summary=\u30e1\u30bd\u30c3\u30c9\u306e\u6982\u8981
-doclet.Option_conflict=\u30aa\u30d7\u30b7\u30e7\u30f3 {0} \u304c {1} \u3068\u7af6\u5408\u3057\u307e\u3059\u3002
-doclet.Option_reuse=\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u518d\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059: {0}
-doclet.MissingSerialTag=\u30af\u30e9\u30b9 {0} \u3067\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u76f4\u5217\u5316\u53ef\u80fd\u30d5\u30a3\u30fc\u30eb\u30c9 {1} \u306b @serial \u30bf\u30b0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-doclet.MissingSerialDataTag=\u30af\u30e9\u30b9 {0} \u3067\u3001\u30e1\u30bd\u30c3\u30c9 {1} \u306b @serialData \u30bf\u30b0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-doclet.Interfaces=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.Exceptions=\u4f8b\u5916
-doclet.Errors=\u30a8\u30e9\u30fc
-doclet.Classes=\u30af\u30e9\u30b9
-doclet.Packages=\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.All_Classes=\u3059\u3079\u3066\u306e\u30af\u30e9\u30b9
-doclet.Members=\u30e1\u30f3\u30d0
-doclet.None=\u306a\u3057
-doclet.CLASSES=\u30af\u30e9\u30b9
-doclet.MEMBERS=\u30e1\u30f3\u30d0
-doclet.NONE=\u306a\u3057
-doclet.Inner_Classes_Inherited_From_Class=\u30af\u30e9\u30b9 {0} \u304b\u3089\u7d99\u627f\u3057\u305f\u5185\u90e8\u30af\u30e9\u30b9
-doclet.Methods_Inherited_From_Class=\u30af\u30e9\u30b9 {0} \u304b\u3089\u7d99\u627f\u3057\u305f\u30e1\u30bd\u30c3\u30c9
-doclet.Methods_Inherited_From_Interface=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9 {0} \u304b\u3089\u7d99\u627f\u3057\u305f\u30e1\u30bd\u30c3\u30c9
-doclet.Fields_Inherited_From_Class=\u30af\u30e9\u30b9 {0} \u304b\u3089\u7d99\u627f\u3057\u305f\u30d5\u30a3\u30fc\u30eb\u30c9
-doclet.Serializable=Serializable
-doclet.Externalizable=Externalizable
-doclet.Class_0_implements_serializable=\u30af\u30e9\u30b9 {0} \u306f Serializable \u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002
-doclet.Serialized_Form=\u76f4\u5217\u5316\u3055\u308c\u305f\u5f62\u5f0f
-doclet.Serialized_Form_methods=\u76f4\u5217\u5316\u30e1\u30bd\u30c3\u30c9
-doclet.Serialized_Form_fields=\u76f4\u5217\u5316\u3055\u308c\u305f\u30d5\u30a3\u30fc\u30eb\u30c9
-doclet.Serialized_Form_class=\u76f4\u5217\u5316\u306e\u6982\u8981
-doclet.Serializable_no_customization=readObject \u30e1\u30bd\u30c3\u30c9\u3082 writeObject \u30e1\u30bd\u30c3\u30c9\u3082\u5ba3\u8a00\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
-doclet.Field_Detail=\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u8a73\u7d30
-doclet.Method_Detail=\u30e1\u30bd\u30c3\u30c9\u306e\u8a73\u7d30
-doclet.Constructor_Detail=\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u306e\u8a73\u7d30
-doclet.Deprecated=\u63a8\u5968\u3055\u308c\u306a\u3044 API
-doclet.Deprecated_class=\u3053\u306e\u30af\u30e9\u30b9\u306f\u63a8\u5968\u3055\u308c\u307e\u305b\u3093\u3002
-doclet.navDeprecated=\u63a8\u5968\u3055\u308c\u306a\u3044
-doclet.Deprecated_List=\u63a8\u5968\u3055\u308c\u306a\u3044\u3082\u306e\u306e\u30ea\u30b9\u30c8
-doclet.Window_Deprecated_List={0}: \u63a8\u5968\u3055\u308c\u306a\u3044\u3082\u306e\u306e\u30ea\u30b9\u30c8
-doclet.Note_0_is_deprecated=\u6ce8: {0} \u306f\u63a8\u5968\u3055\u308c\u307e\u305b\u3093\u3002
-doclet.Parameters=\u30d1\u30e9\u30e1\u30fc\u30bf: 
-doclet.Returns=\u623b\u308a\u5024: 
-doclet.SerialData=\u76f4\u5217\u30c7\u30fc\u30bf: 
-doclet.Throws=\u4f8b\u5916: 
-doclet.Overrides=\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9: 
-doclet.in_class=\u30af\u30e9\u30b9 {1} \u5185\u306e {0}
-doclet.Generating_0={0} \u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059...
-doclet.0_Fields_and_Methods=&quot;{0}&quot; \u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u30e1\u30bd\u30c3\u30c9
-doclet.Index_of_Fields_and_Methods=\u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u30e1\u30bd\u30c3\u30c9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-doclet.Static_variable_in={0} \u306b\u304a\u3051\u308b static \u5909\u6570
-doclet.Variable_in={0} \u306b\u304a\u3051\u308b \u5909\u6570
-doclet.Constructor_for={0} \u306e\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf
-doclet.Static_method_in={0} \u306b\u304a\u3051\u308b static \u30e1\u30bd\u30c3\u30c9
-doclet.Method_in={0} \u306b\u304a\u3051\u308b \u30e1\u30bd\u30c3\u30c9
-doclet.throws=\u30b9\u30ed\u30fc
-doclet.package=\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.destination_directory_not_found_0=\u8ee2\u9001\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea {0} \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-doclet.MalformedURL=\u4e0d\u6b63\u306a URL: {0}
-doclet.File_error=\u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u8fbc\u307f\u30a8\u30e9\u30fc: {0}
-doclet.URL_error=URL \u53d6\u308a\u51fa\u3057\u30a8\u30e9\u30fc: {0}
-doclet.Method_Summary=\u30e1\u30bd\u30c3\u30c9\u306e\u6982\u8981
-doclet.No_Package_Comment_File=\u30d1\u30c3\u30b1\u30fc\u30b8 {0} \u306e  Package.Comment \u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-doclet.No_Source_For_Class=\u30af\u30e9\u30b9 {0} \u306e\u30bd\u30fc\u30b9\u60c5\u5831\u304c\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-doclet.see.class_or_package_not_found=@see \u30bf\u30b0\u306b\u30af\u30e9\u30b9\u307e\u305f\u306f\u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093: {0}
-doclet.see.malformed_tag=\u4e0d\u6b63\u306a @see \u30bf\u30b0: {0}
-doclet.Inherited_API_Summary=\u7d99\u627f\u3055\u308c\u305f API \u306e\u6982\u8981
-doclet.Deprecated_API=\u63a8\u5968\u3055\u308c\u306a\u3044 API
-doclet.Deprecated_Classes=\u63a8\u5968\u3055\u308c\u306a\u3044\u30af\u30e9\u30b9
-doclet.Deprecated_Interfaces=\u63a8\u5968\u3055\u308c\u306a\u3044\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.Deprecated_Exceptions=\u63a8\u5968\u3055\u308c\u306a\u3044\u4f8b\u5916
-doclet.Deprecated_Errors=\u63a8\u5968\u3055\u308c\u306a\u3044\u30a8\u30e9\u30fc
-doclet.Deprecated_Fields=\u63a8\u5968\u3055\u308c\u306a\u3044\u30d5\u30a3\u30fc\u30eb\u30c9
-doclet.Deprecated_Constructors=\u63a8\u5968\u3055\u308c\u306a\u3044\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf
-doclet.Deprecated_Methods=\u63a8\u5968\u3055\u308c\u306a\u3044\u30e1\u30bd\u30c3\u30c9
-doclet.Frame_Output=\u30d5\u30ec\u30fc\u30e0\u51fa\u529b
-doclet.Docs_generated_by_Javadoc=\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f javadoc \u3067\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-doclet.Generated_Docs_Untitled=\u751f\u6210\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8 (\u30bf\u30a4\u30c8\u30eb\u306a\u3057)
-doclet.Blank=\u30d6\u30e9\u30f3\u30af
-doclet.Other_Packages=\u305d\u306e\u4ed6\u306e\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.Package_Description=\u30d1\u30c3\u30b1\u30fc\u30b8 {0} \u306e\u8aac\u660e
-doclet.Description=\u8aac\u660e
-doclet.Specified_By=\u5b9a\u7fa9: 
-doclet.in_interface=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9 {1} \u5185\u306e {0}
-doclet.Subclasses=\u76f4\u63a5\u8a8d\u8b58\u3055\u308c\u308b\u30b5\u30d6\u30af\u30e9\u30b9: 
-doclet.Subinterfaces=\u3059\u3079\u3066\u8a8d\u8b58\u3055\u308c\u308b\u30b5\u30d6\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9: 
-doclet.Implementing_Classes=\u3059\u3079\u3066\u8a8d\u8b58\u3055\u308c\u308b\u30af\u30e9\u30b9\u306e\u5b9f\u88c5: 
-doclet.also=\u540c\u69d8\u306b
-doclet.Option=\u30aa\u30d7\u30b7\u30e7\u30f3
-doclet.Or=\u307e\u305f\u306f
-doclet.Frames=\u30d5\u30ec\u30fc\u30e0\u3042\u308a
-doclet.FRAMES=\u30d5\u30ec\u30fc\u30e0\u3042\u308a
-doclet.NO_FRAMES=\u30d5\u30ec\u30fc\u30e0\u306a\u3057
-doclet.Package_Hierarchies=\u30d1\u30c3\u30b1\u30fc\u30b8\u968e\u5c64: 
-doclet.Hierarchy_For_Package=\u30d1\u30c3\u30b1\u30fc\u30b8 {0} \u306e\u968e\u5c64
-doclet.Source_Code=\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9: 
-doclet.Help=\u30d8\u30eb\u30d7
-doclet.Hierarchy_For_All_Packages=\u3059\u3079\u3066\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u968e\u5c64
-doclet.Cannot_handle_no_packages=\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002
-doclet.Frame_Alert=\u30d5\u30ec\u30fc\u30e0\u95a2\u9023\u306e\u8b66\u544a
-doclet.Overview-Member-Frame=\u6982\u8981\u30e1\u30f3\u30d0\u30d5\u30ec\u30fc\u30e0
-doclet.Frame_Warning_Message=\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u30d5\u30ec\u30fc\u30e0\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u4f5c\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u30d5\u30ec\u30fc\u30e0\u3092\u8868\u793a\u3067\u304d\u306a\u3044 Web \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u5834\u5408\u306b\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
-doclet.Non_Frame_Version=\u30d5\u30ec\u30fc\u30e0\u306a\u3057\u306e\u30d0\u30fc\u30b8\u30e7\u30f3
-doclet.Frame_Version=\u30d5\u30ec\u30fc\u30e0\u3042\u308a\u306e\u30d0\u30fc\u30b8\u30e7\u30f3
-doclet.Link_To=\u30ea\u30f3\u30af\u5148
-doclet.Description_Copied_From_Interface=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u8a18\u8ff0: 
-doclet.Description_From_Class=\u30af\u30e9\u30b9\u306e\u8a18\u8ff0: 
-doclet.Copying_File_0_To_Dir_1=\u30d5\u30a1\u30a4\u30eb {0} \u3092\u30c7\u30a3\u30ec\u30af\u30c8\u30ea {1} \u306b\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059...
-doclet.Copying_File_0_To_File_1=\u30d5\u30a1\u30a4\u30eb {0} \u3092\u30d5\u30a1\u30a4\u30eb {1} \u306b\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059...
-doclet.Standard_doclet_invoked=\u6a19\u6e96\u306e doclet \u304c\u8d77\u52d5\u3055\u308c\u307e\u3057\u305f...
-doclet.No_Public_Classes_To_Document=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u751f\u6210\u3059\u308b public \u307e\u305f\u306f protected \u30af\u30e9\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-doclet.Interfaces_Italic=\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9 (\u30a4\u30bf\u30ea\u30c3\u30af) 
-doclet.Help_title=API \u30d8\u30eb\u30d7
-doclet.Window_Help_title={0}: API \u30d8\u30eb\u30d7
-doclet.Help_line_1=API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u7de8\u6210\u65b9\u6cd5
-doclet.Help_line_2=\u3053\u306e API (Application Programming Interface) \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u306f\u3001\u6b21\u306b\u8aac\u660e\u3059\u308b\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306b\u3042\u308b\u9805\u76ee\u306b\u5bfe\u5fdc\u3059\u308b\u30da\u30fc\u30b8\u304c\u542b\u307e\u308c\u307e\u3059\u3002
-doclet.Help_line_3={0} \u30da\u30fc\u30b8\u306f API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30d5\u30ed\u30f3\u30c8\u30da\u30fc\u30b8\u3067\u3001\u5404\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u6982\u8981\u3092\u542b\u3080\u5168\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u4e00\u89a7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u4e00\u9023\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u6982\u8981\u8aac\u660e\u3082\u8868\u793a\u3055\u308c\u307e\u3059\u3002
-doclet.Help_line_4=\u5404\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u3001\u305d\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30af\u30e9\u30b9\u3068\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3078\u306e\u30ea\u30f3\u30af\u3092\u542b\u3080\u30da\u30fc\u30b8\u3092\u6301\u3061\u307e\u3059\u3002\u3053\u306e\u30da\u30fc\u30b8\u306f 4 \u3064\u306e\u30ab\u30c6\u30b4\u30ea\u3067\u69cb\u6210\u3055\u308c\u307e\u3059: 
-doclet.Help_line_5=\u30af\u30e9\u30b9\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.Help_line_6=\u5404\u30af\u30e9\u30b9\u3001\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3001\u5185\u90e8\u30af\u30e9\u30b9\u3001\u304a\u3088\u3073\u5185\u90e8\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306f\u500b\u5225\u306e\u30da\u30fc\u30b8\u3092\u6301\u3061\u307e\u3059\u3002\u5404\u30da\u30fc\u30b8\u306b\u306f\u6b21\u306e\u3088\u3046\u306b\u3001\u30af\u30e9\u30b9\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u8aac\u660e\u3068\u3001\u6982\u8981\u30c6\u30fc\u30d6\u30eb\u3001\u304a\u3088\u3073\u30e1\u30f3\u30d0\u306e\u8a73\u7d30\u8aac\u660e\u304c\u542b\u307e\u308c\u307e\u3059: 
-doclet.Help_line_7=\u30af\u30e9\u30b9\u968e\u5c64\u8868\u793a
-doclet.Help_line_8=\u76f4\u63a5\u30b5\u30d6\u30af\u30e9\u30b9
-doclet.Help_line_9=\u3059\u3079\u3066\u8a8d\u8b58\u3055\u308c\u308b\u30b5\u30d6\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.Help_line_10=\u3059\u3079\u3066\u8a8d\u8b58\u3055\u308c\u308b\u5b9f\u88c5\u30af\u30e9\u30b9
-doclet.Help_line_11=\u30af\u30e9\u30b9\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u5ba3\u8a00
-doclet.Help_line_12=\u30af\u30e9\u30b9\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u8a18\u8ff0
-doclet.Help_line_13=\u5404\u6982\u8981\u9805\u76ee\u306b\u306f\u3001\u305d\u306e\u9805\u76ee\u306e\u8a73\u7d30\u8aac\u660e\u306e\u4e2d\u304b\u3089 1 \u884c\u76ee\u306e\u6587\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u8a73\u7d30\u8aac\u660e\u306f\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306b\u73fe\u308f\u308c\u308b\u9806\u306b\u4e26\u3073\u307e\u3059\u304c\u3001\u6982\u8981\u9805\u76ee\u306f\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8\u9806\u306b\u4e26\u3073\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u3063\u3066\u3001\u30d7\u30ed\u30b0\u30e9\u30de\u304c\u8a2d\u5b9a\u3057\u305f\u8ad6\u7406\u7684\u306a\u30b0\u30eb\u30fc\u30d7\u5206\u3051\u304c\u4fdd\u6301\u3055\u308c\u307e\u3059\u3002
-doclet.Help_line_14=\u4f7f\u7528
-doclet.Help_line_15=\u5404\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316\u3055\u308c\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u3001\u30af\u30e9\u30b9\u3001\u304a\u3088\u3073\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306f\u305d\u308c\u305e\u308c [\u4f7f\u7528] \u30da\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30da\u30fc\u30b8\u306b\u306f\u3001\u3069\u306e\u3088\u3046\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3001\u30af\u30e9\u30b9\u3001\u30e1\u30bd\u30c3\u30c9\u3001\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3001\u304a\u3088\u3073\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u3001\u7279\u5b9a\u306e\u30af\u30e9\u30b9\u307e\u305f\u306f\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u4e00\u90e8\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u304b\u304c\u8a18\u8ff0\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u30af\u30e9\u30b9 A \u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9 A \u306e\u5834\u5408\u3001\u305d\u306e [\u4f7f\u7528] \
-\u30da\u30fc\u30b8\u306b\u306f\u3001A \u306e\u30b5\u30d6\u30af\u30e9\u30b9\u3001A \u3068\u3057\u3066\u5ba3\u8a00\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u3001A \u3092\u8fd4\u3059\u30e1\u30bd\u30c3\u30c9\u3001\u304a\u3088\u3073\u3001\u578b A \u3092\u6301\u3064\u30e1\u30bd\u30c3\u30c9\u3068\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u304c\u542b\u307e\u308c\u307e\u3059\u3002\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u3001\u307e\u305a\u305d\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3001\u30af\u30e9\u30b9\u3001\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306b\u79fb\u52d5\u3057\u3001\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306e [\u4f7f\u7528] \u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-doclet.Help_line_16=\u30c4\u30ea\u30fc (\u30af\u30e9\u30b9\u968e\u5c64)
-doclet.Help_line_17_with_tree_link=\u3059\u3079\u3066\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u306f {0} \u30da\u30fc\u30b8\u304c\u3042\u308a\u3001\u3055\u3089\u306b\u5404\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u968e\u5c64\u304c\u3042\u308a\u307e\u3059\u3002\u5404\u968e\u5c64\u30da\u30fc\u30b8\u306f\u3001\u30af\u30e9\u30b9\u306e\u30ea\u30b9\u30c8\u3068\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u30ea\u30b9\u30c8\u3092\u542b\u307f\u307e\u3059\u3002\u30af\u30e9\u30b9\u306f <code>java.lang.Object</code> \u3092\u958b\u59cb\u70b9\u3068\u3059\u308b\u7d99\u627f\u69cb\u9020\u3067\u7de8\u6210\u3055\u308c\u307e\u3059\u3002\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306f\u3001<code>java.lang.Object</code> \u304b\u3089\u306f\u7d99\u627f\u3057\u307e\u305b\u3093\u3002
-doclet.Help_line_18=\u6982\u8981\u30da\u30fc\u30b8\u3092\u8868\u793a\u3057\u3066\u3044\u308b\u3068\u304d\u306b [\u30c4\u30ea\u30fc] \u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u5168\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u968e\u5c64\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
-doclet.Help_line_19=\u7279\u5b9a\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3001\u30af\u30e9\u30b9\u3001\u307e\u305f\u306f\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3092\u8868\u793a\u3057\u3066\u3044\u308b\u3068\u304d\u306b [\u30c4\u30ea\u30fc] \u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u8a72\u5f53\u3059\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u3060\u3051\u306e\u968e\u5c64\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
-doclet.Help_line_20_with_deprecated_api_link={0} \u30da\u30fc\u30b8\u306f\u3001\u3059\u3079\u3066\u306e\u63a8\u5968\u3055\u308c\u306a\u3044 API \u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u63a8\u5968\u3055\u308c\u306a\u3044 API \u3068\u306f\u3001\u6a5f\u80fd\u6539\u5584\u306a\u3069\u306b\u3088\u3063\u3066\u4f7f\u7528\u3092\u304a\u52e7\u3081\u3067\u304d\u306a\u304f\u306a\u3063\u305f API \u306e\u3053\u3068\u3067\u3001\u901a\u5e38\u306f\u305d\u308c\u306b\u4ee3\u308f\u308b API \u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u63a8\u5968\u3055\u308c\u306a\u3044 API \u306f\u4eca\u5f8c\u306e\u5b9f\u88c5\u3067\u524a\u9664\u3055\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
-doclet.Help_line_21=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-doclet.Help_line_22={0} \u306b\u306f\u3001\u3059\u3079\u3066\u306e\u30af\u30e9\u30b9\u3001\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3001\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3001\u30e1\u30bd\u30c3\u30c9\u3001\u304a\u3088\u3073\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8\u9806\u306e\u30ea\u30b9\u30c8\u304c\u542b\u307e\u308c\u307e\u3059\u3002
-doclet.Help_line_23=\u524d/\u6b21
-doclet.Help_line_24=\u3053\u308c\u3089\u306e\u30ea\u30f3\u30af\u306b\u3088\u308a\u3001\u524d\u307e\u305f\u306f\u6b21\u306e\u30af\u30e9\u30b9\u3001\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3001\u30d1\u30c3\u30b1\u30fc\u30b8\u3001\u307e\u305f\u306f\u95a2\u9023\u30da\u30fc\u30b8\u3078\u79fb\u52d5\u3067\u304d\u307e\u3059\u3002
-doclet.Help_line_25=\u30d5\u30ec\u30fc\u30e0\u3042\u308a/\u30d5\u30ec\u30fc\u30e0\u306a\u3057
-doclet.Help_line_26=\u3053\u308c\u3089\u306e\u30ea\u30f3\u30af\u306f HTML \u30d5\u30ec\u30fc\u30e0\u3092\u8868\u793a\u3057\u305f\u308a\u96a0\u3057\u305f\u308a\u3057\u307e\u3059\u3002\u3059\u3079\u3066\u306e\u30da\u30fc\u30b8\u306f\u30d5\u30ec\u30fc\u30e0\u3042\u308a\u3067\u3082\u3001\u30d5\u30ec\u30fc\u30e0\u306a\u3057\u3067\u3082\u8868\u793a\u3067\u304d\u307e\u3059\u3002
-doclet.Help_line_27=\u76f4\u5217\u5316\u53ef\u80fd\u3001\u307e\u305f\u306f\u5916\u90e8\u5316\u53ef\u80fd\u306a\u5404\u30af\u30e9\u30b9\u306f\u3001\u76f4\u5217\u5316\u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u30e1\u30bd\u30c3\u30c9\u306e\u8a18\u8ff0\u3092\u542b\u307f\u307e\u3059\u3002\u3053\u306e\u60c5\u5831\u306f\u3001API \u3092\u4f7f\u7528\u3059\u308b\u958b\u767a\u8005\u3067\u306f\u306a\u304f\u3001\u518d\u5b9f\u88c5\u306e\u62c5\u5f53\u8005\u306b\u5f79\u7acb\u3061\u307e\u3059\u3002\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306b\u30ea\u30f3\u30af\u304c\u306a\u3044\u5834\u5408\u3001\u76f4\u5217\u5316\u3055\u308c\u305f\u30af\u30e9\u30b9\u306b\u79fb\u52d5\u3057\u3066\u3001\u30af\u30e9\u30b9\u8a18\u8ff0\u306e [\u95a2\u9023\u9805\u76ee] \u30bb\u30af\u30b7\u30e7\u30f3\u306b\u3042\u308b [\u76f4\u5217\u5316\u3055\u308c\u305f\u5f62\u5f0f] \u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u3053\u306e\u60c5\u5831\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002
-doclet.Help_line_28=\u3053\u306e\u30d8\u30eb\u30d7\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u6a19\u6e96\u306e doclet \u306b\u3088\u3063\u3066\u751f\u6210\u3055\u308c\u305f API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u9069\u7528\u3055\u308c\u307e\u3059\u3002
-doclet.The= 
-doclet.Style_line_1=javadoc \u30b9\u30bf\u30a4\u30eb\u30b7\u30fc\u30c8
-doclet.Style_line_2=\u8272\u3084\u30d5\u30a9\u30f3\u30c8\u306a\u3069\u306e\u30b9\u30bf\u30a4\u30eb\u5c5e\u6027\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u3092\u4e0a\u66f8\u304d\u3059\u308b\u306b\u306f\u3001\u3053\u3053\u3067\u5b9a\u7fa9\u3057\u307e\u3059\u3002
-doclet.Style_line_3=\u30da\u30fc\u30b8\u306e\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u306e\u8272
-doclet.Style_line_4=\u30c6\u30fc\u30d6\u30eb\u306e\u8272
-doclet.Style_line_5=\u6fc3\u3044\u85e4\u8272
-doclet.Style_line_6=\u8584\u3044\u85e4\u8272
-doclet.Style_line_7=\u767d
-doclet.Style_line_8=\u5de6\u5074\u306e\u30d5\u30ec\u30fc\u30e0\u306e\u30ea\u30b9\u30c8\u306b\u4f7f\u7528\u3059\u308b\u30d5\u30a9\u30f3\u30c8
-doclet.Style_line_9=\u30d5\u30ec\u30fc\u30e0\u306b\u304a\u3051\u308b\u3001\u3088\u308a\u5c0f\u3055\u3044\u3001\u30bb\u30ea\u30d5\u306a\u3057\u30d5\u30d5\u30a9\u30f3\u30c8\u306e\u4f8b
-doclet.Style_line_10=\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306e\u30d5\u30a9\u30f3\u30c8\u3068\u8272
-doclet.Style_line_11=\u6fc3\u3044\u9752
-doclet.ClassUse_Packages.that.use.0={0} \u3092\u4f7f\u7528\u3059\u308b\u30d1\u30c3\u30b1\u30fc\u30b8
-doclet.ClassUse_Uses.of.0.in.1={1} \u306b\u304a\u3051\u308b {0} \u306e\u4f7f\u7528\u65b9\u6cd5
-doclet.ClassUse_Classes.in.0.used.by.1={1} \u306b\u3088\u308a\u4f7f\u7528\u3055\u308c\u308b {0} \u306b\u304a\u3051\u308b\u30af\u30e9\u30b9
-doclet.ClassUse_Subclass={1} \u306b\u304a\u3051\u308b {0} \u306e\u30b5\u30d6\u30af\u30e9\u30b9
-doclet.ClassUse_Subinterface={1} \u306b\u304a\u3051\u308b {0} \u306e\u30b5\u30d6\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9
-doclet.ClassUse_ImplementingClass={0} \u3092\u5b9f\u88c5\u3059\u308b {1} \u306b\u304a\u3051\u308b\u30af\u30e9\u30b9
-doclet.ClassUse_Field={0} \u3068\u3057\u3066\u5ba3\u8a00\u3055\u308c\u308b {1} \u306b\u304a\u3051\u308b\u30d5\u30a3\u30fc\u30eb\u30c9
-doclet.ClassUse_MethodReturn={0} \u3092\u8fd4\u3059 {1} \u306b\u304a\u3051\u308b\u30e1\u30bd\u30c3\u30c9
-doclet.ClassUse_MethodArgs=\u578b {0} \u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6301\u3064 {1} \u306b\u304a\u3051\u308b\u30e1\u30bd\u30c3\u30c9
-doclet.ClassUse_MethodThrows={0} \u3092\u30b9\u30ed\u30fc\u3059\u308b {1} \u306b\u304a\u3051\u308b\u30e1\u30bd\u30c3\u30c9
-doclet.ClassUse_ConstructorArgs=\u578b {0} \u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u6301\u3064 {1} \u306b\u304a\u3051\u308b\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf
-doclet.ClassUse_ConstructorThrows={0} \u3092\u30b9\u30ed\u30fc\u3059\u308b {1} \u306b\u304a\u3051\u308b\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf
-doclet.ClassUse_No.usage.of.0={0} \u3092\u4f7f\u7528\u3057\u306a\u3044
-doclet.Window_ClassUse_Header={0}: {1} {2} \u306e\u4f7f\u7528
-doclet.ClassUse_Title={0}<br>{1} \u306e\u4f7f\u7528
-doclet.navClassUse=\u4f7f\u7528
-doclet.link_option_twice=\u5916\u90e8 URL \u30ea\u30f3\u30af\u30aa\u30d7\u30b7\u30e7\u30f3 (link \u307e\u305f\u306f linkoffline) \u304c 2 \u56de\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059
-doclet.Error_in_packagelist=-group \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u4f7f\u7528\u65b9\u6cd5\u306e\u30a8\u30e9\u30fc: {0} {1} 
-doclet.Groupname_already_used=-group \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u304a\u3044\u3066\u3001\u3059\u3067\u306b\u30b0\u30eb\u30fc\u30d7\u540d\u304c\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059: {0}
-doclet.Same_package_name_used=\u30d1\u30c3\u30b1\u30fc\u30b8\u540d\u5f62\u5f0f\u304c 2 \u56de\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059: {0}
-doclet.Packages_File_line_1=\u30d5\u30ed\u30f3\u30c8\u30da\u30fc\u30b8\u306e\u540d\u524d\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002
-doclet.Packages_File_line_2=\u6b21\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044:
-doclet.usage=\u6a19\u6e96\u306e doclet \u306b\u3088\u308a\u63d0\u4f9b\u3055\u308c\u308b\u3082\u306e:\n\
-  -d <directory>            \u51fa\u529b\u30d5\u30a1\u30a4\u30eb\u306e\u8ee2\u9001\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\n\
-  -use                      \u30af\u30e9\u30b9\u3068\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u4f7f\u7528\u65b9\u6cd5\u30da\u30fc\u30b8\u3092\u4f5c\u6210\u3059\u308b\n\
-  -version                  @version \u30d1\u30e9\u30b0\u30e9\u30d5\u3092\u542b\u3081\u308b\n\
-  -author                   @author \u30d1\u30e9\u30b0\u30e9\u30d5\u3092\u542b\u3081\u308b\n\
-  -splitindex               1 \u5b57\u3054\u3068\u306b 1 \u30d5\u30a1\u30a4\u30eb\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u5206\u5272\u3059\u308b\n\
-  -windowtitle <text>       \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u7528\u306e\u30d6\u30e9\u30a6\u30b6\u30a6\u30a3\u30f3\u30c9\u30a6\u30bf\u30a4\u30c8\u30eb\n\
-  -doctitle <html-code>     \u30d1\u30c3\u30b1\u30fc\u30b8\u30a4\u30f3\u30c7\u30c3\u30af\u30b9 (\u521d\u671f) \u30da\u30fc\u30b8\u306b\u30bf\u30a4\u30c8\u30eb\u3092\u542b\u3081\u308b\n\
-  -header <html-code>       \u5404\u30da\u30fc\u30b8\u306b\u30d8\u30c3\u30c0\u3092\u542b\u3081\u308b\n\
-  -footer <html-code>       \u5404\u30da\u30fc\u30b8\u306b\u30d5\u30c3\u30bf\u3092\u542b\u3081\u308b\n\
-  -bottom <html-code>       \u5404\u30da\u30fc\u30b8\u306b\u4e0b\u90e8\u30c6\u30ad\u30b9\u30c8\u3092\u542b\u3081\u308b\n\
-  -link <url>               <url> \u306b javadoc \u51fa\u529b\u3078\u306e\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3059\u308b\n\
-  -linkoffline <url> <url2> <url2> \u306b\u3042\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u30ea\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u3066 <url> \u306e docs \u306b\u30ea\u30f3\u30af\u3059\u308b\n\
-  -group <name> <p1>:<p2>.. \u6982\u8981\u30da\u30fc\u30b8\u306b\u304a\u3044\u3066\u6307\u5b9a\u3059\u308b\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b\n\
-  -nodeprecated             @deprecated \u60c5\u5831\u3092\u9664\u5916\u3059\u308b\n\
-  -nodeprecatedlist         \u63a8\u5968\u3055\u308c\u306a\u3044\u30ea\u30b9\u30c8\u3092\u751f\u6210\u3057\u306a\u3044\n\
-  -notree                   \u30af\u30e9\u30b9\u968e\u5c64\u3092\u751f\u6210\u3057\u306a\u3044\n\
-  -noindex                  \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u751f\u6210\u3057\u306a\u3044\n\
-  -nohelp                   \u30d8\u30eb\u30d7\u30ea\u30f3\u30af\u3092\u751f\u6210\u3057\u306a\u3044\n\
-  -nonavbar                 \u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u3092\u751f\u6210\u3057\u306a\u3044\n\
-  -helpfile <file>          \u30d8\u30eb\u30d7\u30ea\u30f3\u30af\u306e\u30ea\u30f3\u30af\u5148\u30d5\u30a1\u30a4\u30eb\u3092\u542b\u3081\u308b\n\
-  -stylesheetfile <path>    \u751f\u6210\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30b9\u30bf\u30a4\u30eb\u5909\u66f4\u7528\u30d5\u30a1\u30a4\u30eb\n\
-  -docencoding <name>       \u51fa\u529b\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u540d
-doclet.xusage=Special  \u30aa\u30d7\u30b7\u30e7\u30f3:\n\
-  -Xnodate                  \u51fa\u529b\u306b\u751f\u6210\u65e5\u3092\u542b\u3081\u306a\u3044
